Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二)
asp.netcore程序发布到centos(含安装部署netcore)--最佳实践(一)
接上一篇
3. nginx配置反向代理
3.1 cnetos 安装nginx
首先,我们需要在服务器上安装nginx。
3.1.1:添加nginx存储库
要添加centos 7 epel仓库,请打开终端并使用以下命令:
sudo yum install epel-release
epel的全称叫 extra packages for enterprise linux 。epel是由 fedora 社区打造,为 rhel 及衍生发行版如 centos、scientific linux 等提供高质量软件包的项目。装上了 epel之后,就相当于添加了一个第三方源。
如果你知道rpmfusion.org的话,拿 rpmfusion 做比较还是很恰当的,rpmfusion 主要为桌面发行版提供大量rpm包,而epel则为服务器版本提供大量的rpm包,而且大多数rpm包在官方 repository 中是找不到的。
另外一个特点是绝大多数rpm包要比官方repository 的rpm包版本要来得新,比如我前些日子在centos上安装的php,rhel为了稳定性还在延用5.1.6版,我记得这是去年上半年的版本,而php 的最新版本已经到5.3.2,如果在php5.1.6的基础上安装phpmyadmin,则会提示php版本过低,这时候,epel中提供的较新php rpm就能很方便的派上用场了。
3.1.2:安装nginx
现在nginx存储库已经安装在您的服务器上,请使用以下yum命令安装nginx:
sudo yum install nginx
3.1.3:启动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地址http://10.100.150.17来验证nginx是否成功运行。
如果能看到nginx的默认转发网页则说明一切正常。
如果拒绝访问,考虑服务器80端口是否开放。可尝试通过下面两条命令开放80端口、重启防火墙使修改即时生效。
firewall-cmd --zone=public --add-port=80/tcp --permanent systemctl restart firewalld
3.1.4 设置nginx开机启动
避免开机需要手动开启nginx,可以通过如下快捷命令把nginx配置成系统服务,并设置为开机启动:
systemctl enable nginx #设置开机启动
其他命令:
systemctl disable nginx #禁止开机启动 systemctl status nginx #查看运行状态 systemctl restart nginx #重启服务
3.1.5 修改nginx配置文件
首先,拿到nginx的默认配置文件/etc/nginx/nginx.conf,把默认80端口转发配置server节点。
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; } }
保存后执行命令nginx -s reload重启nginx即可。
在本地浏览器*问服务器地址,运行结果:
502 bad gateway
这个问题是由于selinux保护机制所导致,我们需要将nginx添加至selinux的白名单。执行命令:
yum install policycoreutils-python sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -m mynginx sudo semodule -i mynginx.pp
再次访问,运行结果正常,可以看到,访问的接口成功返回数据,证明nginx已经完成对我们部署应用程序的转发。
4.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文档。
4.1安装supervisor
联网状态下,官方推荐首选安装方法是使用easy_install,它是setuptools(python包管理工具)的一个功能。所以先执行如下命令安装 setuptools:
yum install python-setuptools
请更换root用户,执行如下命令安装supervisor:
easy_install supervisor
4.2 配置supervisor
运行supervisord服务的时候,需要指定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)
所以,先通过如下命令创建目录,以便让supervisor成功加载默认配置:
mkdir /etc/supervisor
加载目录有了,然后通过echo_supervisord_conf程序(用来生成初始配置文件)来初始化一个配置文件:
echo_supervisord_conf > /etc/supervisor/supervisord.conf
打开supervisord.conf文件,可以看到echo_supervisord_conf已经帮我们初始化好了一个样例配置,我们需要简单修改一下。
尾部找到如下文本片段:
;[include] ;files = relative/directory/*.ini
改为:
[include] files = conf.d/*.conf
即,把注释去除、设置/etc/supervisor/conf.d为supervisor进程配置文件加载目录。
这样,supervisor会自动加载该目录下.conf后缀的文件作为共同服务配置。supervisor管理的每个进程单独写一个配置文件放在该目录下,supervisord.conf配置文件中保留公共配置。
创建进程配置加载目录:
mkdir /etc/supervisor/conf.d
接下来就需要为我们已经部署的asp .net core程序的宿主进程创建一个进程配置文件netcore.conf,保存并上传到/etc/supervisor/conf.d目录。
配置文件netcore.conf内容如下:
[program:scorpio.webapi] ;自定义进程名称 command=dotnet scorpio.webapi.dll ;程序启动命令 directory=/home/wwwroot/scorpio ;命令执行的目录 autostart=true ;在supervisord启动时,程序是否启动 autorestart=true ;程序退出后自动重启 startretries=5 ;启动失败自动重试次数,默认是3 startsecs=1 ;自动重启间隔 user=root ;设置启动进程的用户,默认是root priority=999 ;进程启动优先级,默认999,值小的优先启动 stderr_logfile=/var/log/scorpio.webapi.err.log ;标准错误日志 stdout_logfile=/var/log/scorpio.webapi.out.log ;标准输出日志 environment=aspnetcore_environment=production ;进程环境变量 stopsignal=int ;请求停止时用来杀死程序的信号
启动supervisor服务,命令如下:
supervisord -c /etc/supervisor/supervisord.conf
这时,在会发现我们部署的网站程序不在shell中通过dotnet xxx.dll启动,同样可以访问。
4.3设置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则表示设置成功,也可重启服务器验证。
其它linux发行版开机启动脚本 user-contributed os init scripts for supervisor
supervisorctl管理进程
supervisor服务启动后,受其管理的进程会在后台运行。可以通过supervisorctl客户端管理进程。
输入如下命令进入supervisorctl交互终端,按ctrl+c键退出:
supervisorctl
输入help查询帮助:
supervisor> help default commands (type help <topic>): ===================================== 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 <name> stop a process stop <gname>:* stop all processes in a group stop <name> <name> stop multiple processes or groups stop all stop all processes
如何启动、停止、重启进程等命令,我这里就不在记录,大家自行查找吧。
除此之外,supervisor还提供了web管理界面用来管理进程,如何配置启动请参考官方文档。
至此,我们已经完成了asp.net core应用程序在centos7服务器上的部署。 上一篇有朋友说用jexus更简单方便,下一篇也尝试一下。