[料理佳餚] 在 CentOS 7 上使用 Nginx 反向代理 ASP.NET Core 應用程式要注意的事情

微軟官方文件「在 Linux 上使用 Nginx 裝載 ASP.NET Core」使用的作業系統是 Ubuntu,我個人是偏好號稱萬年不掛的 CentOS,Linux 不同陣營之間的風格是有一點差異的,所以如果照著微軟官方的步驟套到 CentOS 上,一定會在某個地方覺得拐手,我就把到可以成功瀏覽網頁之前需要注意地方做個記錄。

YUM? APT?

CentOS 是使用 YUM(CentOS 8 開始使用 DNF) 做為套件管理工具,而 Ubuntu 是使用 APT,所以第一個遇到的問題就是 Nginx 的安裝,關於在 CentOS 上安裝 Nginx 請參考 How To Install Nginx on CentOS 7,我就不多贅述。

找不到 sites-available 資料夾

官方文件有一個步驟「請修改 /etc/nginx/sites-available/default」,如果我們是在 CentOS 上安裝 Nginx,那麼我們肯定是找不到這個資料夾的,原因是 sites-available 這個資料夾是 Debian/Ubuntu 陣營的風格,在 Debian 或 Ubuntu 上安裝 Nginx 就會看到 sites-availablesites-enable 這兩個資料夾。

連預設的 nginx.conf 也長得不一樣

Debian/Ubuntu 陣營是考慮到一個 Nginx 服務寄宿多個站台的情形,所以有 sites-available 及 sites-enable 這兩個資料夾,管理起來會較為方便,那 CentOS 這邊就沒有去調整 Nginx 官方太多的東西,如果真的有多個站台的需求,那使用者就再自己改,我是入境隨俗的,所以我是遵循 CentOS 的風格,把站台的設定放在 /etc/nginx/conf.d 底下。

*.service 檔案放在 /etc/systemd/system/?

官方文件有一個步驟是「將服務定義檔建立在 /etc/systemd/system/ 底下」,這個跟通用的慣例不太一樣,先說明一下,放在 /etc/systemd/system/ 底下的服務定義檔,會在開機時啟動,所以通常是將服務定義檔放在 /usr/lib/systemd/system/ 底下,有需要在開機時啟動的話,才再執行 sudo systemctl enable [service name] 建立連結檔到 /etc/systemd/system/ 底下。

我們可以看到多數的服務都是將服務定義檔放在 /usr/lib/systemd/system/ 底下,連 Nginx 也是這樣。

這邊也提醒一下各位朋友,Nginx 裝完之後務必執行 sudo systemctl enable nginx,否則伺服器重新開機之後 Nginx 是不會自動啟動的。

找不到 www-data 使用者

官方文件中的 ASP.NET Core 服務定義檔使用 www-data 做為執行服務的使用者帳號,如果我們用的是 CentOS 會找不到 www-data 的帳號,因為 www-data 是 Debian/Ubuntu 陣營預設就有建立的帳號,用來執行 Web 相關的服務,所以在 CentOS 找不到是正常的。

因此在這邊我們就得要建一個帳號出來執行 ASP.NET Core 服務,不過不一定要用 www-data 這個名稱,可以用我們自己想要的名稱。

502 Bad Gateway

這個是 SELinux 在做怪,執行下面指令將 httpd_can_network_connect 規則打開就行了。

sudo setsebool -P httpd_can_network_connect 1

以上針對在 CentOS 7 上使用 Nginx 寄宿 ASP.NET Core 應用程式的經驗,跟大家做一點分享,希望對大家有幫助。

參考資料

C# 指南 ASP.NET 教學 ASP.NET MVC 指引
Azure SQL Database 教學 SQL Server 教學 Xamarin.Forms 教學