[教學][Ubuntu 架站] 在 Ubuntu 22.04 安裝 Nginx 網頁伺服器,並架設多個網站(多網域)

前言

Nginx 是全球最受歡迎的網頁伺服器之一,負責托管互聯網上一些最大和最高流量的網站。它是一個輕量級的選擇,可用作網頁伺服器或反向代理。

在這個指南中,我們將討論如何在您的 Ubuntu 22.04 伺服器上安裝 Nginx,調整防火牆,管理 Nginx 進程,並設定伺服器區塊,從單個伺服器上托管多個域名。


預先準備

在開始操作此篇文章前,需要先準備好 Ubuntu 22.04 的主機,如果尚未準備好,可以參考此篇文章([教學][Ubuntu 架站] 如何在 Google Cloud Platform 架設 Ubuntu 22.04 伺服器)


1. 安裝 Nginx

因為 Nginx 在 Ubuntu 預設的軟體庫有提供,所以我們可以透過 apt 套件管理系統從這些軟體庫中安裝它。

既然這是我們在這次對話中第一次使用 apt 套件管理系統,我們要先更新一下我們本地的套件清單,這樣就能取得最新的套件資訊。然後,我們就可以開始安裝 nginx 了:

$ sudo apt update && sudo apt install nginx

當系統詢問你是否確認要安裝時,按下「Y」。如果系統詢問是否要重新啟動任何服務,直接按下「ENTER」接受預設設定並繼續。apt 會將 Nginx 及其所需的相依套件安裝到你的伺服器上。


2. 設置防火牆(Configure Firewall)

在測試 Nginx 之前,需要設定防火牆軟體,以允許訪問該服務。Nginx 在安裝時會在 ufw 中註冊自己作為一個服務,因此很容易允許 Nginx 訪問。

輸入以下指令列出 ufw 知道如何處理的應用程式配置:

$ sudo ufw app list


你應該會看到一個應用程式配置的清單:

Output
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

如輸出所示,Nginx 有三個可用的配置檔案:

  • Nginx Full:這個配置開啟了 80 號埠口(普通、未加密的網頁流量)和 443 號埠口(TLS/SSL 加密流量)
  • Nginx HTTP:這個配置僅開啟 80 號埠口(普通、未加密的網頁流量)
  • Nginx HTTPS:這個配置僅開啟 443 號埠口(TLS/SSL 加密流量)

建議你啟用最限制的配置,只要還能允許你所設定的流量。目前,我們只需要允許 80 號埠口上的流量。

我們將從為 SSH 添加防火牆規則開始,因為如果您遠程配置伺服器,您肯定不希望在啟用防火牆時被鎖定在外!

$ sudo ufw allow OpenSSH

你可以透過輸入以下指令來啟用 Nginx HTTP:

$ sudo ufw allow 'Nginx HTTP'

現在啟用防火牆

$ sudo ufw enable

如果看到「Command may disrupt existing ssh connections. Proceed with operation (y|n)?」,請按 y。

你可以透過輸入以下指令來驗證變更:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP (v6)            ALLOW       Anywhere (v6)             
OpenSSH (v6)               ALLOW       Anywhere (v6)  

3. 測試 Nginx

在安裝過程結束時,Ubuntu 22.04 會啟動 Nginx。網頁伺服器應該已經運行起來了。

我們可以使用 systemd 啟動系統來檢查服務是否正在運行,只需輸入以下指令:

$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-09-05 06:24:14 UTC; 5min ago
       Docs: man:nginx(8)
    Process: 2793 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/S>
    Process: 2794 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 2888 (nginx)
      Tasks: 3 (limit: 4675)
     Memory: 5.3M
        CPU: 49ms
     CGroup: /system.slice/nginx.service
             ├─2888 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─2891 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >
             └─2892 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >

Sep 05 06:24:14 ubuntu-22-ngunx systemd[1]: Starting A high performance web server and a reverse proxy server.>
Sep 05 06:24:14 ubuntu-22-ngunx systemd[1]: Started A high performance web server and a reverse proxy server.

從這個輸出可以確認服務已經成功啟動了。不過,最好的方式是實際從 Nginx 要求一個網頁。

你可以通過訪問預設的 Nginx 登陸頁面,來確認軟體運行正常。只需前往你伺服器的 IP 地址。如果你不知道伺服器的 IP 地址,你可以使用 icanhazip.com 工具來查找,它會給你從互聯網的其他位置接收到的公共 IP 地址:

$ curl -4 icanhazip.com

當你取得了伺服器的 IP 地址,就將它輸入到你瀏覽器的地址欄中:

http://your_server_ip

你應該會看到預設的 Nginx 登陸頁面:

如果你看到這個頁面,代表你的伺服器運行正常,已經可以開始進行管理了。


4. 管理 Nginx 進程(Nginx Process)

現在你已經讓你的網頁伺服器運行起來了,讓我們來回顧一些基本的管理指令。

要停止你的網頁伺服器,輸入以下指令:

$ sudo systemctl stop nginx

如果網頁伺服器停止了,要重新啟動它,請輸入以下指令:

$ sudo systemctl start nginx

如果要先停止再重新啟動服務,請輸入以下指令:

$ sudo systemctl restart nginx

如果你只是在進行設定更改,通常 Nginx 可以在不斷開連線的情況下重新載入。要這麼做,輸入以下指令:

$ sudo systemctl reload nginx

預設情況下,Nginx 設定為在伺服器啟動時自動啟動。如果你不希望這樣,可以透過輸入以下指令來停用這個功能:

$ sudo systemctl disable nginx

若要重新啟用服務在開機時自動啟動,請輸入以下指令:

$ sudo systemctl enable nginx

你現在已經學會了基本的管理指令,準備好配置網站以托管多個域名了。


5. 設置伺服器區塊(類似於 Apache 的虛擬主機)

在使用 Nginx 網頁伺服器時,伺服器區塊(類似 Apache 中的虛擬主機)可用於封裝配置細節,並從單一伺服器上托管多個域名。我們將建立一個名為 test3.ui-code.com 的域名,但你應該用你自己的域名來替換這個名稱

在 Ubuntu 22.04 上的 Nginx 預設已經啟用一個伺服器區塊,配置為從 /var/www/html 目錄提供文件。雖然這對於單個站點效果很好,但如果你要托管多個站點,這樣可能變得不方便。我們不想修改 /var/www/html,而是在 /var/www 中創建一個目錄結構,用於我們的 test3.ui-code.com 站點。同時,保留 /var/www/html 作為默認目錄,如果客戶端的請求不符合其他站點,就會從這裡提供服務。

接下來你需要準備自己的網域,網域的購買可以透過一些網域註冊商(如 GoDaddy),購買完網域後可以透過 DNS 設定 A 指向到虛擬主機的 IP 地址。以下我使用子網域(test3.ui-code.com)指向到我建立的虛擬主機,在此更換為自己註冊的網域。

請按照以下方式創建 test3.ui-code.com 的目錄,使用 -p 標誌創建任何必要的上層目錄:

$ sudo mkdir -p /var/www/test3.ui-code.com/html

接下來,使用 $USER 環境變數來設定目錄的所有權:

$ sudo chown -R $USER:$USER /var/www/test3.ui-code.com/html

如果你沒有修改 umask 值(用於設定預設檔案權限),你的網站根目錄的權限應該是正確的。為確保權限正確,讓擁有者具有讀、寫和執行檔案的權限,同時僅允許群組和其他人擁有讀和執行權限,你可以輸入以下指令:

$ sudo chmod -R 755 /var/www/test3.ui-code.com

接下來,使用 nano 或你喜歡的編輯器來創建一個示範的 index.html 頁面:

$ nano /var/www/test3.ui-code.com/html/index.html

在裡面,加入以下示範的 HTML 內容:

<html>
   <head>
     <title>Welcome to test3.ui-code.com</title>
   </head>
   <body>
      <h1>Welcome to test3.ui-code.com</h2>
   </body>
</html>

按下 Ctrl+X 離開並儲存檔案,然後當系統詢問是否要儲存時,按 Y,接著按 Enter。

為了讓 Nginx 提供這個內容,我們需要建立一個包含正確指令的伺服器區塊。我們不直接修改預設的配置檔案,而是在 /etc/nginx/sites-available/ 目錄下創建一個新的配置檔案,命名為 test3.ui-code.com

$ sudo nano /etc/nginx/sites-available/test3.ui-code.com


將以下的配置區塊貼入,這個配置和預設的類似,但已經根據我們的新目錄和域名進行了更新:

server {
        listen 80;
        listen [::]:80;

        root /var/www/test3.ui-code.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name test3.ui-code.com www.test3.ui-code.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

請注意,我們已將根目錄的配置更新為新的目錄,並將 server_name 更新為我們的域名。

接下來,讓我們透過在 sites-enabled 目錄中創建一個連結,來啟用這個檔案,Nginx 在啟動時會從這個目錄讀取配置:

$ sudo ln -s /etc/nginx/sites-available/test3.ui-code.com /etc/nginx/sites-enabled/

現在已經啟用並配置了兩個伺服器區塊,根據它們的 listen 和 server_name 指令來回應請求(你可以在這裡閱讀更多有關 Nginx 如何處理這些指令的信息):

  • test3.ui-code.com:會回應 test3.ui-code.com 和 www.test3.ui-code.com 的請求。
  • default:會回應在 80 號埠口上不符合其他兩個區塊的任何請求。

為了避免可能由於添加額外的伺服器名稱而引起的哈希桶記憶體問題,我們需要在 /etc/nginx/nginx.conf 檔案中調整一個值。打開這個檔案:

$ sudo nano /etc/nginx/nginx.conf

找到 server_names_hash_bucket_size 指令,移除 # 符號以解除註解。如果你使用的是 nano 編輯器,你可以按下 Ctrl 和 w 鍵快速在檔案中搜尋詞語。

完成後,記得儲存並關閉檔案。

接下來,測試確保你的 Nginx 檔案中沒有語法錯誤:

$ sudo nginx -t

如果沒有出現任何問題,重新啟動 Nginx 以使你的變更生效:

$ sudo systemctl restart nginx

Nginx 現在應該正在提供你的域名。你可以通過前往 http://your_domain 來測試,你應該會看到類似這樣的內容:


6. 熟悉重要的 Nginx 檔案和目錄

你應該花一些時間來熟悉幾個重要的目錄和檔案。

內容

/var/www/html:實際的網頁內容,預設只包含你之前看到的預設 Nginx 頁面,是由 /var/www/html 目錄提供的。這個可以透過修改 Nginx 的配置檔案來改變。

伺服器配置

  • /etc/nginx:Nginx 的配置目錄。所有的 Nginx 配置檔案都位於這裡。
  • /etc/nginx/nginx.conf:主要的 Nginx 配置檔案。這個檔案可以修改,用來變更 Nginx 的全域配置。
  • /etc/nginx/sites-available/:這個目錄可以儲存每個網站的伺服器區塊配置。除非這些配置檔案連結到了 sites-enabled 目錄,Nginx 不會使用這個目錄下的配置檔案。通常,所有伺服器區塊的配置都在這個目錄中完成,然後透過連結到其他目錄來啟用。
  • /etc/nginx/sites-enabled/:這個目錄儲存已啟用的每個網站伺服器區塊。通常,這些配置是通過連結到 sites-available 目錄中的檔案來創建的。
  • /etc/nginx/snippets:這個目錄包含可以在其他 Nginx 配置中引用的配置片段。可能需要重複使用的配置段落適合重構為 snippets。

伺服器記錄

  • /var/log/nginx/access.log:每一個對你的網頁伺服器的請求都會被記錄在這個日誌檔案中,除非 Nginx 配置為不這麼做。
  • /var/log/nginx/error.log:任何 Nginx 的錯誤都會被記錄在這個日誌中。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *