[学习笔记]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)

调整项目源代码

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

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

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

修改Linux的文件编码:

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

添加兼容库

如果在项目中用到System.Drawing库,默认在Linux上是不支持的,需要安装Windows Compatibility Pack兼容包解决

dotnet add package Microsoft.Windows.Compatibility --version 5.0.2

注意不要安装6.0.0以上的版本,否则会报以下错误:

这是因为微软从.net6.0开始已经不再支持System.Drawing库的Linux平台兼容性了 ,微软希望你用功能更加丰富的Microsoft.Maui.Graphics包来代替System.Drawing

中断性变更:仅在 Windows 上支持 System.Drawing.Common - .NET | Microsoft Docs

​​​​​​​在CentOS中添加图片处理程序

参考这篇文章安装libgdiplus:

07、 centos7.7 安装libgdiplus - 简书 (jianshu.com)

在安装完成后需要在/usr/lib64中生成二进制链接文件:

cd /usr/lib64
sudo ln -s  /usr/local/libgdiplus-6.0.5/sbin/lib/libgdiplus.so.0.0.0 libgdiplus.so

处理inotify报错:

在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 

 

SQL server 的集成验证方式修改:

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 https://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,修改配置为:

 .Net5 程序部分

server {
    listen        3100 ssl http2;
    server_name   example.com *.example.com;
    root         /usr/share/nginx/html;
     
...



location /api {
    proxy_pass         http://127.0.0.1:21021/api;
    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;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
}

location /signalr {
proxy_pass http://127.0.0.1:21021/signalr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Connection “upgrade”;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

RocketChat部分:

 server {
    listen        2900 ssl http2;
    server_name   example2.com *.example2.com;
    root         /usr/share/nginx/html;
    
...
 
location / {
    proxy_pass         http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header   Upgrade $http_upgrade;
    proxy_set_header   Connection keep-alive;
    proxy_set_header   Connection "upgrade";
    proxy_set_header   Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
}

}

然后运行重新加载命令 

nginx -s reload

宿主机的浏览器打开http://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

我们更改了监听端口到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

再次在宿主机的浏览器打开http://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端口添加到入站和出站规则

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


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

https://blog.matoapp.net/posts/ca121a80/

作者

林晓lx

发布于

2022-02-10

更新于

2024-09-11

许可协议

评论