Published on

Ubuntu + ASP.NET Core MVC + Nginx

前面的文章已經安裝好 Ubuntu - 安裝 Nginx,和產生了 ASP.NET Core MVC 的專案了 Ubuntu - 建立、執行和發佈 ASP.NET Core MVC 專案 ,現在要把發佈出來的檔案跑起來然後使用 Nginx 作反向代理,讓外部可以看到

OS - Ubuntu Desktop 18.04 ASP.NET Core MVC 2.2

  • 先建立一個 user 和 group (mvc),等一下會使這個 user 來執行 Web App
sudo groupadd mvc
sudo useradd -g mvc mvc
  • 建立 nginx 的 Web App 資料夾,然後調整使用者和權限
sudo mkdir /var/www/mvc
sudo chown -R mvc:mvc /var/www/mvc
sudo chmod -R 755 /var/www/mvc/
  • 來到 mvc 專案,修改 mvc 的 Startup.cs,找到下面這兩行把它刪除 (因為不使用 https 所以先把它刪除,不然會跳轉)
app.UseHsts();
app.UseHttpsRedirection();
  • 發行 Web App
dotnet publish -c Release -r ubuntu.18.04-x64
  • 把發佈出來的檔案 copy 到剛才建立的資料夾裡面
sudo cp -r bin/Release/netcoreapp2.2/ubuntu.18.04-x64/publish/* /var/www/mvc/
  • 新增一個 Nginx 的 site available 設定,因為預設的網站是 80 port,這裡就用 8888 來當成 mvc 的 port
sudo vim /etc/nginx/sites-available/mvc

內容如下

server {
		listen 8888 default_server;
        listen [::]:8888 default_server;
        server_name _;
        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;
           proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header   X-Forwarded-Proto $scheme;
        }
}

需要注意的是 proxy_pass 這裡的 port 要看 Web App 運行時的 port 而定

  • 把剛才建立的 available 設定檔,連結到 enabled 裡面
sudo ln -s /etc/nginx/sites-available/mvc /etc/nginx/sites-enabled/

  • 檢查 Ngixn 的設定檔
sudo nginx -t

  • 如果沒有問題的話就重啟 Nginx 的服務
sudo systemctl restart nginx
  • 如果有設定防火牆,記得 allow 8888 port
sudo ufw allow 8888
  • 來到 /var/www/mvc 資料夾,先手動執行 Web App 測試一下,等一下會建立服務讓它自動執行
dotnet mvc.dll
  • 打開瀏覽器來到 8888 port 應該就可以看到畫面了

  • 當然不可能手動運行 Web App,所以要新增一個 mvc 的系統服務來自動執行,先停止剛才的運行,然後建立一個 mvc.service 的服務
sudo vim /etc/systemd/system/mvc.service

內容如下

[Unit]
Description=mvc web app

[Service]
WorkingDirectory=/var/www/mvc
ExecStart=/usr/bin/dotnet /var/www/mvc/mvc.dll
# 這裡的路徑和名稱,請自己調整
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
SyslogIdentifier=dotnet-mvc
User=mvc
# 指定執行的使用者為建立的 mvc
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target
  • 啟用 mvc.service
sudo systemctl enable mvc

  • 執行 mvc.service
sudo systemctl start mvc
  • 查看 mvc.service 的狀態,看到 active 就代表服務有正常啟動了
sudo systemctl status mvc

  • 用服務的方式來執行 Web App 會看不到 Log,這個時候可以使用 sudo journalctl -fu mvc.service 來查看