使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序
本文在这篇文章上,经过自己的实践,做了补充。
安装 .NET Core SDK
微软官方文档 各个系统都有详细的教程。安装完成后输入dotnet --version
可以常看安装的版本,同时也可以证明有没有安装成功。
部署 ASP.NET Core 应用程序
下面就尝试把微软介绍“使用 ASP.NET Core 和 MongoDB 创建 Web API” 创建的Demo,部署到安装 .NET SDK 的 CentOS 系统(下文简称服务器)中。
服务器采用阿里云轻量应用服务器,系统CentOS7.3。
如何安装MongoDB请移步下面这篇文章。
[post id=1173]
然后借助 FTP 工具 WinSCP 把程序文件传输到服务器/home/publish
文件夹。
上传完毕后,需要先通过cd
命令进入网站根目录/home/publish
,再输入如下命令启动网站程序:
1 | dotnet BooksApi.dll |
如果你可以看到如下界面则表示程序启动成功。
但是这样项目是无法在后台自动运行的,需要设置进程守护。
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文档。
安装 Supervisor
联网状态下,官方推荐首选安装方法是使用easy_install
,它是setuptools(Python 包管理工具)的一个功能。所以先执行如下命令安装 setuptools:
1 | yum install python-setuptools |
请更换root
用户,执行如下命令安装 Supervisor:
1 | easy_install supervisor |
配置 Supervisor
运行supervisord
服务的时候,需要指定 Supervisor 配置文件,如果没有显示指定,默认会从以下目录中加载:
1 | $CWD/supervisord.conf #$CWD表示运行 supervisord 程序的目录 |
所以,先通过如下命令创建目录,以便让 Supervisor 成功加载默认配置:
1 | mkdir /etc/supervisor |
加载目录有了,然后通过echo_supervisord_conf
程序(用来生成初始配置文件)来初始化一个配置文件:
1 | echo_supervisord_conf > /etc/supervisor/supervisord.conf |
打开supervisord.conf
文件,可以看到echo_supervisord_conf
已经帮我们初始化好了一个样例配置,我们需要简单修改一下。
尾部找到如下文本片段:
1 | ;[include] |
改为:
1 | [include] |
即,把注释去除、设置/etc/supervisor/conf.d
为 Supervisor 进程配置文件加载目录。
这样,Supervisor 会自动加载该目录下.conf
后缀的文件作为共同服务配置。Supervisor 管理的每个进程单独写一个配置文件放在该目录下,supervisord.conf
配置文件中保留公共配置。
创建进程配置加载目录:
1 | mkdir /etc/supervisor/conf.d |
接下来就需要为我们已经部署的 ASP .NET Core 程序的宿主进程创建一个进程配置文件netcore.conf
,保存并上传到/etc/supervisor/conf.d
目录。
配置文件netcore.conf
内容如下:
1 | [program:Scorpio.WebApi] ;自定义进程名称 |
启动 Supervisor 服务,命令如下:
1 | supervisord -c /etc/supervisor/supervisord.conf |
这时,在会发现我们部署的网站程序不在 shell 中通过dotnet xxx.dll
启动,同样可以访问。
设置 Supervisor 开机启动
首先为 Supervisor 新建一个启动服务脚本supervisor.service
,然后保存并上传至服务器/usr/lib/systemd/system/
目录。
脚本内容如下:
1 | # supervisord service for systemd (CentOS 7.0+) |
设置开启启动:
1 | systemctl enable supervisor |
验证是否成功:
1 | systemctl is-enabled supervisor |
如果输出enabled
则表示设置成功,也可重启服务器验证。
其它 Linux 发行版开机启动脚本 User-contributed OS init scripts for Supervisor
Supervisorctl 管理进程
Supervisor 服务启动后,受其管理的进程会在后台运行。可以通过supervisorctl
客户端管理进程。
输入如下命令进入supervisorctl
交互终端,按Ctrl
+C
键退出:
1 | supervisorctl |
输入help
查询帮助:
1 | supervisor> help |
输入help ****
查询详细命令,比如输入help stop
:
1 | supervisor> help stop |
如何启动、停止、重启进程等命令,我这里就不在记录,大家自行查找吧。
除此之外,Supervisor 还提供了 Web 管理界面用来管理进程,如何配置启动请参考官方文档。
Nginx 配置反向代理
Nginx 是一个高性能的Web服务器软件。这是一个比 Apache HTTP Server 更加灵活和轻量级的程序。
我们的网站程序启动的端口是5000
,可以借助 Nginx 把程序5000
端口映射到80
端口。
安装 Nginx
首先,我们需要在服务器上安装 Nginx。
Step1:添加 Nginx 存储库
要添加 CentOS 7 EPEL 仓库,请打开终端并使用以下命令:
1 | sudo yum install epel-release |
Step2:安装 Nginx
现在 Nginx 存储库已经安装在您的服务器上,请使用以下yum
命令安装 Nginx:
1 | sudo yum install nginx |
Step3:启动 Nginx
Nginx 不会自行启动。要运行 Nginx,请输入:
1 | sudo systemctl start nginx |
如果您正在运行防火墙,请运行以下命令以允许 HTTP 和 HTTPS 通信:
1 | sudo firewall-cmd --permanent --zone=public --add-service=http |
此时,可以在本机的浏览器中访问服务器的 IP 地址http://ip
来验证 Nginx 是否成功运行。ip指你的服务器外网地址。
如果能看到 Nginx 的默认转发网页则说明一切正常。如下截图:
如果拒绝访问,考虑服务器80
端口是否开放。可尝试通过下面两条命令开放80
端口、重启防火墙使修改即时生效。
1 | firewall-cmd --zone=public --add-port=80/tcp --permanent |
设置 Nginx 开机启动
避免开机需要手动开启 Nginx,可以通过如下快捷命令把 Nginx 配置成系统服务,并设置为开机启动:
1 | systemctl enable nginx #设置开机启动 |
其他命令:
1 | systemctl disable nginx #禁止开机启动 |
修改 Nginx 配置文件
首先,拿到 Nginx 的默认配置文件/etc/nginx/nginx.conf
,把默认80
端口转发配置server
节点用#
符注释掉。
然后,我们新建一个配置文件netcore.conf
,内容如下:
1 | server { |
保存并上传到 Nginx 的配置加载目录/etc/nginx/conf.d
,最后执行命令nginx -s reload
重载 Nginx 配置,使其生效。
在本地浏览器上访问服务器地址,运行结果如下:
这个问题是由于 SELinux 保护机制所导致,我们需要将 Nginx 添加至 SELinux 的白名单。执行命令:
1 | yum install policycoreutils-python |
PS:如果执行命令时出现下列情况:
执行:
1 | sudo cat /var/log/audit/audit.log grep nginx grep denied audit2allow -M mynginx |
返回的是nothing to do
的话,说明项目还没有跑起来,需要先把项目跑起来,先去上一步设置守护进程。
执行 sudo cat /var/log/audit/audit.log grep nginx grep denied audit2allow -M mynginx
时出现:you must specify the -p option with the path to the policy file
请先检查SELinux是否被禁用掉了
在/etc/sysconfig下有一个SeLinux文件,使用记事本打开,更改其中的SELINUX项的值就可以了。
SELINUX=disable 禁用SeLinux
SELINUX=enforcing 使用SeLinux
重要:保存完后要重启 reboot
再次访问,运行结果如下:
可以看到,访问的接口成功返回数据,证明 Nginx 已经完成对我们部署应用程序的转发。
至此,我们已经完成了 ASP.NET Core 应用程序在 CentOS7 服务器上的部署。
参考文章: