Nginx是一個免費開源且穩定高效的Web伺服器程式,擁有反向代理以及負載平衡的功能,經常作為最前端的伺服器。對於一些非完全公開的檔案或是網頁,Nginx可以將它們加上帳號與密碼來保護,無需撰寫額外的程式或是網頁,就可以讓瀏覽器在開啟這些特定的網址時,跳出輸入帳號和密碼視窗,瀏覽者則必須要輸入正確的帳號與密碼,才可以存取到該網址的資源。



這個功能實際上是HTTP協定內建的,而且有個正式的名稱,稱為「基本認證」(Basic Access Authentication)。強大的Nginx自然是有直接支援HTTP的「基本認證」功能,只需要在Nginx的設定檔中加上「auth_basic」相關的命令即可。但是在動到Nginx的設定檔之前,我們先來學學怎麼產生Nginx所允許的帳號密碼清單吧!

HTTP基本認證的帳號密碼清單─htpasswd

HTTP基本認證所使用的帳號密碼清單,由於一開始是Apache所使用的關係,因此又稱為「htpasswd」。這個「htpasswd」帳號密碼清單,通常會是獨立的一個檔案,Apache有提供對應的命令列工具「htpasswd」來管理。如果是基於Debian的Linux發行版,可以直接使用以下指令來安裝:

sudo apt install apache2-utils

「htpasswd」工具的用法很簡單,指令如下:

htpasswd 帳號密碼清單的檔案路徑 帳號

第一次使用「htpasswd」工具的時候,我們需要先產生一個空白的檔案。如以下指令,運用「touch」指令在目前工作目錄下產生出「.htpasswd」檔案:

touch .htpasswd

nginx-htpasswd

當然,也可以直接在「htpasswd」創建新帳號密碼的指令中,加上「-c」選項,來直接建立新檔。

不管如何,有了儲存帳號密碼清單的檔案後,我們就可以利用「htpasswd」指令來建立帳密了!例如要建立的帳號為「admin」,密碼為「1234」的話,指令如下:

htpasswd .htpasswd admin

nginx-htpasswd

接著在終端機填入兩次「1234」。

nginx-htpasswd

如此一來,新的帳號密碼組合就被建立到「.htpasswd」內了!如果要建立多組帳號密碼,只要重複使用「htpasswd」指令將新的帳號密碼儲存到同一個「htpasswd」帳號密碼清單檔案內即可。

nginx-htpasswd

如果要刪除某個帳號的話,可以使用以下指令:

htpasswd -D 帳號密碼清單的檔案路徑 帳號

在Nginx設定檔內套用htpasswd

有了儲存帳號密碼清單的檔案後,便可以在Nginx設定檔的「http」區塊或是其底下的「server」或「location」區塊中,使用「auth_basic_user_file」命令,來使用指定路徑的「htpasswd」帳號密碼清單檔案。命令如下:

auth_basic_user_file /path/to/.htpasswd;

接著,我們就可以在「auth_basic_user_file」命令的同個區塊或是底下的區塊,視情況決定有哪些部份需要使用HTTP基本認證,如果要使用HTTP基本認證的話,則需要在該區塊加上「auth_basic」命令,以及驗證失敗時所回應的「WWW-Authenticate」標頭的內容。命令如下:

auth_basic "Restricted Content";

如果已經啟用HTTP基本認證的區塊底下,有某些區塊不需要使用HTTP基本認證,可以再使用一次「auth_basic」命令,將「off」代入,寫進該子區塊下。命令如下:

auth_basic off;

總而言之,當瀏覽器要存取已啟用HTTP基本認證功能的網址資源時,就會先跳出輸入帳號密碼的視窗。帳號密碼必須輸入正確才可以存取到該網址的資源。如果不輸入的話,Nginx就會回傳HTTP的401狀態(Authorization Required)。

nginx-htpasswd

nginx-htpasswd