原文地址: https://www.jeremyjone.com/696/, 轉載請註明。
部署這事兒,要說簡單,其實很簡單,尤其巨硬官方文檔寫的那叫一個清晰。
發佈
寫好的.net core
項目,直接在vs中發佈即可,需要注意選擇linux:
這裏不是重點,相信到了部署階段,開發和發佈並不是本文所要關注的。
部署
本文用的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
可以看到如下內容:
2、把發佈的文件放到服務器
理論上文件可以放到任意地方,只要你記得住就可以。
將文件放好,測試一下效果,注意需要運行上圖紅框的dll文件:
dotnet /var/www/servers/k-test/WebApplication1.dll
如果你發現報錯了,很大機率都是端口衝突,這時需要注意更改端口,官方文檔有詳細的介紹,這裏就不多說了。
如果看到跟圖中一樣的綠色顯示,則表示項目已經成功運行了,下一步就該掛載到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
如果看到如下內容,表示已經成功了:
5、完成
如果之前沒有重啓apache服務器,那麼重啓一下,現在可以訪問了。
我這裏可以通過api.jeremyjone.com
來訪問:
部署多個項目
這個我看了很多帖子,基本到上面就完事了,跟官方文檔一毛一樣,沒有卵用。
我希望通過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/test
和api.jeremyjone.com/test2
分別訪問不同項目了。
有個坑,需要注意
其實也不是什麼大問題,不過我沒注意,整了半天,白耽誤功夫了,特意說一下:
第一個參數一定是以/
開頭並且以/
結尾,比如:
ProxyPass / http://127.0.0.1:44001/
ProxyPass /test/ http://127.0.0.1:44001/
我在/test
後面忘了寫/
,導致怎麼訪問都是404,日誌還沒有其他錯誤,煩的一批,結果歇了會,回過頭再來看,發現這裏居然漏了一個/
,也算是一種收穫吧。