[學習筆記]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測試編譯情況
處理一下錯誤,以我為例:
比如我在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 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,修改配置為:
server {
listen 3100;
location / {
proxy_pass http://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
宿主機的瀏覽器開啟
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
再次在宿主機的瀏覽器開啟
檢視到主頁已經順利開啟
配置宿主機網路
若要在公網上順利訪問,則需要配置宿主機的網路
之後在宿主機將這個埠號新增至埠轉發規則:
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=3100 connectaddress=192.168.137.1 connectport=3100
在宿主機的防火牆設定中,將3100埠新增到入站和出站規則
在任意終端訪問我的阿里雲域名,可以訪問到介面,至此所有部署工作已結束!