Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解

安装.NetCore运行环境

Step1:安装 dotnet
要开始安装 .NET,您需要注册 Microsoft 签名密钥并添加 Microsoft 产品提要。每台机器只需要做一次。 打开命令提示符并运行以下命令:

sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'

Step2:安装 .NET SDK
更新可用于安装的产品,安装 .NET 所需的组件,然后安装 .NET SDK。
在命令提示符下,运行以下命令:

sudo yum update
sudo yum install libunwind libicu
sudo yum install dotnet-sdk-2.2

Step3:测试.NET SDK安装成功
输入指令

dotnet --version

出现类版本信息,就说明安成功
   

部署.Net Core项目到Linux服务器

Step1:修改程序配置信息
配置方法:详见后续的配置文件说明

Step2:上传部署文件
把生成的部署程序包上传到Linux服务器下,建议放在根目录的app文件夹下。

Step3:上传部署文件
启动项目时首先通过cd命令进入到项目部署的文件夹下,执行启动命令:

dotnet entConsole.dll --urls=http://*:5000

端口默认为5000,这样写有一个好处,程序可以强制监听5000端口的请求,避免了nginx内部的错误重定向问题。

Step4:测试网站安装是否成功
在浏览器中输入网址,网址为项目部署的IP地址,如:http://127.0.0.1/ ,或是你本机的IP地址,此时网站应该已经可以正式访问了

Nginx反向代理(根据需求,选择性配置)

Step1:添加 Nginx 存储库
要添加 CentOS 7 EPEL 仓库,打开终端并使用以下命令:

sudo yum install epel-release

Step2:安装 Nginx
现在 Nginx 存储库已经安装在服务器上,请使用以下yum命令安装 Nginx:

sudo yum install nginx

Step3:启动 Nginx
Nginx 启动,要运行 Nginx,请输入: 

sudo systemctl start nginx

如果您正在运行防火墙,请运行以下命令以允许 HTTP 和 HTTPS 通信:

sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd –reload

此时,可以在本机的浏览器中访问服务器的 IP 地址来验证 Nginx 是否成功运行。
如果能看到 Nginx 的默认转发网页则说明一切正常。如下截图:
Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解_第1张图片

如果拒绝访问,考虑服务器80端口是否开放。可尝试通过下面两条命令开放80端口、重启防火墙使修改即时生效。

firewall-cmd --zone=public --add-port=80/tcp --permanent
systemctl restart firewalld

修改 Nginx 配置文件

此处有一个大坑,如果配置反向代理后没有成功,建议参看我的另一篇文章,避坑指南:Linux下如何配置Nginx反向代理(避坑指南)

Step1:注释掉默认配置 

首先,拿到 Nginx 的默认配置文件/etc/nginx/nginx.conf,把默认80端口转发配置server节点用#符注释掉。
Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解_第2张图片

Step2:新建一个配置文件 
然后,我们新建一个目录/etc/nginx/conf.d,再目录下新建配置文件netcore.conf,文件内容如下:

server {
    listen 80;
    location / {
        proxy_pass http://localhost:5000;
        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;
    }
}

PS:当然也可以配置更简单的版本,如下:

Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解_第3张图片

保存并上传到 Nginx 的配置加载目录/etc/nginx/conf.d

Step3:重新启动Nginx 
最后执行命令:

nginx -s reload

重新加载 Nginx 配置,使其生效。访问链接Nginx部署的主机IP地址,http://10.17.XX.XXX/ 发现已经nginx已经可以正常访问了

Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解_第4张图片
Step4:异常处理 
如果还是出现如下502 Bad Gateway问题:

Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解_第5张图片

可能是没有安装好,也可能是由于系统中有异常的nginx正在运行。首先,我们尝试重新启动Nginx
进入 /usr/local/nginx/sbin/ 目录。  


通过如下命令启动nginx服务,如果系统中的nginx已经启动,则会报错:

./nginx 

Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解_第6张图片

此时执行命令

ps -ef | grep nginx

看系统中正在运行的nginx进程

如果有nginx:master process 的主进程,就杀掉,可以通过  kill 杀掉nginx的主进程 (master为主进程):

kill -QUIT 主进程号(上面ps命令看到的带master字样的进程号)

 
此时nginx进程已经杀掉了,我们在安装路径下,再重新执行启动命令,启动一下

./nginx 

 Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解_第7张图片
此时nginx已经重新启动起来了
再次访问链接Nginx部署的主机IP地址,http://10.17.XX.XXX/ 发现已经nginx已经可以正常访问了

Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解_第8张图片

安装和配置Supervisor(根据需求,选择性配置)

Supervisor 是用 Python 开发的 Linux/Unix 系统下的一个进程管理工具。它可以使进程脱离终端,变为后台守护进程(daemon)。实时监控进程状态,异常退出时能自动重启。

Supervisor 不支持任何版本的 Window 系统;仅支持在 Python2.4 或更高版本,但不能在任何版本的 Python 3 下工作。

其主要组成部分:
supervisord:Supervisor 的守护进程服务,用于接收进程管理命令;
supervisorctl:Supervisor 命令行工具,用于和守护进程通信,发送管理进程的指令;
Web Server:Web 端进程管理工具,提供与 supervisorctl 类似功能,管理进程;
XML-RPC Interface:提供 XML-RPC 接口,请参阅 XML-RPC API文档。

Step1:安装Supervisor

联网状态下,官方推荐首选安装方法是使用easy_install,它是setuptools(Python 包管理工具)的一个功能。所以先执行如下命令安装 setuptools:

yum install python-setuptools

更换root用户,执行如下命令安装 Supervisor:

easy_install supervisor

默认会安装到以下目录:
$CWD/supervisord.conf  #$CWD表示运行 supervisord 程序的目录
$CWD/etc/supervisord.conf
/etc/supervisord.conf
/etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
../etc/supervisord.conf (Relative to the executable)
../supervisord.conf (Relative to the executable)

Step2:验证安装成功 
输入命令:

echo_supervisord_conf 

 会输出一些模板信息,如下:

Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解_第9张图片
Step3:创建 Supervisor配置文件目录和配置文件模板
先通过如下命令创建目录,这目录是为了让 Supervisor 加载默认配置用的目录:

mkdir /etc/supervisor

加载目录有了,然后通过echo_supervisord_conf程序(用来生成初始配置文件)来初始化一个配置文件:

echo_supervisord_conf > /etc/supervisor/supervisord.conf

上面这行代码相当于创建了一个配置信息模板,现在我们需要把模板中的内容修改一下。

Step4:配置自己的 Supervisor信息和目录路径
打开/etc/supervisor/路径下的supervisord.conf文件。尾部找到如下文本片段:

;[include]
;files = relative/directory/*.ini

改为:

[include]
files = conf.d/*.conf

修改后,supervisord加载时就会自动加载/etc/supervisor/conf.d目录下,所有以.conf结尾的配置文件,因此如果需要supervisord守护多个进程,则在/etc/supervisor/conf.d文件夹中配置多个以.conf结尾的配置文件即可

路径加好后,就要创建加载配置文件的目录:

mkdir /etc/supervisor/conf.d

Step5:创建一个或多个自己程序的配置文件
在/etc/supervisor/conf.d路径下,输入创建文件命令(也可以手动创建.conf文件,个人建议手动创建,本人用命令创建的文本启动的时候系统不能识别编码,后来改成手动创建成功了): 

touch entConsole.conf

配置文件entConsole.conf内容如下:

[program:entConsole]                               ;自定义进程名称
command= dotnet entConsole.dll --urls="http://*:5000"     ;程序启动命令
directory= /app/entConsole                        ;命令执行的目录,即项目部署路径
autostart=true                                    ;在Supervisord启动时,程序是否启动
autorestart=true                                  ;程序退出后自动重启
startretries=5                                    ;启动失败自动重试次数,默认是3
startsecs=1                                      ;自动重启间隔
user=root                                       ;设置启动进程的用户,默认是root
priority=999                                     ;进程启动优先级,值小的优先启动
stderr_logfile=/var/log/WebApplication1.err.log         ;标准错误日志
stdout_logfile=/var/log/WebApplication1.out.log      ;标准输出日志
environment=ASPNETCORE_ENVIRONMENT=Production   ;进程环境变量
stopsignal=INT                                    ;请求停止时用来杀死程序的信号

有几个要注意的地方,第二行程序启动命令和第三行命令执行目录要根据自己的情况修改。我部署的是网站,端口是5000,所以启动就用:dotnet entConsole.dll --urls="http://*:5000。我的网站部署路径是/app/entConsole。根据自己的实际情况修改文件就好了。

如果要守护多个进程,就在/etc/supervisor/conf.d路径下添加多个XXX.conf文件,比如输入创建新文件命令: 

touch entService.conf

配置文件entService.conf内容如下:

[program: entService]                                ;自定义进程名称
command= dotnet entService.dll                  ;程序启动命令
directory= /app/entService                        ;命令执行的目录,即项目部署路径
autostart=true                                    ;在Supervisord启动时,程序是否启动
autorestart=true                                 ;程序退出后自动重启
startretries=5                                    ;启动失败自动重试次数,默认是3
startsecs=1                                      ;自动重启间隔
user=root                                       ;设置启动进程的用户,默认是root
priority=999                                     ;进程启动优先级,值小的优先启动
stderr_logfile=/var/log/WebApplication1.err.log      ;标准错误日志
stdout_logfile=/var/log/WebApplication1.out.log      ;标准输出日志
environment=ASPNETCORE_ENVIRONMENT=Production   ;进程环境变量
stopsignal=INT                                   ;请求停止时用来杀死程序的信号

Step6:启动 Supervisor
启动 Supervisor 服务,命令如下:

supervisord -c /etc/supervisor/supervisord.conf

每次修改配置文件后,都要执行重启命令,这里要注意,因为没有环境变量,这种命令都要在supervisor安装目录里执行。比如本文的etc/supervisor目录下,否则会报找不到文件错误,其实就是找不到supervisor执行文件了:

supervisorctl reload

Stept7: 验证启动成功
输入命令:

ps -ef | grep dotnet 

看到两个进程都正常执行

杀掉一个进程实验一下:

Kill 12820

再次执行:

ps -ef | grep dotnet

发现杀掉的进程依然存在,但是进程号变了,说明supervisorctl是正常的

Stept8: 设置 Supervisor 开机启动

首先为 Supervisor 新建一个启动服务脚本supervisor.service,然后保存并上传至服务器/usr/lib/systemd/system/目录。

脚本内容如下:
 supervisord service for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target


设置开启启动:

systemctl enable supervisor

验证是否成功:

systemctl is-enabled supervisor

如果输出enabled则表示设置成功,也可重启服务器验证。

如果Supervisor部署过程中出问题了,直接重头再来一遍就好

Supervisorctl 管理进程

Supervisor 服务启动后,受其管理的进程会在后台运行。可以通过supervisorctl客户端管理进程。

输入如下命令进入supervisorctl交互终端,按Ctrl+C键退出:

supervisorctl

输入help查询帮助:

supervisor> help

default commands (type help ):
=====================================
add    exit      open  reload  restart   start   tail
avail  fg        pid   remove  shutdown  status  update
clear  maintail  quit  reread  signal    stop    version

输入help ****查询详细命令,比如输入help stop:

supervisor> help stop

stop             Stop a process
stop :*          Stop all processes in a group
stop      Stop multiple processes or groups
stop all                Stop all processes

如何启动、停止、重启进程等命令,我这里就不在记录,大家自行查找吧。

至此,我们已经完成了 ASP.NET Core 应用程序在 CentOS7 服务器上的部署。

除此之外,Supervisor 还提供了 Web 管理界面用来管理进程。

在配置文件当中添加如下内容
[inet_http_server]
port=192.168.XX.XX:9001
username=admin
password=123456
然后访问http://192.168.XX.XX:9001/即可看到管理界面 

Linux服务器部署.Net Core + Nginx + Supervisor 项目过程详解_第10张图片

 

(参考链接)https://www.cnblogs.com/liuxiaoji/p/9907984.html

你可能感兴趣的:(小技术_C#,小技术_Linux)