script

# linux 环境部署

本教程基于 Cenos8.2+.NET sdk 6.0.300+Nginx+Mysql+jenkins 进行演示。

# 环境搭建

# cenos 环境

# 升级系统

运行命令 dnf update -y,对系统基础包进行升级。

# 更换 yum 源

Centos8 于 2021 年年底停止了服务,大家再在使用 yum 源安装时候,出现下面错误“错误:Failed to download metadata for repo ‘AppStream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist”。

解决方法如下:

1)、进入 yum 的 repos 目录

cd /etc/yum.repos.d/

2)、修改所有的 CentOS 文件内容

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*

sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

3)、更新 yum 源为阿里镜像

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum clean all
yum makecache

4)、yum 安装测试是否可以 yum 安装

yum install wget –y

# 安装 Nginx

1、我们要安装最新的稳定版本,我们需要自定义 Ngnix 包源。我们要安装最新的稳定版本,需要自定义 Ngnix 包源。

2,运行命令 vim /etc/yum.repos.d/nginx.repo,创建一个 nginx.repo 文件。

3,进入 vim 编辑界面后,先按 i 键,切换到编辑模式,复制下面的内容粘贴进去。

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

然后按 ESC 键回到查看模式,再输入:wq 然后回车

4,执行 nginx 安装命令 dnf install nginx -y,安装完成后,你应该能看到版本是 1.20.1

5,启动 Nginx 服务命令 systemctl start nginx

然后浏览器访问服务器 IP,应该就可以看到 Nginx 的默认页,如果你访问不起,看看云服务器平台是否给该服务器开放了 80 端口。

# 安装 dotnet

1,执行命令 dnf info dotnet,查看软件包里.NET 的版本,我看到的是 5.0.208,由于 cenos 的停服,不会自带 net6.0 的环境。 你看到这篇教程时,微软已经发布 6.0.300 的版本,那么直接运行 dnf install dotnet 不会直接安装 6.0。

2,手工去找.NET 6 运行时安装包地址。打开https://dotnet.microsoft.com/download/dotnet/6.0,找到.NET 6.0 SDK (v6.0.300)下,Linux 下,Binaries 下的 X64,直接会新窗口下载,不让他下载,直接获取下载地址,我获取到的是: https://download.visualstudio.microsoft.com/download/pr/dc930bff-ef3d-4f6f-8799-6eb60390f5b4/1efee2a8ea0180c94aff8f15eb3af981/dotnet-sdk-6.0.300-linux-x64.tar.gz

3,运行命令 curl -Lo dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/dc930bff-ef3d-4f6f-8799-6eb60390f5b4/1efee2a8ea0180c94aff8f15eb3af981/dotnet-sdk-6.0.300-linux-x64.tar.gz

4,运行命令 mkdir dotnet

5,运行命令 tar -C dotnet -xf dotnet.tar.gz

6,运行命令 export DOTNET_ROOT=~/dotnet #您安装 dotnet 的路径

7,运行命令 export PATH=\$PATH:~/dotnet #您安装 dotnet 的路径

8,运行命令 dotnet --info,看看是不是成功安装了 6.0.300,如下图

说明

# 安装 mysql8

# 安装

使用最新的包管理器安装 MySQL

dnf install @mysql

# 配置

设置不区分大小写

MySQL8.0 及以上版本, 只能在初始化的时候设置 lower-case-table-names 参数, 无法通过修改 my.cnf 实现( 在 my.cnf 中增加配置会报错 )

然后编辑 vim /etc/my.cnf.d/mysql-server.cnf 文件,末尾添加 lower_case_table_names=1

说明

# 启动

安装完成后,运行以下命令来启动 MySQL 服务并使它在启动时自动启动:

systemctl enable --now mysqld

检查 MySQL 服务器是否正在运行,请输入:

systemctl status mysqld

# 添加密码及安全设置

运行 mysql_secure_installation 脚本,该脚本执行一些与安全性相关的操作并设置 MySQL 根密码:

mysql_secure_installation

步骤如下:

1、要求你配置 VALIDATE PASSWORD component(验证密码组件): 输入 y ,回车进入该配置

选择密码验证策略等级, 我这里选择 0 (low),回车

输入新密码两次

确认是否继续使用提供的密码?输入 y ,回车

移除匿名用户? 输入 y ,回车

不允许 root 远程登陆? 我这里需要远程登陆,所以输入 n ,回车

2、移除 test 数据库? 输入 y ,回车

3、重新载入权限表? 输入 y ,回车

说明

# 配置远程登陆

如果需要设置 root 账户远程登陆,上一步骤中,不允许 root 远程登陆?这一步需要设为 n。

接下来本机登录 MySQL,将 root 用户的 host 字段设为'%',意为接受 root 所有 IP 地址的登录请求: 本机登录 MySQL:

mysql -uroot -p<上面步骤中设置的密码>

回车后即可登录,接下来终端变成了mysql>开头:

接着继续执行 mysql 语句,将将 root 用户的 host 字段设为'%':

use mysql;
update user set host='%' where user='root';
flush privileges;

设置完成后输入 exit 退出 mysql,回到终端 shell 界面,接着开启系统防火墙的 3306 端口:

说明

sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload

# 常用命令

1、启动 systemctl start mysqld 2、暂停

systemctl stop mysqld

3、重启

systemctl restart mysqld

# 安装 Redis

# 下载 Redis

进入官网找到下载地址https://redis.io/download(opens new window) 右键 Download 按钮,选择复制链接。 进入到 Xshell 控制台(默认当前是 root 根目录),输入 wget 将上面复制的下载链接粘贴上,如下命令:

wget http://download.redis.io/releases/redis-7.0.0.tar.gz

等待下载完成。

# 解压

解压

下载完成后需要将压缩文件解压,输入以下命令解压到当前目录

tar -zvxf redis-7.0.0.tar.gz

解压后在根目录上输入 ls 列出所有目录会发现与下载 redis 之前多了一个 redis-7.0.0.tar.gz 文件和 redis-7.0.0 的目录

# 移动 redis 目录

一般都会将 redis 目录放置到 /usr/local/redis 目录,所以这里输入下面命令将目前在/root 目录下的 redis-7.0.0 文件夹更改目录,同时更改文件夹名称为 redis。

mv /root/redis-5.0.7 /usr/local/redis

cd 到/usr/local 目录下输入 ls 命令可以查询到当前目录已经多了一个 redis 子目录,同时/root 目录下已经没有 redis-7.0.0 文件夹

编译

cd 到/usr/local/redis 目录,输入命令 make 执行编译命令,接下来控制台会输出各种编译过程中输出的内容。

make

最终运行结果如下: redis编译结果

# 安装

输入以下命令

make PREFIX=/usr/local/redis install

这里多了一个关键字 PREFIX=这个关键字的作用是编译的时候用于指定程序存放的路径。比如我们现在就是指定了 redis 必须存放在/usr/local/redis目录。假设不添加该关键字 Linux 会将可执行文件存放在/usr/local/bin目录,

库文件会存放在/usr/local/lib目录。配置文件会存放在/usr/local/etc目录。其他的资源文件会存放在usr/local/share目录。这里指定号目录也方便后续的卸载,后续直接rm -rf /usr/local/redis即可删除 redis。

执行结果如下图:

redis安装结果

# 启动 redis

根据上面的操作已经将 redis 安装完成了。在目录/usr/local/redis 输入下面命令启动 redis

./bin/redis-server& ./redis.conf

上面的启动方式是采取后台进程方式,下面是采取显示启动方式(如在配置文件设置了 daemonize 属性为 yes 则跟后台进程方式启动其实一样)。

./bin/redis-server ./redis.conf

redis启动结果 两种方式区别无非是有无带符号&的区别。 redis-server 后面是配置文件,目的是根据该配置文件的配置启动 redis 服务。redis.conf 配置文件允许自定义多个配置文件,通过启动时指定读取哪个即可。

# redis 操作命令

1、采取查看进程方式

ps -aux | grep redis

2、采取端口监听查看方式

netstat -lanp | grep 6379

3、redis-cli

redis-cli 是连接本地 redis 服务的一个命令,通过该命令后可以既然怒 redis 的脚本控制台。如下图

redis启动结果

关闭运行中的 Redis 服务

输入 redis-cli 进入控制台后输入命令 shutdown 即可关闭运行中的 Redis 服务了。

远程连接不上问题 如下图,已经开放了 Redis 服务的 ip 不为 127.0.0.1,理论上远程客户端应该可以连接了,而且云服务器的端口号也在安全组里开放了。

# 安装守护进程工具

# 什么是守护进程?

在 linux 或者 unix 操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在 linux 中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。

此处的创建守护进程,是指发布在 Linux 上 asp.net core 程序的 dotnet xxx.dll 命令的宿主进程创建一个守护进程。 在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。

原因有两点:

1、它是微软官方文档推荐的,降低学习成本。

2、它并不一定是最好的,但一定是文档最全的。

# Supervisor 介绍

Supervisor 是采用 Python(2.4+) 开发的,它是一个允许用户管理 基于 Unix 系统进程的 Client/Server 系统,提供了大量功能来实现对进程的管理。

官方文档:http://supervisord.org/(opens new window)

# Supervisor 安装

1、首先安装 EPEL 源

dnf install epel-release

2、安装 supervisor

dnf install supervisor

3、配置文件目录

/etc/supervisord.conf /etc/supervisord.d

5.加入守护配置

cd /etc/supervisord.d
touch app.ini

6.启动 supervisor

systemctl start supervisord
systemctl status supervisord
systemctl enable supervisord

# supervisorctl 命令

supervisorctl status 查看进程运行状态

supervisorctl start 进程名 启动进程

supervisorctl stop 进程名 关闭进程

supervisorctl restart 进程名 重启进程

supervisorctl update 重新载入配置文件

supervisorctl shutdown 关闭 supervisord

supervisorctl clear 进程名 清空进程日志

supervisorctl 进入到交互模式下。使用 help 查看所有命令。

start stop restart + all 表示启动,关闭,重启所有进程。

# Supervisor UI 管理台

supervisor 默认给我们提供了一个图形界面来供我们管理进程和任务,在 macOS 中默认配置的有,但是在 Linux 中我们需要手动开启一下。 打开位于/etc/supervisor/supervisord.conf 文件,添加 inet_http_server 节点

说明 修改完成后重启 supervisor

systemctl stop supervisord
systemctl start supervisord

然后就可以通过界面来查看运行的进程了:

说明

# 部署 YueboCore

# webapi 接口部署

# supervisord 配置

1、创建 vim /etc/supervisord.d/yueboncoreapi.ini 将一下内容复制进去

[program:WebTest]
command=/root/dotnet/dotnet Yuebon.WebApi.dll --urls="http://localhost:5002"  #要执行的命令
directory=/wwwroot/webtest  #命令执行的目录
environment=ASPNETCORE__ENVIRONMENT=Production #环境变量
user=root  #进程执行的用户身份
stopsignal=INT
autostart=true #是否自动启动
autorestart=true #是否自动重启
startsecs=1 #自动重启间隔
stderr_logfile=/var/log/WebTest.err.log #标准错误日志
stdout_logfile=/var/log/WebTest.out.log #标准输出日志

2、启动 systemctl start supervisord

# nginx 配置

1、创建 vim /etc/nginx/conf.d/yueboncoreapi.conf

server{
    listen 80;
    server_name netcoreapi.v.yuebon.com;#绑定你的域名或ip
    location / {
        proxy_pass http://localhost:5002;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        index index.html index.htm;
        try_files $uri $uri/ /index.html;
   }
}

2、执行nginx -t 检查是否有错误 3、无误执行nginx -s reload

绑定的域名解析好或者通过 ip 地址就可访问接口了。

# 前端部署

# 打包

当项目开发完毕,只需要运行一行命令就可以打包你的应用

# 打包正式环境
npm run build:prod

# 打包预发布环境
npm run build:stage

构建打包成功之后,会在根目录生成 dist 文件夹,里面就是构建打包好的文件,通常是 .js 、.css、index.html 等静态文件。

通常情况下 dist 文件夹的静态文件发布到你的 nginx 或者静态服务器即可,其中的 index.html 是后台服务的入口页面。

# nginx 配置

1、创建 vim /etc/nginx/conf.d/netvue.conf

server{
    listen 80;
    server_name netvue.v.yuebon.com;#绑定你的域名或ip
    location / {
        root /var/wwwroot/netvue.v.yuebon.com;#静态文件路径
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        index index.html index.htm;
        try_files $uri $uri/ /index.html;#路由重写,防止刷新404
   }
}

2、执行nginx -t 检查是否有错误 3、无误执行nginx -s reload

# 常见问题

1、验证码不显示问题 提示“the type initializer for 'Gdip' threw an exception. ”

解决方法:

.NET 6 及以后由于官方不再支持在非 Windows 环境使用 libgdiplus,需要单独开启运行时环境支持

除了需要安装 libgdiplus 还需要在xxxx.runtimeconfig.json配置文件中新增System.Drawing.EnableUnixSupport

{
  "runtimeOptions": {
    "configProperties": {
      "System.Drawing.EnableUnixSupport": true
    }
  }
}
最后更新时间: 2/26/2023, 7:54:30 AM