Centos7 Nginx部署.Net Core with Supervisor

首先安装.NET Core Runtime:

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

安装.NET Runtime

sudo yum install aspnetcore-runtime-3.0 -y

安装完成后使用以下命令验证安装:

dotnet --info

显示以下内容表示安装成功:

  It was not possible to find any installed .NET Core SDKs
  Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
      https://aka.ms/dotnet-download

Host (useful for support):
  Version: 3.0.0
  Commit:  95a0a61858

.NET Core SDKs installed:
  No SDKs were found.

.NET Core runtimes installed:
  Microsoft.AspNetCore.App 3.0.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.0.0 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

这里我只安装了Runtime并没有安装开发使用的SDK,只需要保证能运行.net core项目就可以啦

下一步,使用VS2019创建一个.net core mvc项目,创建好后直接将演示内容发布(我这里直接发布成文件系统)

然后使用FTP工具将发布编译生成的文件全部复制到Centos 7上指定的目录,我这里是放在/etc/nginx/websites/coretest

使用使用命令定位到当前目录:

cd /etc/nginx/websites/coretest

然后在当前目录下运行dotnet CoreTest.dll命令以启动网站:

dotnet CoreTest.dll

运行结果如下:

 可以看出当前网站运行在5000端口

接下来我们使用nginx访问,直接在nginx上做个转发代理到5000端口就可以了

首先先安装好nginx后,在/etc/nginx/conf.d下面创建一个新的nginx配置文件,例如我的就叫coretest.conf,将内容设置如下:

server {
    listen       8080;
    server_name  localhost;
    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;
	proxy_set_header   X-Forwarded-For 
	proxy_add_x_forwarded_for;
	proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

这里我新建了一个8080端口,然后设置代理到5000端口

然后检查nginx配置文件:

nginx -t

然后重启nginx:

nginx -s reload

如果ngix -s reload 提示nginx: [error] invalid PID number "" in "/run/nginx.pid",解决方法:

#nginx.conf文件的路径可以从nginx -t的返回中找到
nginx -c /etc/nginx/nginx.conf
# 然后再执行
nginx -s reload

配置文件加好后,防火墙开放8080端口:

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

然后使用IP + 端口访问(8080):

http://192.168.100.131:8080/ ((lll¬ω¬) 我的是虚拟机。。。)

访问之后可能会出现502的错误:

如果访问显示“502 Bad Gateway”,可能是由于SELinux保护机制所导致,需要将nginx添加至SELinux的白名单。命令如下:

yum install policycoreutils-python -y
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
sudo semodule -i mynginx.pp

执行完命令后重新访问http://192.168.100.131:8080:

 访问成功啦~

配置进程守护(Supervisor)

在CentOS 7上,如果关闭终端,开启的进程就会关闭,导致程序无法访问

为了解决这个问题,就用到了Supervisor这个工具,Supervisor使用Python开发的,用于监听ASP.NET Core 应用程序的状况。在应用程序停止运行的时候立即重新启动。

Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
安装Supervisor
1、yum install python-setuptools -y
2、easy_install supervisor

配置Supervisor

创建supervisor文件夹,通过echo_supervisord_conf初始化配置文件

1、mkdir /etc/supervisor
2、echo_supervisord_conf > /etc/supervisor/supervisord.conf

修改新建的supervisord.conf配置信息,将最后面的

;files = relative/directory/*.ini

修改为:

[include]
files = /etc/supervisor/conf.d/*.ini

即去掉最后两行前面的“;”号。

为.Net Core 项目添加进程配置文件:

在/etc/supervisor/目录下创建名字为conf.d文件夹然后创建一个CoreTest.ini文件,内容如下:

[program:CoreTest]
command=dotnet CoreTest.dll ; 运行程序的命令
directory=/etc/nginx/websites/coretest/ ; 命令执行的目录
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/etc/nginx/websites/coretest/log/CoreTest.err.log ; 错误日志文件
stdout_logfile=/etc/nginx/websites/coretest/log/CoreTest.out.log ; 输出日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT

启动Supervisor服务: 

supervisord -c /etc/supervisor/supervisord.conf

启动服务后可以通过命令查看是否配置成功:

ps -ef | grep CoreTest.dll

如果看到以下内容,表示配置成功,就可以访问.Net Core项目了:

 配置Supervisor开机启动:

进入/usr/lib/systemd/system/目录,并创建supervisord.service文件,添加内容:

[Unit]
Description=Supervisor daemon
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target

使配置生效:

systemctl daemon-reload

设置服务开机启动:

systemctl enable supervisord

启动supervisor进程:

systemctl start supervisord

验证是否为开机启动:

systemctl is-enabled supervisord

 

 supervisor常用命令:

supervisorctl status    //查看所有任务状态
supervisorctl shutdown  //关闭所有任务
supervisorctl start|stop|restart all          //控制所有进程
supervisorctl start|stop|restart program_name //控制目标进程 
  • 参考与致谢:
    • https://www.cnblogs.com/zhuyuchao/p/11262666.html
    • https://www.jianshu.com/p/dc38b80727e4
原文地址:https://www.cnblogs.com/gme5/p/11775864.html