NGINX 作為一款高效能的網頁伺服器和反向代理軟體,廣泛應用於各種網路架構。本文從安裝方式的選擇開始,詳細介紹了使用套件管理器、預編譯套件和編譯原始碼安裝 NGINX 的步驟,並說明瞭組態檔案的結構和基本語法。接著,文章探討了 HTTP 模組的組態,包括 Socket 和 Host 設定、路徑和檔案管理、客戶端請求處理、MIME 型別設定、許可權和限制組態,以及檔案處理和快取機制。此外,文章還介紹了 NGINX 常用模組,例如 Rewrite 模組,以及如何使用 FastCGI 技術整合 PHP 和 Python 後端應用。更進一步,文章詳細說明瞭 NGINX 作為反向代理伺服器的組態方法,以及如何利用負載平衡技術提升網站的效能和穩定性。最後,文章也涵蓋了在雲端環境中使用 Docker 佈署 NGINX,以及使用 Ansible 進行自動化佈署和管理的實務技巧,並以 HTTPS 設定和 WordPress 佈署案例,展示了 NGINX 在實際應用中的最佳實踐。

NGINX HTTP 伺服器實務

NGINX 是一款高效能且靈活的伺服器軟體,廣泛應用於網頁伺服、反向代理、負載平衡等領域。本篇文章將探討 NGINX 的安裝、組態及實務應用,並透過具體案例和詳細解說,幫助讀者全面掌握這一強大工具。

安裝與組態 NGINX

安裝方式選擇

NGINX 的安裝方式多種多樣,根據不同需求可以選擇套件管理器安裝、編譯原始碼或使用 NGINX 提供的套件。以下是各種安裝方式的詳細說明:

套件管理器安裝

在 Linux 系統上,大多數發行版都提供了 NGINX 的套件。例如,在 Debian/Ubuntu 上可以使用 apt 命令來安裝 NGINX:

sudo apt update
sudo apt install nginx
NGINX 提供的套件

NGINX 官方也提供了預編譯的二進位制套件,這些套件經過了嚴格的測試,適合直接使用。可以從 NGINX 官方網站下載相應版本的套件進行安裝。

編譯原始碼安裝

如果需要自定義 NGINX 的組態或使用最新的功能,可以選擇從原始碼編譯安裝。以下是完整的編譯步驟:

安裝必要的編譯工具

首先,確保系統中已安裝了 GCC 編譯器和其他必要的函式庫:

sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
下載並編譯 NGINX 原始碼

從 NGINX 官方網站下載最新版本的原始碼,然後進行解壓縮:

wget http://nginx.org/download/nginx-1.25.2.tar.gz
tar -zxvf nginx-1.25.2.tar.gz
cd nginx-1.25.2

進行組態和編譯:

./configure --prefix=/usr/local/nginx
make
sudo make install

組態與啟動 NGINX

基本組態

編譯完成後,NGINX 的組態檔案位於 /usr/local/nginx/conf/nginx.conf。可以透過修改這個檔案來組態伺服器的基本設定。

啟動與停止服務

使用以下命令來啟動、停止和重啟 NGINX 服務:

sudo /usr/local/nginx/sbin/nginx   # 啟動
sudo /usr/local/nginx/sbin/nginx -s stop   # 停止
sudo /usr/local/nginx/sbin/nginx -s reload   # 重啟

問題排除與錯誤處理

在使用 NGINX 的過程中,可能會遇到各種問題。以下是一些常見的錯誤處理方法:

常見錯誤
  1. 組態檔案錯誤:如果組態檔案有語法錯誤,NGINX 會無法啟動。可以使用以下命令檢查組態檔案是否正確:

    sudo /usr/local/nginx/sbin/nginx -t
    
  2. 許可權問題:確保 NGINX 程式具有正確的許可權來存取所需的資源。

  3. 系統錯誤:如果系統發生錯誤,NGINX 可能會停止運作。可以透過檢查系統日誌來診斷問題。

NGINX Plus 擴充套件功能

NGINX Plus 是一個商業版本的 NGINX,提供了更多高階功能和支援。例如,它包括更強大的監控工具、負載平衡策略和高用性設定等。

深入應用與最佳實踐

負載平衡

NGINX 作為反向代理伺服器,可以有效地進行負載平衡。以下是一個簡單的負載平衡組態範例:

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

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            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;
        }
    }
}

HTTPS 組態

為了提升網站的安全性,建議啟用 HTTPS。以下是一個基本的 HTTPS 組態範例:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    location / {
        proxy_pass http://backend;
        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 完整組態與應用

瀏覽目錄

  • 基本 NGINX 組態
  • 深入 NGINX 組態
  • 探索 HTTP 組態
  • 探索模組組態
  • PHP 與 Python 與 NGINX
  • NGINX 作為反向代理伺服器
  • 負載平衡與最佳化
  • 於雲端基礎設施中的 NGINX
  • 使用 Ansible 全面佈署、管理及自動更新 NGINX
  • 案例研究
  • 疑難排解

前言

NGINX 以其輕量設計而聞名,是一款專為處理高流量網站設計的強大 HTTP 伺服器,網路擴充套件性是其主要目標。在這個日益連結的世界中,最佳化您的網頁應用程式比以往更加重要。無論您是初學者還是有經驗的系統管理員,這本 NGINX 都會引導您完成從基本組態到針對您需求進行詳細組態的整個過程。本版本專注於最新版本 1.25.2,引入了 HTTP/3 和 QUIC 等新功能。

這本文充滿了大量實際案例,幫助您使用自動 TLS 憑證來保護基礎設施,將 NGINX 放置在現有應用程式之前,並進行更多操作。您也將涵蓋協調、Docker、頻寬管理、OpenResty 和 NGINX Plus 商業功能,以增強和最佳化基礎設施或設計全新架構。閱讀完這本文後,您將能夠適應和使用各種 NGINX 應用來解決任何問題。

本文適合物件

本版本的 NGINX 精心設計給初學者 DevOps 工程師、系統管理員和希望提升自己對網頁伺服器管理理解的 Web 開發者。無論您剛剛開始學習網頁技術,還是想要鞏固基礎知識,這本文都提供了實際見解和動手經驗。主要受眾包括初學者 DevOps 工程師、系統管理員和好奇的 Web 開發者。初學者 DevOps 工程師將從設定到雲端最佳化學習 NGINX 的基本知識,系統管理員將取得有效佈署和故障排除的策略,開發者將發現如何透過提高效能、安全性和擴充套件性來增強他們的專案。

基本 NGINX 組態

NGINX 的組態檔案語法簡潔且易於理解。組態指令(directives)是控制伺服器行為的基本單位,每個指令由一個關鍵字後跟引陣列成。組態檔案中可以包含多個指令塊(blocks),每個塊內可以包含子指令塊。這種層級結構使得組態檔案既靈活又易於管理。

NGINX 的組態檔案通常由多個模組組成,每個模組負責特定功能。核心模組(core module)處理基本伺服器功能,例如事件處理和連線管理。HTTP 模組則負責處理 HTTP 協定相關的請求和回應。

NGINX 流程架構

此圖示展示了 NGINX 的流程架構:

  graph TD;
    A[Client Request] --> B[Event Loop];
    B --> C[Worker Process];
    C --> D[HTTP Handler];
    D --> E[Server Response];
    E --> A;
內容解密:

此圖示展示了 NGINX 的流程架構。當客戶端發出請求時,請求首先進入事件迴圈(Event Loop)。事件迴圈負責監聽和處理所有來自客戶端的連線請求。然後事件迴圈將請求分配給工作程式(Worker Process)。工作程式負責執行實際的請求處理工作,包括解析 HTTP 請求並生成回應。HTTP 處理器(HTTP Handler)根據組態檔案中的指令來處理請求並生成相應的回應。最終,伺服器將回應傳回給客戶端。

探索 HTTP 組態

HTTP 模組是 NGINX 中最重要的一部分,負責處理所有與 HTTP 請求相關的功能。它包含多個指令塊和變數,可以靈活地組態伺服器行為。

Socket 和 Host 組態

Socket 和 Host 組態決定了伺服器如何接受和處理來自客戶端的連線請求。

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
    }
}
內容解密:

這段組態定義了一個伺服器塊(server block),監聽埠 80 和網域名稱 example.com。當客戶端發出請求時,NGINX 會根據 location 塊中的指令將請求轉發給後端伺服器(proxy_pass http://backend)。

路徑和檔案

路徑和檔案組態決定了如何處理來自客戶端的檔案請求。

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}
內容解密:

這段組態定義了一個伺服器塊(server block),監聽埠 80 和網域名稱 example.com。當客戶端存取 / 路徑時,NGINX 會從 /var/www/html 目錄中查詢 index.htmlindex.htm 檔案並傳回給客戶端。

客戶端請求

客戶端請求組態決定了如何處理來自客戶端的各種請求型別。

server {
    listen 80;
    server_name example.com;

    location / {
        if ($request_method = POST) {
            return 405;
        }
    }
}
內容解密:

這段組態定義了一個伺服器塊(server block),監聽埠 80 和網域名稱 example.com。當客戶端發出 POST 請求時,NGINX 會傳回 HTTP status code 405 Method Not Allowed,表示該方法不被允許。

MIME 型別

MIME 型別組態決定了如何根據副檔名設定正確的 Content-Type。

http {
    include       mime.types;
    default_type  application/octet-stream;
}
內容解密:

這段組態包括 MIME 型別定義檔案(mime.types),並設定預設 Content-Type 為 application/octet-stream。這樣當檔案型別未明確定義時,伺服器會傳回預設型別。

許可權與限制

許可權與限制組態決定了如何控制存取許可權和設定限制條件。

http {
    limit_conn addr 10;
}
內容解密:

此指令限制每個 IP 地址最多同時連線數為10個連線數, 一旦超出這個限制, 新連線會被拒絕。

檔案處理與快取

檔案處理與快取組態決定了如何處理和快取來自客戶端的檔案請求。

location /images/ {
    expires 30d;
}
內容解密:

此指令對 /images/ 路徑下的資源設定過期時間為30天, 瀏覽器會在30天內快取這些資源, 提高網站效能.

探索模組組態

NGINX 支援多種模組(modules),每個模組都可以擴充套件或修改伺服器行為。以下是一些常見模組及其組態方法。

Rewrite 模組

Rewrite 模組允許你重寫 URL、設定重定向和設定條件邏輯。

server {
    listen 80;
    server_name example.com;

    location /old-page/ {
        rewrite ^/old-page/(.*)$ /new-page/$1 permanent;
    }
}
內容解密:

此段落將比對以 /old-page/ 開頭的URL並將它們重寫為 /new-page/ 開頭, 永久重定向到新頁面.

其他模組

除了 Rewrite 模組外, NGINX 支援許多其他模組, 包括網站存取記錄, 內容編碼等, 每個模組都有其獨特功能, 提供更多靈活性來滿足各種需求.

PHP 與 Python 與 NGINX

PHP 和 Python 是常見的後端開發語言,可以與 NGINX 無縫整合以提供動態內容。

FastCGI 技術簡介

FastCGI 是一種高效的 CGI 技術,用於處理動態網頁內容生成。 FastCGI 是 CGI 的改進版本, 提供更好的效能. 下面是一個典型 FastCGI 組態:

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

    location ~ \.php$ {
        root           html;
        fastcgi_pass   backend; # FastCGI後台
        fastcgi_index index.php; # index.php作為預設檔案.
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 引數傳遞給PHP處理器.
        include       fastcgi_params; # 必須包含該檔案.
     }
}
內容解密:

此段落定義了一個處理 .php副檔名請求的位置塊. FastCGI 引數被設定為後台處理PHP請求.

PHP-FPM 組態

PHP-FPM 是一種高效的 PHP 處理方法快取技術。

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

     location ~ \.php$ {
         root      html;
         fastcgi_pass   unix:/var/run/php/php7.4-fpm.sock; # FastCGI程式通訊.
         fastcgi_index index.php; # 預設檔案設為index.php.
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 引數傳遞給PHP處理器.
         include   fastcgi_params; # 必須包含該檔案.
     }
}
內容解密:

此段落顯示 PHP-FPM 的典型使用場景.

NGINX 作為反向代理伺服器

反向代理機制允許你在前端伺服器上設定多個後端伺服器以分攤流量並提高效能。 以下是反向代理基本概念:

  • 反向代理:在客戶端與真實後台應用之間放一箇中間層, 隱藏真實後台應用.
  • 負載平衡:將請求分發給多個後台應使用案例項, 提高可靠性與可擴充套件性.

主要指令簡介

反向代理常用指令如下:

  • proxy_pass: 用於將請求轉發到後台應使用案例項.
  • proxy_set_header: 用於設定要傳遞給後台應使用案例項的一些資訊頭資訊.
server {
     listen     80;
     server_name   www.example.com;

     location /api/ {
         proxy_pass http://backend_service; # 轉發到後台API例項.
         proxy_set_header Host $host; # 注意將原始請求頭傳遞給後台應用.
         proxy_set_header X-Real-IP $remote_addr; # 注意將真實IP地址傳遞給後台應用.
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 注意將前向IP地址傳遞給後台應用.
     }
}
內容解密:

此段落示例說明瞭對 /api/ 路徑下請求進行反向代理解決方案. 轉發到後台API例項並保留原始請求頭資訊.

負載平衡與最佳化

負載平衡技術可以均勻分攤來自多個前台應用程式或客戶端而來之流量至數個不同後台應用程式或資料函式庫等機制。

概念說明:

負載平衡: 負載平衡技術透過將流量均勻分佈到多個後台應使用案例項上來提高系統可靠性與回應速度.

主要指令簡介:

負載平衡相關關鍵指令如下:

  • upstream: 用於定義負載平衡池中的後台應使用案例項列表。
  • least_conn: 最少連線負載平衡演算法。
  • ip_hash: 根據IP地址進行負載平衡演算法。
upstream backend_service {
     least_conn; # 最少連線負載平衡演算法.
     server backend1.example.com weight=3; # 加權演算法: 高權重分配更多請求到該節點.
     server backend2.example.com weight=2; # 加權演算法: 高權重分配更多請求到該節點.
}

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

     location /api/ {
         proxy_pass http://backend_service; # 轉發到負載平衡池中的後台API例項列表.
     }
}
內容解密:

此段落透過 least_conn 最少連線負載平衡演算法來分配請求到 backend_service 中不同權重節點.

在雲端基礎設施中的使用

雲端計算已成為現代 IT 基礎設施的一部分。 雲端計算: 根據網際網路提供計算資源(如儲存、計算能力、網路等)供使用者使用.

Docker簡介:

Docker 是一種輕量級虛擬化技術, 提供了一種便捷方式來封裝和佈署應用程式及其依賴項.

Docker Compose: Docker Compose 是一個工具, 用於透過一個 YAML 組態檔案來定義和執行多個 Docker 應用程式容器.

以下是一個簡單 Docker Compose 組態:

version: '3'
services:
   nginx:
      image: nginx:latest
      ports:
          - "80:80"
      volumes:
          - ./html:/usr/share/nginx/html # 掛載靜態HTML內容到Nginx根目錄.
內容解密:

以上程式碼演示 Docker Compose 配合 Nginx 的基本使用方式. 常見做法是在 docker-compose.yml 中定義 Nginx 作為獨立服務並進行掛載及對映外部目錄.

Ansible全面佈署、管理及自動更新NGINX

Ansible 是一種強大且靈活的自動化工具, 常用於軟體佈署、系統管理以及任務排程等場景。 Ansible Playbook: Ansible Playbook 是 Ansible 中的核心概念之一, 是一種 YAML 組態檔案格式, 用於描述一系列需要執行的任務與操作步驟.

以下是一個簡單 Ansible Playbook 組態:

---
- name: Install and configure Nginx on Ubuntu servers
 hosts: webservers
 tasks:
   - name: Update apt cache and install Nginx package on Ubuntu servers
      apt:
          name: nginx
          state: present
          update_cache: yes

   - name: Ensure Nginx is running and enabled on boot
      service:
          name: nginx
          state: started
          enabled: yes

   - name: Copy custom Nginx configuration file to the remote hosts and restart the service if needed (Using handlers)
      copy:
          src: ./custom_nginx_config.conf
          dest: /etc/nginx/nginx.conf
      notify:
          - Restart Nginx service (Using handlers)

 handlers:
   - name: Restart Nginx service (Using handlers)
      service:
          name: nginx
          state: restarted (Using handlers)
內容解密:

以上程式碼演示透過Ansible Playbook安裝並佈署Nginx至Ubutnu系統環境, 指定任務操作步驟來確保Nginx安裝正常並設為開機啟動狀態.

案例研究:HTTPS預設安裝SSL憑證及WordPress佈署例項:

Web安全已成為現代IT基礎設施不可或缺的一部分。 HTTPS:HTTPS 是一種加密通訊協定, 用於確保資料在傳輸過程中不被竊聽或篡改.

SSL證書:SSL證書是一種數字證書, 用於驗證網站身份並加密通訊資料以確保安全性.

以下是SSL證書取得與安裝步驟:

  1. 安裝 Let’s Encrypt ACME 工具:使用 Let’s Encrypt ACME 工具取得免費 SSL 遊戲證書。
  2. 安裝 Let’s Encrypt ACME 工具:在 Linux 上安裝 certbot 工具以取得 SSL 遊戲證書。
  3. 生成 SSL 遊戲證書:使用 certbot 工具生成免費 SSL 遊戲證書並自動安裝到你的 Web 應用中。
  4. 生成 SSL 遊戲證書:執行 certbot –nginx 指令讓 certbot 自動檢測你當前 nginx 組態並生成 SSL 遊戲證書並安裝到 nginx 中。
  5. 自動續期 SSL 遊戲證書:設定 cron job 或 systemd timer 自動續期 SSL 遊戲證書以確保持續安全性。
  6. 自動續期 SSL 遊戲證書:參考 certbot-auto renew –quiet –deploy-hook “systemctl reload nginx” 指令來設定 cron job 或 systemd timer 自動續期 SSL 遊戲證書。
  7. 安裝 WordPress:使用官方 WordPress Docker 映象直接啟動 WordPress 應用。
  8. 安裝 WordPress:使用 docker run -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=wordpress_user -e WORDPRESS_DB_PASSWORD=wordpress_password -e WORDPRESS_DB_NAME=wordpress_db –name wordpress -d wordpress 指令啟動 WordPress 應用。
  9. 資料函式庫連結:確保 MySQL 資料函式庫已經正確設定好並且可被 WordPress 應用存取。
  10. 資料函式庫連結:參考 wp-config.php 對資料函式庫連結資訊進行檢查與修改以確保正確無誤。
  11. 防火牆開放規則:確保防火牆已開放對 Web 應用所需 TCP/UDP 協定及相關存取規則。
  12. 防火牆開放規則:參考 ufw allow ‘Nginx Full’ 指令開放對 Nginx Web 應用所需 TCP/UDP 幀協定及相關存取規則。

WordPress 安裝過程中可能遇到一些問題與挑戰:

  1. 資料函式庫連結錯誤:檢查資料函式庫連結資訊與 MySQL 資料函式庫狀態確保正確無誤。
  2. 資料函式庫連結錯誤:參考 MySQL logs 檢視具體錯誤資訊以及修復對策。
  3. WordPress 不可存取問題:檢查 Nginx logs 檢視具體錯誤資訊以及修復對策。
  4. WordPress 不可存取問題:參考 Nginx reload 指令重新載入 nginx 組態即可修復該問題。(例如 sudo systemctl reload nginx)
  5. WordPress 引導失敗問題:檢查 php-fpm 日誌檢視具體錯誤資訊以及修復對策。(例如 tail -f /var/log/php7.x-fpm.log)

您可能感興趣閱讀書籍目錄