[学习笔记]Linux环境下部署 .Net5 程序
公司的项目需要部署到一台公网的linux服务器,以便同事们测试小程序。记录了步骤和一些坑
公司的项目需要部署到一台公网的linux服务器,以便同事们测试小程序。
目标服务器是新搭建的CentOS 8虚拟机,以非docker的方式部署。现记录过程便于日后部署至项目甲方的服务器上,因为甲方的服务器可能未联网,或者网络资源有限(公司按流量算钱的WiFi棒) 宗旨是尽量用U盘拷贝二进制文件以离线的方式安装
首先需要准备环境:
- .net5 环境 Download .NET 5.0 (Linux, macOS, and Windows) (microsoft.com)下载SDK X64就好
- Microsoft SQL Server 14 数据库Index of /rhel/7/mssql-server-2017/ (microsoft.com)
- Node-v16.13.0下载 | Node.js (nodejs.org)
- 以及一些服务,比如RocketChat或者Nginx
使用github或者gitee创建代码仓库,用于迁移代码至测试服务器,如果公司的git和代码仓库需要同时更新,可以依据下面文章进行设置:
如何同步多个 git 远程仓库 - taadis - 博客园 (cnblogs.com)https://www.cnblogs.com/taadis/p/12170953.html
调整项目源代码
各项安装好之后,新建一个解决方案专用的文件夹,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错误日志
我们更改了监听端口到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端口添加到入站和出站规则
在任意终端访问我的阿里云域名,可以访问到接口,至此所有部署工作已结束!
更多推荐
所有评论(0)