此次被要求出差在客户的服务器上部署我司产品,其中API需要部署在CentOS上,在经过了几天的实际踩坑和部署后诞生了这篇文章,希望能对需要采用同样方案部署的童鞋有所帮助,有疏漏错误之处请指出~ 此外,其他部署策略可以参考使用 Nginx 在 Linux 上托管 ASP.NET Core

部署 .NET Core Web Api

1. 更新yum repo

sudo yum update
sudo yum install libunwind libicu

2. 安装.NET Core SDK

# 添加 dotnet 包
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
sudo yum update
# 安装 SDK
sudo yum install dotnet-sdk-2.1

<!-- more -->

3. 上传 .NET Core 发布文件到对应目录

然后执行dotnet yourappname.dll运行API ![](./_image/2018-07-25 14-27-53.jpg)

关于FTP服务

图中只是演示不是实际情况,实际情况一般不会允许你用root账号来操作服务器,那么就需要搭建FTP服务,可以参考文章下面的在CentOS上搭建FTP服务进行文件传输一节来搭建。 当然直接用sftp等命令上传也可以。

故障排除

如果你的数据库版本是SQL Server 2008 R2的话,需要打一个SP3的补丁,否则EF数据库链接会超时:下载地址

4. 测试在本机是否能正确运行

curl localhost:5000

部署 Nginx

1. 安装

sudo yum install epel-release
sudo yum install nginx

为什么要用 Nginx ?直接用 Kestrel 不好吗?

首先,Kestrel是一个开源的、非常年轻、简易的服务器,功能很少且安全性较低,而Kestrel无论你的请求主机头是什么都会处理该端口的所有流量,且当你需要使用类似SSL、负载均衡等功能时也会很麻烦。 这也是微软官方的建议,当在Linux上托管.NET Core应用程序时,你需要使用ApacheNginx等服务器并配置一个反向代理将请求转发到Kestrel服务器上进行解析。 官方文档参考:Kestrel web server implementation in ASP.NET Core

2. 打开防火墙通道

sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

这样其实也不是很安全,因为打开的是公共区域的通道,当然更不建议的是直接关闭防火墙,但我对区域的概念不是很清楚,这里就不多说了。

3. 启动 Nginx

systemctl start nginx
systemctl enable nginx #设置开机启动

启动之后在外部通过IP访问Nginx,应该能够看到Nginx的欢迎页面: ![](./_image/2018-07-25 14-32-04.jpg)

4. 配置 Nginx 反向代理

vi /etc/nginx/nginx.conf打开配置,找到Server节点,将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

systemctl restart nginx

此时正常来讲应该能够在外网访问到你的接口了,当然根据个人经历来看不正常的情况貌似更多一点,参考下面的故障排除小节。

修改 Nginx 端口

如果要修改端口的话,这一小节会有所帮助。 将红圈处默认的80端口修改为你的端口号。 ![](./_image/2018-07-25 15-11-00.jpg) 如果在修改端口号后Nginx无法启动,出现Invalid PID number错误,建议的解决方案是注释掉配置文件中http节点下加载子模块配置的代码: ![](./_image/2018-07-25 15-17-00.jpg) 之后可以用netstac -tlpn | grep nginx查看是否监听成功: ![](./_image/2018-07-25 15-18-43.jpg) 然后你还要确保防火墙是否对该端口例外: firewall-cmd --zone=public --add-port=13333/tcp --permanent

故障排除

  1. nginx -t命令检查配置文件语法
  2. Nginx报错,错误日志有(13: Permission denied) while connecting to upstream:[nginx],此时需要执行命令setsebool -P httpd_can_network_connect 1,参考:(13: Permission denied) while connecting to upstream:[nginx]
  3. 如果在启动服务、测试配置时提示端口被占用,有可能是nginx没有关掉,可以用 ps -ef|grep nginx 查看其进程号,那个标注为master process的就是,然后用kill -QUIT 进程号杀死进程。

安装Supervisor

此工具能保证我们的应用程序异常时或电脑重启时依然能正常访问。

1. 安装

yum install supervisor

2. 基础配置

在etc下创建目录并赋予权限,然后创建并修改配置文件

mkdir -m 700 -p /etc/supervisor
vi /etc/supervisor/supervisord.conf

配置内容

[include]
files=/etc/supervisor/conf.d/*.conf

创建.NET Core进程配置文件目录

mkdir -m 700 /etc/supervisor/conf.d

3. 创建进程配置文件

vim /etc/supervisor/conf.d/MyDotNetName.conf

配置内容

[program:yourappname]   #显示名称
command=dotnet yourappname.dll  #命令
directory=/yourapppath/ #路径
environment=ASPNETCORE__ENVIRONMENT=Production  #进程环境变量
user=root   #进程执行用户
stopsignal=INT
autostart=true  #自动启动
autorestart=true    #自动重启
startsecs=5 #重启间隔
stderr_logfile=/var/log/yourappname.err.log #错误日志
stdout_logfile=/var/log/yourappname.out.log #日志

4. 创建supervisor自启动服务

vi /etc/systemd/system/supervisor.service

配置内容

[Unit]
Description=supervisor

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

5. 开启supervisor

systemctl daemon-reload #使配置生效
systemctl enable supervisor.service #创建服务
systemctl start supervisor.service  #开启服务

然后可以用ps -ef | grep dotnet查看接口是否已经运行。 关于Supervisor的部署我个人没有遇到坑,顺着下来应该不会有太大问题。

希望了解其他信息的童鞋强烈建议看一下片头引用的也就是这篇文章:使用 Nginx 在 Linux 上托管 ASP.NET Core

额外:在CentOS上搭建FTP服务进行文件传输

如果允许你使用root账号的话,那么用Filezilla直接连就行。

1. 安装vsftpd

# 安装 vsftpd
yum install vsftpd

2. 开启服务跟防火墙通道

systemctl start vsftpd.service
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

3. 配置 SELinux

getsebool -a | grep ftp
setsebool -P ftpd_full_access on

4. 创建宿主用户

# 创建用户 siegrain 指定 `/home/siegrain` 目录
useradd -g root -M -d /home/siegrain -s /sbin/nologin siegrain

# 设置用户 siegrain 的密码
passwd siegrain

# 创建目录
mkdir /home/siegrain

# 把 /home/siegrain 的所有权给siegrain.root
chown -R siegrain.root /home/siegrain

5. 修改配置

vi /etc/vsftpd/vsftpd.conf

# config file /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd

tcp_wrappers=YES
userlist_enable=YES
chroot_list_enable=NO

# 被动模式配置
pasv_enable=YES
pasv_promiscuous=YES

# 其他配置
listen_port=21
idle_session_timeout=300
data_connection_timeout=120  # 数据连接超时时间
accept_timeout=5
connect_timeout=1

重启服务

systemctl restart vsftpd.service

参考

FTP 配置参考CentOS7安装配置vsftp搭建FTP,若有问题可自行查阅:

全篇完。