將 .net core 項目部署到 Linux(含配置多個項目)

原文地址: https://www.jeremyjone.com/696/, 轉載請註明。


部署這事兒,要說簡單,其實很簡單,尤其巨硬官方文檔寫的那叫一個清晰。

發佈

寫好的.net core項目,直接在vs中發佈即可,需要注意選擇linux:

file

這裏不是重點,相信到了部署階段,開發和發佈並不是本文所要關注的。

部署

本文用的CentOS 7 + Apache環境,如果有不一樣的,大同小異,自行參閱文檔。

先掛上巨硬的官方文檔,這份部署文檔相當詳細,我也搜了一下其他文章,基本上都是按照這份文檔部署的,所以沒啥可說的。

巨硬的官方文檔:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-3.1 ,如果你使用的是Nginx,他也有對應的文檔,可以自行參閱。

1、安裝dotnet

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-3.1
sudo yum install aspnetcore-runtime-3.1  # 邏輯上需要安裝運行時,但是sdk已經包含了運行時,所以先裝了sdk的話,這句可以跳過

這樣就裝完了環境,跑一下dotnet可以看到如下內容:

file

2、把發佈的文件放到服務器

理論上文件可以放到任意地方,只要你記得住就可以。

file

將文件放好,測試一下效果,注意需要運行上圖紅框的dll文件:

dotnet /var/www/servers/k-test/WebApplication1.dll

file

如果你發現報錯了,很大機率都是端口衝突,這時需要注意更改端口,官方文檔有詳細的介紹,這裏就不多說了。

如果看到跟圖中一樣的綠色顯示,則表示項目已經成功運行了,下一步就該掛載到apache中去了。

3、設置apache

根據官方文檔的介紹:Apache 的配置文件位於 /etc/httpd/conf.d/ 目錄內。 除了 /etc/httpd/conf.modules.d/ 中的模塊配置文件外(其中包含加載模塊所需的任何配置文件),將對任何帶 .conf 擴展名的文件按字母順序進行處理

所以,在/etc/httpd/conf.d/文件夾中創建一個配置文件,讓我們的項目生效:

vim /etc/httpd/conf.d/test.conf

並將如下內容粘貼到文件中:

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:44001/
    ProxyPassReverse / http://127.0.0.1:44001/
    ServerName api.jeremyjone.com
    ServerAlias api.jeremyjone.com
    ErrorLog /var/log/httpd/api-error.log
    CustomLog /var/log/httpd/api-access.log common
</VirtualHost>

這裏有個問題,第2行的expr=%{REQUEST_SCHEME},我這裏總是報%的語法問題,刪了百分號就成功了。

然後檢查、重啓服務器:

sudo service httpd configtest
sudo systemctl restart httpd  # 如果上面運行正確,再運行該行

4、配置項目的服務項

創建一個服務配置項的文件:

sudo nano /etc/systemd/system/k-test.service

內容如下:

[Unit]
Description=Example .NET Web API App running on CentOS 7

[Service]
WorkingDirectory=/var/www/servers/k-test
ExecStart=/usr/local/bin/dotnet /var/www/servers/k-test/WebApplication1.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-test
User=apache
Environment=ASPNETCORE_ENVIRONMENT=Production 

[Install]
WantedBy=multi-user.target

需要注意:裏面的內容別忘了改成自己的。

保存文件內容,將其掛到服務並啓動:

sudo systemctl enable k-test.service
sudo systemctl start k-test.service
sudo systemctl status k-test.service

如果看到如下內容,表示已經成功了:

file

5、完成

如果之前沒有重啓apache服務器,那麼重啓一下,現在可以訪問了。

我這裏可以通過api.jeremyjone.com來訪問:

file

部署多個項目

這個我看了很多帖子,基本到上面就完事了,跟官方文檔一毛一樣,沒有卵用。

我希望通過api.jeremyjone.com一個地址部署多個項目,而不是每次都申請一個二級域名。通過代理可以解決,也深入的學習了一下apache的proxy模式。

官方文檔介紹:https://httpd.apache.org/docs/2.4/mod/mod_proxy.html ,還是貼文檔地址,有興趣的朋友可以去看看。

簡單說一下,因爲我看到部署的配置文件是這樣的:

ProxyPass / http://127.0.0.1:44001/
ProxyPassReverse / http://127.0.0.1:44001/
  • 第一個參數是路徑,官方叫path,其實就是匹配外部訪問時url的除去域名部分。
  • 第二個參數是內部地址,代理的url。

用官方的例子說明:

ProxyPass "/mirror/foo/" "http://backend.example.com/"
  • 當我們訪問http://api.jeremyjone.com/mirror/foo時,內部會調用http://backend.example.com/處理並返回結果。
  • 如果需要參數,那麼使用訪問http://api.jeremyjone.com/mirror/foo/abc時,內部會調用http://backend.example.com/abc處理並返回結果。

大體的邏輯就是這樣,更高級的用法參看文檔使用。

有了這樣的代理,就可以在api.jeremyjone.com後面加上不同字段來調用不同代理,獲取不同項目的結果。

修改一下配置文件,/etc/httpd/conf.d/test.conf

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass /test/ http://127.0.0.1:44001/
    ProxyPassReverse /test/ http://127.0.0.1:44001/
	
	ProxyPass /test2/ http://127.0.0.1:44002/
    ProxyPassReverse /test2/ http://127.0.0.1:44002/
	
    ServerName api.jeremyjone.com
    ServerAlias api.jeremyjone.com
    ErrorLog /var/log/httpd/api-error.log
    CustomLog /var/log/httpd/api-access.log common
</VirtualHost>

這樣,就可以通過api.jeremyjone.com/testapi.jeremyjone.com/test2分別訪問不同項目了。

有個坑,需要注意

其實也不是什麼大問題,不過我沒注意,整了半天,白耽誤功夫了,特意說一下:

第一個參數一定是以/開頭並且以/結尾,比如:

ProxyPass / http://127.0.0.1:44001/
ProxyPass /test/ http://127.0.0.1:44001/

我在/test後面忘了寫/,導致怎麼訪問都是404,日誌還沒有其他錯誤,煩的一批,結果歇了會,回過頭再來看,發現這裏居然漏了一個/,也算是一種收穫吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章