1. 程式人生 > 其它 >[學習筆記]Linux環境下部署 .Net5 程式

[學習筆記]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)https://www.cnblogs.com/taadis/p/12170953.html

調整專案原始碼

各項安裝好之後,新建一個解決方案專用的資料夾,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

宿主機的瀏覽器開啟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 Overflowhttps://stackoverflow.com/questions/23948527/13-permission-denied-while-connecting-to-upstreamnginx

我們更改了監聽埠到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埠新增到入站和出站規則

在任意終端訪問我的阿里雲域名,可以訪問到介面,至此所有部署工作已結束!