Skip to content

Nginx 簡介

Nginx 功能介紹

Nginx(發音為 "Engine X")是一個功能強大、高效能的網頁伺服器(Web Server)、反向代理(Reverse Proxy)及負載均衡(Load Balancer)軟體。以下將分別介紹其主要功能:

  1. 網頁伺服器(Web Server):

    • Nginx 作為網頁伺服器時,主要用於托管網站,處理來自客戶端(如瀏覽器)的 HTTP 請求,並返回網頁內容,如 HTML、CSS、JavaScript 檔案等。
    • 它的效能高、資源消耗低,特別適合於處理高並發的請求,常被用於大型網站和高流量網站。
  2. 反向代理(Reverse Proxy):

    • 作為反向代理,Nginx 能夠接收來自客戶端的請求,然後將這些請求轉發到後端的伺服器(如應用伺服器)。
    • 這種方式可以提升安全性,因為它隱藏了後端伺服器的真實 IP,並且可以進行請求的過濾、監控和日誌記錄。
  3. 負載均衡(Load Balancer):

    • Nginx 可以將流量均勻地分配到多個後端伺服器,這樣可以提高網站的可用性和可擴展性。
    • 它支持多種負載均衡策略,例如輪詢(Round-Robin)、最少連接(Least Connections)和 IP 哈希(IP Hash)等。

除此之外,Nginx 還支持以下功能:

  • HTTPS 加密:透過 SSL/TLS 協議來加密客戶端和伺服器之間的通訊,保障數據安全。
  • 緩存(Caching):提供靜態和動態內容的緩存功能,加快響應速度,降低後端伺服器的負擔。
  • 壓縮(Compression):通過壓縮響應內容(例如使用 gzip),可以減少數據傳輸量,加快頁面加載速度。
  • URL 重寫(URL Rewriting):提供強大的 URL 處理和重寫功能,有助於 SEO 優化和網址管理。

安裝 Nginx

以下是在不同作業系統上安裝 Nginx 的基本步驟:

參考資料: Installing nginx

Windows 安裝 Nginx

  1. 下載
  2. 訪問 Nginx 官方網站 下載 Windows 版本的 Nginx。
  3. 選擇適合的版本進行下載,一般選擇穩定版 (Stable version)。

  4. 安裝

  5. 解壓縮下載的文件到指定目錄。
  6. 打開命令提示字元,切換到 Nginx 目錄。

  7. 啟動

  8. 在命令提示字元中執行 start nginx 啟動 Nginx。

macOS 安裝 Nginx

  1. 安裝 Homebrew
  2. 如果尚未安裝 Homebrew,請在終端機執行以下命令:

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    

  3. 安裝 Nginx

  4. 使用 Homebrew 安裝 Nginx:

    brew install nginx
    

  5. 啟動

  6. 啟動 Nginx:
    sudo nginx
    

Ubuntu 安裝 Nginx

  1. 更新套件庫
  2. 在終端機執行:

    sudo apt update
    sudo apt upgrade
    

  3. 安裝 Nginx

  4. 安裝 Nginx:

    sudo apt install nginx
    

  5. 啟動和管理

  6. 啟動 Nginx:
    sudo systemctl start nginx
    
  7. 啟用開機自動啟動:
    sudo systemctl enable nginx
    

配置與驗證

  • 無論在哪個平台,安裝後可以通過訪問 http://localhost127.0.0.1 在瀏覽器中檢查 Nginx 是否運行。
  • Nginx 的配置文件通常位於 /etc/nginx/nginx.conf (Linux/macOS) 或安裝目錄下的 conf/nginx.conf (Windows)。
  • 修改配置後,可使用命令 nginx -s reload 來重新加載設定。

停止 Nginx

停止執行中的 Nginx 服務,可以根據作業系統的不同而有不同的方法。以下是幾種常見作業系統下停止 Nginx 服務的步驟:

Windows

  1. 打開命令提示字元。
  2. 切換到 Nginx 的安裝目錄。
  3. 執行以下命令停止 Nginx:
    nginx -s stop
    

macOS 和 Linux

  1. 打開終端機。
  2. 使用以下命令停止 Nginx:
    sudo nginx -s stop
    
    或者,如果你是使用系統服務管理器 (如 systemd):
    sudo systemctl stop nginx
    

補充說明

  • nginx -s stop 命令會立即停止 Nginx 服務。
  • 你也可以使用 nginx -s quit 命令,這將會優雅地停止 Nginx 服務,處理完所有當前的連線後再退出。
  • 如果你是使用系統服務管理器 (如 systemd),則 sudo systemctl stop nginx 命令會是更常見的做法。

Nginx 配置範例與說明

以下是使用 Nginx 作為 Web Server、Reverse Proxy、Load Balancer(使用 Round-Robin 算法)以及實施 A/B 部署的配置範例。

Web Server

server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;
    index index.html index.htm;

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

這個配置將 Nginx 設定為一個基本的 Web Server,用於處理對 example.com 的請求,並將請求路由到 /var/www/example.com 目錄。

Reverse Proxy

server {
    listen 80;
    server_name proxy.example.com;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

這個配置將 Nginx 設定為 Reverse Proxy,將所有進入 proxy.example.com 的請求轉發到後端服務器(backend_server)。

Nginx Load Balancer

以下設定採用 Round-Robin 算法來分配流量:

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;
        server_name loadbalancer.example.com;

        location / {
            proxy_pass http://backend;
        }
    }
}

在這個配置中,Nginx 將作為一個 Load Balancer,使用 Round-Robin 算法在多個後端服務器(backend1.example.com, backend2.example.com, backend3.example.com)之間分配請求。

Nginx 實施 A/B 部署

upstream backend_a {
    server backend_a1.example.com;
    server backend_a2.example.com;
}

upstream backend_b {
    server backend_b1.example.com;
    server backend_b2.example.com;
}

server {
    listen 80;
    server_name ab.example.com;

    location / {
        split_clients "${remote_addr}AAA" $variant {
            50%     .a;
            *       .b;
        }

        if ($variant = .a) {
            proxy_pass http://backend_a;
        }

        if ($variant = .b) {
            proxy_pass http://backend_b;
        }
    }
}

在 A/B 部署的配置中,Nginx 使用 split_clients 模組將流量根據設定的權重分配到不同的後端群組(在本例中為 backend_a 和 backend_b),實現 A/B 測試或藍綠部署。

輸出 JSON 結構化日誌

要配置 Nginx 以輸出結構化 JSON 日誌(適用於 Fluentd 或其他日誌處理系統),您需要在 Nginx 的設定檔進行修改。以下是一個配置示例,展示了如何設置 Nginx 以輸出 JSON 格式的日誌:

定義 JSON 日誌格式

首先,在 Nginx 的 http 塊中定義一個新的日誌格式。可以在 Nginx 的主設定檔(例如 /etc/nginx/nginx.conf)中完成。

http {
    log_format json_combined escape=json '{'
        '"time_local":"$time_local",'
        '"remote_addr":"$remote_addr",'
        '"remote_user":"$remote_user",'
        '"request":"$request",'
        '"status": $status,'
        '"body_bytes_sent": $body_bytes_sent,'
        '"http_referer":"$http_referer",'
        '"http_user_agent":"$http_user_agent",'
        '"http_x_forwarded_for":"$http_x_forwarded_for",'
        '"http_host":"$http_host",'
        '"server_name":"$server_name",'
        '"request_time":$request_time,'
        '"upstream_response_time":"$upstream_response_time"'
    '}';
    ...
}

這個 log_format 指令定義了一個名為 json_combined 的新日誌格式,其中包含了各種 Nginx 變量,並以 JSON 格式輸出。

指定日誌文件的輸出格式

接下來,在您的 server 塊中指定使用此 JSON 格式輸出日誌:

server {
    listen 80;
    server_name example.com;

    access_log /var/log/nginx/access.log json_combined;

    location / {
        ...
    }
}

在這裡,access_log 指令將日誌文件設置為 /var/log/nginx/access.log,並使用之前定義的 json_combined 格式。

重載 Nginx 配置

配置完成後,您需要重新載入或重啟 Nginx 以應用這些更改:

sudo nginx -s reload

與 Fluentd 整合

完成上述設定後,Nginx 會將訪問日誌以 JSON 格式寫入指定的文件。Fluentd 可以配置為讀取這個日誌文件,並進行後續的處理和分析。

請根據您的具體需求和環境調整上述配置。例如,日誌文件的位置(/var/log/nginx/access.log)和伺服器名稱(example.com)應根據您的實際情況進行修改。