CentOS 下部署 .NET Core Web项目
2020-03-02 本文已影响0人
Paulo21
服务器安装配置
安装 .NET Core 运行时
运行以下命令
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install aspnetcore-runtime-3.1 // WEB 服务 需要安装 aspdotnet
参考文档 https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-package-manager-centos7
发布你的项目
- 使用VS发布你的项目
- 然后使用FTP将项目文件上传到项目目录
启动你的 .NET Core 项目
切换至项目目录,运行你的主dll文件
dotnet webapp.dll
至此,你的项目应该可以通过 http://your_ip:5000 访问了(如果需要,可能还要开放 5000 端口)。
设置服务
为了避免每次需要执行 dotnet 命令开启 web 服务,我们来创建一个服务。
cd /etc/systemd/system
# 创建服务
touch webapp.service
# 更改服务文件的内容
vi webapp.service
内容如下:
[Unit]
Description=Oms.SCU Application running on CentOS
[Service]
ExecStart=/usr/bin/dotnet /你的目录/你的dll.dll --basePath /你的目录 --contentRoot /你的目录
Restart=always
RestartSec=5
SyslogIdentifier=oms.scu
User=root
Environment=ASPNETCORE_ENVIRONMENT=Development
[Install]
WantedBy=multi-user.target
然后就可以运行下面的命令管理你的服务了
service webapp start
service webapp stop
service webapp restart
设置为开机自启动
systemctl enable webapp
安装Apache
安装 Apache ,配置反向代理,将服务映射到其他端口(此步按需进行)。
sudo yum -y install httpd mod_ssl
在/etc/httpd/conf.d/
目录内创建一个配置文件,如webapp.conf
内容如下:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ErrorLog logs/webapp-error.log
CustomLog logs/webapp-access.log common
</VirtualHost>
作用是将监听本地的 80 端口并将请求转发至 5000 端口。5000 为默认的 dotnet 项目启动的端口。
然后重启 apache
service httpd restart
此时,你的项目应该可以通过 http://your_ip 访问了(如果有问题注意检查一下防火墙是否开启80端口)。
如果需要监听其他端口,如 8080 ,则在 webapp.conf
内更改:
Listen 8080
<VirtualHost *:8080>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ErrorLog logs/webapp-error.log
CustomLog logs/webapp-access.log common
</VirtualHost>
将 Apache 设置为开机自启动
systemctl enable httpd
503 Service Unavailable
可能出现如下问题:
http://ip:5000 可正常访问
但通过 Apache 代理之后无法访问,报错 503 Service Unavailable
经过查看 Apache log 发现如下错误:
[Thu Apr 02 15:14:45.481445 2020] [proxy:error] [pid 3065] (13)Permission denied: AH00957: HTTP: attempt to connect to 127.0.0.1:5000 (127.0.0.1) failed
[Thu Apr 02 15:14:45.481488 2020] [proxy:error] [pid 3065] AH00959: ap_proxy_connect_backend disabling worker for (127.0.0.1) for 60s
[Thu Apr 02 15:14:45.481493 2020] [proxy_http:error] [pid 3065] [client 192.168.9.1:54901] AH01114: HTTP: failed to make connection to backend: 127.0.0.1
原因是 httpd 默认被 SELinux 拦截,导致无法转发请求,使用以下命令查看设置:
getsebool -a | grep httpd
…………
httpd_can_network_connect --> off
…………
运行如下命令
setsebool -P httpd_can_network_connect 1
503 错误解决,访问正常。
SELinux 问题
SELinux 真的会给各种应用带来权限问题,导致部署可能出现各种奇怪及潜在的问题,个人建议关闭。
vim /etc/selinux/config
# 将原本的 SELINUX=enforcing 改为 disbaled
SELINUX=disabled
然后重启服务器即可