本篇主要體驗一下Nginx的使用,之前只接觸過IIS。
一、Nginx
a) ASP.NET Core內置了Kestrel服務器,但功能簡單,主要用於SelfHost,正式運行還是要依賴IIS、Apache、Nginx等功能全面的服務器,為ASP.NET Core程序提供類似緩存、壓縮請求、SSL終端等高深的特性或功能。這兩種服務器的關系是:Nginx、IIS等作為Kestrel的反向代理服務器。
反向代理、正向代理都不懂,大概的意思是:這兩種代理都處在真正要交互的客戶端與服務器之間,但正向代理要為客戶端代理,科學上網工具應該就是這種(正向代理);反向代理則是為服務端作代理,置於真正的服務器之前,提供安全、緩存、負載均衡等功能。正向代理的配置在客戶端,需要用戶主動配置代理服務器的IP、域名等;而反向代理服務器的配置是服務端的事,用戶可以不必知道反向代理服務器的存在。
b) Nginx的配置和部署
首先需要再應用程序的Startup.Configure中添加與URI重點向和安全策略相關的代碼,這些都是包Microsoft.AspNetCore.HttpOverrides下的方法:
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor
| ForwardedHeaders.XForwardedProto
});
然后測試代碼可以發布了,如果在linux下創建,可以使用dotnet publish命令,完成后會告知發布路徑。
接下來安裝nginx(sudo apt-get install nginx),nginx會被自動作為守護進程(daemon),但第一次安裝后需要手動啟動服務(sudo service nginx start)。
打開/etc/nginx/sites-available/default文件並將內容替換為:
server {
listen 80;
location / {
proxy_pass http://localhost:5000;
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;
}
}
這樣就配置好了從80端口到5000端口的代理,asp.net core程序的默認端口為5000。運行sudo nginx -s reload讓nginx重新加載配置。
隨后創建service definition file(sudo gedit /etc/systemd/system/kestrel-hellomvc.service),直接用gedit了,方便復制粘貼,vi還是不適合我這用慣圖形界面的程序員。
從文檔復制配置內容:
[Unit]
Description=<應用程序名稱>
[Service]
WorkingDirectory=<發布路徑>
ExecStart=/usr/bin/dotnet <發布路徑.***.dll>
Restart=always
RestartSec=10 # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
保存后,先執行dotnet <發布路徑.***.dll>在kesrtel服務器中啟動程序,然后順序執行如下命令,以啟動剛剛創建的service definition file:
systemctl enable kestrel-hellomvc.service
systemctl start kestrel-hellomvc.service
執行systemctl status kestrel-hellomvc.service可以查看是否成功。
沒問題遍部署完成了,通過127.0.0.1:80可以正常訪問網站,從報文消息頭中也可以看到響應是來自Nginx。