[學習筆記]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)

調整項目源代碼

各項安裝好之后,新建一個解決方案專用的文件夾,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錯誤日志 

 ​​

比如我的情況是沒有權限,則參考此方案解決

django - (13: Permission denied) while connecting to upstream:[nginx] - Stack Overflow

我們更改了監聽端口到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端口添加到入站和出站規則

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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM