CentOS 下部署 .NET Core Web项目

2020-03-02  本文已影响0人  Paulo21

服务器安装配置

参考 https://www.jianshu.com/p/e2f8a56af5e0

安装 .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

发布你的项目

  1. 使用VS发布你的项目
  2. 然后使用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

然后重启服务器即可

上一篇下一篇

猜你喜欢

热点阅读