centos 部署 asp.net core 应用程序 asp.net core
作为一个 Linux 新手,许多人向我鼓吹说 CentOS 多么强大,于是我就开始把一个演示程序发布到 CentOS,想试一下它到底有多强大。在此之前,我将同样的程序已经成功发布到了 Ubuntu,我觉得,既然已经有了前一次的成功经验,不论 CentOS 还是 Ubuntu 都是 Linux,道理应该差不多吧。但事实证明,还是有些差异的,某些在 CentOS 上频出的问题在 Ubuntu 上却没有,所以我的感觉是 Ubuntu 部署 Asp.net Core 程序更容易些。
过程很不顺利,但最终经过一天摸索已摸清个七八成,应用总算能运行了。
Asp.net Core 应用需要反向代理配合才能运行,IIS、Apache 和 Nginx 等 web 服务软件都可以作为它的反向代理。这里使用 Nginx 作为反向代理。
1. 安装. NET Core SDK。四个命令,依次执行:
sudo yum install libunwind libicu
curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?linkid=847103
sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
sudo ln -s /opt/dotnet/dotnet /usr/local/bin
2. 安装 nginx。
yum install nginx
3. 上传应用程序。使用工具不限,在 Windows 上可以用 MobaXterm,这个东西不错,既能登录系统,也能传送和下载文件,还可以可视化地浏览服务器上的目录、打开文件进行编辑。
4. 配置 nginx。打开 / etc/nginx/nginx.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;
}
此时,应用内部的 Kestrel 监听的端口是 5000,而外部用户访问应用仍然使用 80 端口。
注意找到 "user XXX;" 这句,"XXX" 可以为任何字串,这个东西要记住,稍后把. net Core 应用监听服务设置为系统服务时需要它。
5. 经过第 4 步配置后,进入应用程序所在目录,执行
dotnet app.dll(app.dll 是 asp.net core 应用程序发布后生成的文件,需要用你自己的应用名称替代 app.dll)
一切安好的话,此时应用应该可以访问了,打开浏览器去试一下。
到此为止,应用程序已经部署好了。但是,你发现了,有个命令窗口一直开着,它就是执行 dotnet xxxx.dll 那个窗口,如果这个窗口关闭了,那么应用程序也随即不能访问了。作为完美型的程序猿,肯定不希望这个窗口总趴在屏幕上,这时就用到了系统服务,让应用程序监听服务在系统启动时自动启动,省去了每次启动都需要再次执行 dotnet 命令去运行服务。
6. 将应用程序的监听服务设置为系统服务。这一步中,许多介绍部署. net core 应用的文章都使用一个叫 "Supervisor" 的东西,这个东西我不熟,当然,其实我对整个 Linux 就不熟,通过参考资料,我使用系统自带的 systemd(据说以前的版本没有这个东西,我用的是 CentOS 7)来制作守护进程。
在 / etc/systemd/system / 目录下建一个服务文件 xxxx.service(用自己的名称替换 xxxx), 然后打开,写入:
- [Unit]
- Description=应用描述
- [Service]
- WorkingDirectory=/sites/test_app #工作目录,合理配置
- #执行dotnet命令的地方,注意配置为自己机器上正确的dotnet所在路径及程序所在路径
- ExecStart=/usr/local/bin/dotnet /sites/test_app/WebApp.dll
- Restart=always
- RestartSec=10
- # 注意,这里User的值应该与第4步nginx.conf配置文件里user XXX的XXX相同。
- # 比如在nginx.conf中,有一句:user nginx;那么此处也为User的值就为nginx
- User=nginx
- Environment=ASPNETCORE_ENVIRONMENT=Production
- [Install]
- WantedBy=multi-user.target
上面 "#" 号后面的是注释,我加了些说明,实际使用时可以移除这些注释。
- 在这步中遇到个问题,一开始,在"ExecStart ……"后面有个注释,在执行
- systemctl enable xxxx.service
- 时老是报错。后来把注释移除,并且把这句后面的空格删除后就正常了。
7. 将服务设置为开机自启,这样每当机器重启就不需要再执行 dotnet 命令来启动应用程序监听了,那个碍眼的 dotnet 监听窗口也可以关闭了。
设置服务开机自启:
systemctl enable xxxx.service
启动服务:
systemctl start xxxx.service
查看服务状态:
systemctl status xxxx.service
如果服务没能正常启动,这个命令可以显示哪里出错。如果有错误,修改错误。
到此,部署完成,应该能访问应用了。
第二天,我想起了已经把监听服务设置成了系统服务,可以在重启后不需要执行 dotnet 命令,于是我就想测一测到底靠不靠谱,就把机器重启了。结果浏览器给我回馈了个 "Bad Gateway",真是不靠谱啊,说好的 Linux 强大呢?
我用 systemctl status 检查了服务,显示运行中,不是服务没启动,说明系统服务还是靠谱的。那怎么不能访问了呢?网上找了半天没找到想要的答案,突然想到,是不是 nginx 这玩意挂了,因为在安装、配置 nginx 时这货就曾经瘫过,使用 nginx -s reload 命令想重启一下 nginx,结果发现它提示 nginx.pid 文件出了问题。关于这个问题的解决办法,我在《Nginx 在 CentOS 中丢失 nginx.pid 文件的处理》中提到过。
在 Ubuntu 下部署与这个差不多,某些命令不一样。参考:https://docs.microsoft.com/zh-cn/aspnet/core/publishing/linuxproduction。
来源: http://www.bubuko.com/infodetail-2044828.html