公司的項目需要部署到一台公網的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端口添加到入站和出站規則
在任意終端訪問我的阿里雲域名,可以訪問到接口,至此所有部署工作已結束!












