如何為NGINX子域或多個域提供服務

您是否有一台具有單個公共 IP 地址的伺服器,但需要託管多個域名或子域名?你會怎麼做?對於初學者來說,這種情況可能會讓人感到困惑。但不用擔心,本教程為您提供了解決方案,這樣您就可以在一台具有單個 IP 地址的伺服器上託管 NGINX 子域名和多個域名。

在本教程中,您將學習如何有效地在一台具有單個 IP 地址的伺服器上託管 NGINX 子域名或多個域名!

如果您準備好了,那就開始吧!

先決條件

本教程附有實際演示,但不需要太多先決條件,假設您已經安裝了一台啟用了 SSH 的 Ubuntu Server LTS 並安裝了 NGINX。本教程中的演示是在 Ubuntu Server LTS 20.04.1 上進行的。

設置 DNS 記錄

在您能夠託管 NGINX 子域名或多個域名之前,您需要在 DNS 控制面板中添加一個 A 記錄。A 記錄將所有域名和子域名綁定並指向單個 IP 地址,以便網頁瀏覽器可以找到您的網站。

1. 啟動您喜歡的網頁瀏覽器,並登入您的DNS控制面板。

2. 點擊新增記錄來開始新增A記錄。瀏覽器會將您重定向到一個頁面,在該頁面上您可以配置您的域名和子域名的DNS設定。

Adding an A Record

現在使用以下方式配置DNS設定:

類型欄位中選擇A記錄。

主機欄位中輸入@,並在欄位中輸入您的伺服器IP。

TTL欄位中選擇您想要的值,然後點擊確認按鈕保存設定。

對其他子域名重複相同的過程。

Configuring DNS settings for Domain and Subdomains The final DNS Settings page looks like the one below.

最終的DNS設定頁面如下所示:

Viewing DNS Settings Page

您的DNS記錄控制面板的功能和設計可能會有所不同,但相同的原則適用於所有情況。

為NGINX域名和子域名設置網頁目錄

現在您已經為您的域名和子域名添加了A記錄,是時候設置它們的網頁目錄了。NGINX附帶了一個默認的虛擬主機文件,並配置為提供位於/usr/share/nginx/html的網頁目錄。

您將在NGINX的默認文檔根目錄(/var/www/html)中為每個域名創建一個單獨的網頁目錄。

1. 首先,打開您的終端並運行以下命令,為所有域名和子域名創建網絡目錄。這樣可以將每個網站的文件分開、組織和隔離。

sudo mkdir /var/www/html/awstutorial.net
sudo mkdir /var/www/html/web1.awstutorial.net
sudo mkdir /var/www/html/web2.awstutorial.net

2. 接下來,運行 chown 命令,以遞歸方式 (-R) 將步驟一中創建的每個目錄的所有權更改為 www-data 用戶和組。您正在將每個目錄的所有權更改為 www-data 用戶和組,因為 NGINX 以 www-data 用戶運行。

sudo chown -R www-data:www-data /var/www/html/awstutorial.net
sudo chown -R www-data:www-data /var/www/html/web1.awstutorial.net
sudo chown -R www-data:www-data /var/www/html/web2.awstutorial.net

3. 在您首選的代碼編輯器中創建一個名為 index.html 的文件,然後將下面的代碼復制/粘貼到 index.html 文件中。將文件保存在您的域的主要 Web 目錄 (/var/www/html/awstutorial.net) 中。

下面的 HTML 代碼在 Web 瀏覽器中打開 index.html 文件時顯示一條消息,該消息說“恭喜! awstutorial.net 網站正在運行!”。

<html>
	<head>
	  <title>Welcome to awstutorial.net!</title>
  </head>
	  <body>
	    <h1>Congratulations! The awstutorial.net website is working!</h1>
    </body>
</html>

4. 最後,在 /var/www/html/web1.awstutorial.net/var/www/html/web2.awstutorial.net 目錄中創建相同的 index.html。但是,在每個 index.html 的代碼中將 awstutorial.net 替換為 web1.awstutorial.netweb2.awstutorial.net

設置 NGINX 域和子域的虛擬主機

您已經為您的域和子域準備了一個 index.html 頁面,可以通過 NGINX Web 服務器提供。下一步是為每個域創建一個 NGINX 虛擬主機配置文件,以提供 HTML 頁面。

1. 在您喜歡的程式編輯器中創建一個名為 awstutorial.net 的 NGINX 虛擬主機配置文件,然後將下面的代碼複製/粘貼到該文件中。將文件保存在 /etc/nginx/sites-available/ 目錄中。

下面的代碼控制了您的服務器的行為,例如當用戶嘗試訪問您的域時的服務器名稱和索引(首頁)頁面。

server {
        # 綁定 TCP 端口 80。
        listen 80; 

				# 用於搜索文件的根目錄
        root /var/www/html/awstutorial.net;
				# 定義要用作索引頁面的文件
        index index.html index.htm;
				# 定義域名或子域名。 
        # 如果在服務器塊中未定義 server_name,則 
				# Nginx 使用 'empty' 名稱
        server_name awstutorial.net;

        location / {
            # 在服務器接收到無法跟踪的文件和目錄的請求時返回 404 錯誤。
						
            try_files $uri $uri/ =404;
        }
    }

2. 接下來,運行以下 nginx 命令來檢查(-t)NGINX 配置文件是否存在任何語法錯誤。

sudo nginx -t

如果 NGINX 配置文件中未找到任何語法錯誤,您將獲得以下輸出。

Verifying NGINX configuration file

3. 接下來,執行以下命令以創建一個符號連結(ln -s),將/etc/nginx/sites-available連結到/etc/nginx/sites-enabled/目錄。此命令會啟用awstutorial.net虛擬主機配置文件。

sudo ln -s /etc/nginx/sites-available/awstutorial.net /etc/nginx/sites-enabled/

在 NGINX Ubuntu 安裝中,sites-available 和 sites-enabled 格式是標準的,但其他發行版可能使用不同的標準。

4. 重複第一步至第三步,創建名為web1.awstutorial.netweb2.awstutorial.net的 NGINX 虛擬主機配置文件。

在每個 NGINX 虛擬主機配置文件中更改以下行:

  • root /var/www/html/awstutorial.net一行替換為每個子域的 Web 根目錄(root /var/www/html/web1.awstutorial.netroot /var/www/html/web2.awstutorial.net)。
  • server_name awstutorial.net一行替換為每個子域的名稱(server_name web1.awstutorial.netserver_name web2.awstutorial.net)。

5. 現在執行以下sudo ln命令,就像在第三步中所做的那樣啟用虛擬主機配置文件。

# 啟用 web1.awstutorial.net NGINX 虛擬主機配置文件
sudo ln -s /etc/nginx/sites-available/web1.awstutorial.net /etc/nginx/sites-enabled/
# 啟用 web2.awstutorial.net NGINX 虛擬主機配置文件
sudo ln -s /etc/nginx/sites-available/web2.awstutorial.net /etc/nginx/sites-enabled/

6. 執行以下 systemctl 命令重新啟動 NGINX (restart nginx) 服務以應用所有配置更改。

sudo systemctl restart nginx

7. 最後,使用瀏覽器訪問域名和子域名的 URL 來測試網站是否運作正常。

如果域名和子域名正常加載,你會看到類似下面的消息。

Verifying websites are loading through the web browser.

在 NGINX 域名和子域名上設置 HTTPS

你已成功設置並測試了使用 HTTP 協議的 NGINX 域名和子域名,這很棒。但你必須通過啟用 HTTPS 來保護你的域名和子域名的連接。如何?通過從像 Let’s Encrypt SSL 這樣的證書授權機構獲得的證書。

1. 首先,運行以下命令安裝 Certbot 軟件包 (apt-get install certbot)。Certbot 讓你為你的域名和子域名下載 SSL 證書。

sudo apt-get install certbot python3-certbot-nginx -y

2. 接下來,執行以下certbot指令,以下載你的網域(-d awstutorial.net)的SSL憑證(certonly)。請注意,你需要同意服務條款(--agree-tos)並提供你的電子郵件地址(--email)。

sudo certbot certonly --agree-tos --email [email protected] -d awstutorial.net

將電子郵件替換為你自己的。

3. 輸入 ‘1’ 以選擇NGINX Web伺服器插件(nginx)來進行ACME CA驗證,如下所示。

Selecting Plugin to Authenticate with ACME CA

在選擇NGINX Web伺服器插件後,你將看到下載SSL憑證的進度,涉及你的網域(awstutorial.net)。

預設情況下,Let’s Encrypt的SSL憑證存儲在/etc/letsencrypt/live/目錄中。

Showing Download Progress of the SSL Certificate

4. 現在,像在第二步中一樣,執行下面的每個指令,以下載其餘子網域(web1.awstutorial.netweb2.awstutorial.net)的SSL憑證。

sudo certbot certonly --agree-tos --email [email protected] -d web1.awstutorial.net
sudo certbot certonly --agree-tos --email [email protected] -d web2.awstutorial.net

5. 最後,執行以下ls指令,列出/etc/letsencrypt/live/目錄中包含(*)名稱中包含awstutorial.net的所有SSL憑證。這樣可以驗證SSL憑證的存在。

ls /etc/letsencrypt/live/*awstutorial.net/

下面,你將看到你的網域和子網域的SSL憑證。

Showing SSL certificate for all domains.

此時,您已經擁有SSL證書。但是您如何使用它們來保護您的域名和子域名呢?您將在每個NGINX虛擬主機配置文件的 server 塊中定義證書的路徑。

1. 在您首選的代碼編輯器中打開位於/etc/nginx/sites-available/目錄中的awstutorial.net NGINX虛擬主機配置文件。

2. 用下面的代碼替換文件的內容,在其中定義您域名的SSL證書路徑和SSL協議(在 SSL證書路徑 下)。

server {
	     # 綁定 TCP 80 端口。
       listen 80;
	     # 定義域名或子域名。
       # 如果在伺服器塊中未定義 server_name 則
	     # Nginx 使用 'empty' 名稱
       server_name awstutorial.net;
	     # 將流量重定向到相應的
	     # HTTPS 伺服器塊,狀態碼為 301
       return 301 https://$host$request_uri;
       }

server {
        # 綁定 TCP 443 端口並啟用 SSL。
        listen 443 SSL;
	      # 用於搜索文件的根目錄
	      root /var/www/html/awstutorial.net; 
	      # 定義域名或子域名。
        # 如果在伺服器塊中未定義 server_name 則
	      # Nginx 使用 'empty' 名稱
        server_name awstutorial.net;

	      # SSL 證書的路徑
        ssl_certificate /etc/letsencrypt/live/awstutorial.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/awstutorial.net/privkey.pem;
	      # 使用 certbot 命令生成的文件。
        include /etc/letsencrypt/options-ssl-nginx.conf;
	      # 定義 dhparam.pem 文件的路徑。
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

        location / {
	      # 在伺服器接收到
	      # 無法追蹤的文件和目錄的請求時返回 404 錯誤。
        try_files $uri $uri/ =404;
        }

    }

3. 重複執行相同的步驟(步驟一至步驟二)來處理剩餘的虛擬主機配置檔案(web1.awstutorial.netweb2.awstutorial.net)。但請務必將 SSL 憑證的路徑替換為您子域的憑證路徑(在SSL 憑證的路徑下)。

4. 現在重新執行下面的systemctl命令以重新啟動 NGINX 服務,以應用配置更改。

sudo systemctl restart nginx

5. 最後,在網頁瀏覽器中導航至您的域和子域的 URL。但這次,請改用 HTTPS 協定來查看它們是否運作。

在下面,您可以看到位於地址欄的一把鎖的圖示,這表示該網站已使用您的 SSL 憑證進行安全保護。

Verifying Domain is Secure

結論

在本教程中,您已經學會了如何通過配置虛擬主機配置檔案來提供 NGINX 子域或多個域。您還涉及在虛擬主機配置檔案中定義的 SSL 憑證來保護您的域。

現在,為什麼不在生產環境中使用此設置,例如在單個伺服器上託管多個應用程序,並提供經濟實惠的網頁託管呢?

Source:
https://adamtheautomator.com/nginx-subdomain/