[学习笔记]Linux环境下部署 .Net5 程序

公司的项目需要部署到一台公网的linux服务器,以便同事们测试小程序。

目标服务器是新搭建的CentOS 8虚拟机,以非docker的方式部署。现记录过程便于日后部署至项目甲方的服务器上,因为甲方的服务器可能未联网,或者网络资源有限(公司按流量算钱的WiFi棒) 宗旨是尽量用U盘拷贝二进制文件以离线的方式安装

首先需要准备环境:

  1.  .net5 环境 Download .NET 5.0 (Linux, macOS, and Windows) (microsoft.com)下载SDK X64就好
  2.  Microsoft SQL Server 14 数据库Index of /rhel/7/mssql-server-2017/ (microsoft.com)
  3.  Node-v16.13.0下载 | Node.js (nodejs.org)
  4.  以及一些服务,比如RocketChat或者Nginx

使用github或者gitee创建代码仓库,用于迁移代码至测试服务器,如果公司的git和代码仓库需要同时更新,可以依据下面文章进行设置:

如何同步多个 git 远程仓库 – taadis – 博客园 (cnblogs.com) //www.cnblogs.com/taadis/p/12170953.html

调整项目源代码

各项安装好之后,新建一个解决方案专用的文件夹,git clone代码至文件夹内

并打开解决方案的WebHost项目目录,并键入dotnet build测试编译情况

处理一下错误,以我为例:

比如我在Windows下编写的一些代码文件会以GB2312的编码保存,则Linux下会出现乱码,更改后编译通过。

在Configuration读取的时候用了reloadOnChange为True:

那么linux在使用inotify 文件系统的变化通知机制时就会报错超过使用上限的错误:

—> System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached, or the per-process limit on the number of open file descriptors has been reached 

另外linux下的SQL server不支持集成验证方式登录,将连接字符串的 integrated security改为false;并且在后面提供用户名及密码:

User ID=YourProperUserName;Password=YourProperUserPassword;

配置数据库

bash中键入sudo /opt/mssql/bin/mssql-conf setup以启动配置脚本,在一些列配置完成后,输入systemctl status mssql-server以确认SQL server启动成功

如果没有成功,需要手动运行systemctl start mssql-server启动服务,运行systemctl enable mssql-server保证开机时能自动启动

安装sql-tool工具:

curl //packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/msprod.repo
sudo yum install -y mssql-tools unixODBC-devel
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc

验证安装是否成功

sqlcmd -S localhost -U SA -P '<你的数据库密码>'

如果显示>1表示链接成功

[可选]建议修改管理员登录密码

sqlcmd -U sa -P oldpassword -Z newpassword

 [可选]如果在宿主机上使用数据库管理工具,则需要打开1433端口,以便外部访问

firewall-cmd --zone=public --add-port=1433/tcp --permanent

firewall-cmd --reload

运行数据库迁移

回到解决方案目录的Miguration项目目录中运行迁移,如下运行成功

运行完迁移,回到Web.Host项目中运行dotnet run。如下运行成功

 

 

 配置网络  

首先来配置Nginx,打开配置文件:etc/nginx/nginx.conf,修改配置为:

server {
    listen 3100;
    location / {
        proxy_pass //localhost:21021;
        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 -s reload

宿主机的浏览器打开//192.168.137.101:3100/192.168.137.101来测试代理是否畅通,如果无法链接(ERR_CONNECTION_REFUSED)或者出现502(Bad Gateway)错误,则需要对网络配置进行排查:

1. 安装nmap查看对外端口开放情况:

​​

2. 查看nginx错误日志 

 ​​

比如我的情况是没有权限,则参考此方案解决django – (13: Permission denied) while connecting to upstream:[nginx] – Stack Overflow //stackoverflow.com/questions/23948527/13-permission-denied-while-connecting-to-upstreamnginx

我们更改了监听端口到3100,则因为Centos的安全策略可能会出现 [emerg] bind() to 0.0.0.0:XXXX failed (13: Permission denied)的报错,则运行如下命令将3100添加至http的端口配置:

sudo semanage port -a -t http_port_t  -p tcp 3100

添加完成后运行 ,观察到端口3100已经添加完成

semanage port -l | grep http_port_t

​​ 

再次在宿主机的浏览器打开//192.168.137.101:3100/192.168.137.101来测试代理是否畅通

查看到主页已经顺利打开

​​

配置宿主机网络

若要在公网上顺利访问,则需要配置宿主机的网络

之后在宿主机将这个端口号添加至端口转发规则:

netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=3100 connectaddress=192.168.137.1 connectport=3100

​​

 在宿主机的防火墙设置中,将3100端口添加到入站和出站规则

 在任意终端访问我的阿里云域名,可以访问到接口,至此所有部署工作已结束!