[学习笔记]Linux环境下部署 .Net5 程序
公司的项目需要部署到一台公网的linux服务器,以便同事们测试小程序。
目标服务器是新搭建的CentOS 8虚拟机,以非docker的方式部署。现记录过程便于日后部署至项目甲方的服务器上,因为甲方的服务器可能未联网,或者网络资源有限(公司按流量算钱的WiFi棒) 宗旨是尽量用U盘拷贝二进制文件以离线的方式安装
首先需要准备环境:
- .net5 环境
- Microsoft SQL Server 14 数据库
- Node-v16.13.0
- 以及一些服务,比如RocketChat或者Nginx
使用github或者gitee创建代码仓库,用于迁移代码至测试服务器,如果公司的git和代码仓库需要同时更新,可以依据下面文章进行设置:
调整项目源代码
各项安装好之后,新建一个解决方案专用的文件夹,git clone代码至文件夹内
并打开解决方案的WebHost项目目录,并键入dotnet build测试编译情况
处理一下错误,以我为例:
修改Linux的文件编码:
比如我在Windows下编写的一些代码文件会以GB2312的编码保存,则Linux下会出现乱码,更改后编译通过。
添加兼容库
如果在项目中用到System.Drawing库,默认在Linux上是不支持的,需要安装Windows Compatibility Pack兼容包解决
注意不要安装6.0.0以上的版本,否则会报以下错误:
这是因为微软从.net6.0开始已经不再支持System.Drawing库的Linux平台兼容性了 ,微软希望你用功能更加丰富的Microsoft.Maui.Graphics包来代替System.Drawing
在CentOS中添加图片处理程序
参考这篇文章安装libgdiplus:
在安装完成后需要在/usr/lib64中生成二进制链接文件:
处理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工具:
验证安装是否成功
如果显示>1表示链接成功
[可选]建议修改管理员登录密码
[可选]如果在宿主机上使用数据库管理工具,则需要打开1433端口,以便外部访问
运行数据库迁移
回到解决方案目录的Miguration项目目录中运行迁移,如下运行成功
运行完迁移,回到Web.Host项目中运行dotnet run。如下运行成功
配置网络
首先来配置Nginx,打开配置文件:etc/nginx/nginx.conf,修改配置为:
.Net5 程序部分
RocketChat部分:
然后运行重新加载命令
宿主机的浏览器打开
1. 安装nmap查看对外端口开放情况:
2. 查看nginx错误日志
比如我的情况是没有权限,则参考此方案解决
我们更改了监听端口到3100,则因为Centos的安全策略可能会出现 [emerg] bind() to 0.0.0.0:XXXX failed (13: Permission denied)的报错,则运行如下命令将3100添加至http的端口配置:
添加完成后运行 ,观察到端口3100已经添加完成
再次在宿主机的浏览器打开
查看到主页已经顺利打开
配置宿主机网络
若要在公网上顺利访问,则需要配置宿主机的网络
之后在宿主机将这个端口号添加至端口转发规则:
在宿主机的防火墙设置中,将3100端口添加到入站和出站规则
在任意终端访问我的阿里云域名,可以访问到接口,至此所有部署工作已结束!
[学习笔记]Linux环境下部署 .Net5 程序