看了几篇大牛写的关于 Linux 部署 ASP.NET Core 程序的文章,今天来实战演练一下。2017 年最后一个工作日,提前预祝大家伙元旦快乐。不扯淡,直接进入正题。您有任何问题请在评论区留言。
网上看了一下,Linux 云服务器还挺贵的,那就只好先用 VMware 虚拟机搭建个吧。这里我选装的 Linux 系统版本的是 CentOS,Linux 系统众多发行版之一,相信各位园友也不陌生。
软件版本信息如下:
虚拟机安装、系统镜像配置过程,大家参考网上教程应该没啥问题,我这不再赘述。
成功安装并登陆 CentOS 7 Minimal 系统后,发现无法上网,后来搜索找到原因:CentOS 7 Minimal 默认没有启动网络配置。
接下来就通过 vi 命令编辑网卡配置文件 ifcfg-ens33(其他版本名称可能略有不同,但路径一致)。具体命令如下:
- vi / etc / sysconfig / network - scripts / ifcfg - ens33
将 ONBOOT=no 改为 ONBOOT=yes,设置随系统开机运行。然后: wq 强制保存并退出编辑文件即可。
最后,需要重启一下网络服务。命令如下:
- service network restart
目前应该可以上网了,可以尝试用命令 ping www.baidu.com 来检查下网络是否通畅。
如上图,可以接收响应,证明网络畅通。反之,证明你的网络还是不通,就需要考虑其他原因了。
暂时还没有安装 VMware Tools,直接在虚拟机中编 (复) 写(制)命令多有不便,这里可以通过连接工具 PuTTY 在 Window 系统中连接虚拟机中的 CentOS 系统,连接服务器也同样适用。
软件截图:
选择 SSH 连接协议,输入 CentOS 系统 IP 地址,点击【Open】按钮连接。输入系统用户名密码即可登录系统。
问:怎么知道虚拟机中 CentOS 系统的 IP 地址呢?
答:可以通过 ifconfig 命令来获取系统的 IP 地址。说明一点,因为这里我选的是 CentOS 7 Minimal 最小化安装,需要联网后先执行命令
下载网络工具包,然后才能使用 ifconfig 命令。
- yum install net-tools
Linux 各个发行版如何安装. NET Core SDK,微软官方已经给出了标准答案,我这里就把在 CentOS 上的安装方法做一个简要说明。
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.1.3 #最新版本请关注官网
两步即可完成. NET Core SDK 在 CentOS7 系统下的安装,最后可执行一下命令 dotnet --version,如果正常输出版本号则说明安装没有出现问题。
Linux 其他发行版安装. NET Core SDK 教程请参见官方教程 Get started with .NET in 10 minutes 。
下面就尝试把我用 ASP.NET Core web API 开发的一个接口网站部署到我们已经安装. NET SDK 的 CentOS 系统(下文简称服务器)中。
程序发布过程省略,把编译后的程序发布到了本地 F:\wwwroot\Scorpio 文件夹。
然后借助 FTP 工具 FileZilla 把程序文件传输到服务器
文件夹。
- /home/wwwroot/scorpio
上传截图:
上传完毕后,需要先通过 cd 命令进入网站根目录
,再输入如下命令启动网站程序:
- /home/wwwroot/scorpio/
- dotnet Scorpio.WebApi.dll
如果在任意非站点根目录,通过下面这种方式直接运行,程序会抛异常,不知是程序原因还是其他原因。
- dotnet / home / wwwroot / scorpio / Scorpio.WebApi.dll
如果你可以看到如下界面则表示程序启动成功。
Nginx 是一个高性能的 Web 服务器软件。这是一个比 Apache HTTP Server 更加灵活和轻量级的程序。
我们的网站程序启动的端口是
,可以借助 Nginx 把程序
- 5000
端口映射到
- 5000
端口。
- 80
首先,我们需要在服务器上安装 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 是否成功运行。
- http://192.168.83.128
如果能看到 Nginx 的默认转发网页则说明一切正常。如下截图:
如果拒绝访问,考虑服务器
端口是否开放。可尝试通过下面两条命令开放
- 80
端口、重启防火墙使修改即时生效。
- 80
- firewall-cmd --zone=public --add-port=80/tcp --permanent
- systemctl restart firewalld
避免开机需要手动开启 Nginx,可以通过如下快捷命令把 Nginx 配置成系统服务,并设置为开机启动:
- systemctl enable nginx#设置开机启动
其他命令:
- systemctl disable nginx #禁止开机启动
- systemctl status nginx #查看运行状态
- systemctl restart nginx #重启服务
首先,拿到 Nginx 的默认配置文件
,把默认
- /etc/nginx/nginx.conf
端口转发配置 server 节点用 #符注释掉。
- 80
然后,我们新建一个配置文件 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;
- }
- }
保存并上传到 Nginx 的配置加载目录 / etc/nginx/conf.d,最后执行命令 nginx -s reload 重启 Nginx 即可。
在本地浏览器上访问服务器地址,运行结果如下:
这个问题是由于 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 已经完成对我们部署应用程序的转发。
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 文档 。
联网状态下,官方推荐首选安装方法是使用 easy_install,它是 setuptools (Python 包管理工具)的一个功能。所以先执行如下命令安装 setuptools:
- yum install python - setuptools
请更换 root 用户,执行如下命令安装 Supervisor:
- easy_install 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
即,把注释去除、设置
为 Supervisor 进程配置文件加载目录。
- /etc/supervisor/conf.d
这样,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 启动,同样可以访问。
首先为 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
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 服务器上的部署。
来源: https://www.cnblogs.com/esofar/p/8043792.html