從官方網站下載 NGINX 原始碼後,解壓縮並進入原始碼目錄,接著便是重要的組態編譯選項階段。這個階段決定了 NGINX 的功能和模組,必須根據實際需求進行調整。例如,--prefix 選項指定安裝路徑,--with-http_ssl_module 啟用 SSL 模組,而 --with-pcre--with-zlib 則引入必要的函式庫。組態完成後,使用 make 命令編譯原始碼,再以 sudo make install 安裝到指定位置。安裝完成後,需要修改 NGINX 的設定檔 nginx.conf,設定伺服器區塊、監聽埠、網域名稱等資訊。設定完成後,使用 nginx -c 命令啟動 NGINX,並可透過瀏覽器驗證是否成功執行。此外,NGINX 提供了 stopreloadreopenquit 等命令來管理服務狀態。設定檔中,可以設定 worker 程式數量、連線數限制、keepalive 超時時間、gzip 壓縮等引數來最佳化效能。反向代理設定則需要定義 upstream 區塊和 proxy_pass 等指令,以實作負載平衡和高用性。SSL/TLS 組態需要指定憑證檔案路徑和協定加密套件,確保資料傳輸安全。最後,透過檢視存取日誌和錯誤日誌,可以監控 NGINX 的執行狀態和排查問題。

下載及編譯 NGINX 原始碼

NGINX 是一個相對新穎且迅速成長的專案,網路上已經有大量資源可供參考,並且擁有一個活躍的管理員與開發者社群。官方網站 nginx.org 提供了完整的檔案和最新版本的應用程式原始碼與二進位制檔案下載連結。此外,NGINX Wiki 也提供了各種作業系統的安裝、模組教學等豐富資源。

如果你在使用過程中遇到問題,可以尋求以下幾種幫助方式:

  • NGINX Forum:在 NGINX Forum 上發問,通常很快就能得到社群的回應。
  • Mailing List:NGINX 的郵件列表會轉發到論壇,是個很好的資源。
  • IRC Channel:在 irc.libera.chat#Nginx 頻道上,有很多熱心的使用者可以幫助你解決問題。

此外,部落格也是一個非常有價值的資源,搜尋引擎上可以找到大量關於 NGINX 組態、模組等方面的文章。

下面我們將從官方網站開始,瞭解如何下載並編譯 NGINX 原始碼。

版本分支

NGINX 是由俄羅斯開發者 Igor Sysoev 在 2002 年啟動的開源專案,自 2004 年首次發布以來,市占率持續成長。根據 2023 年 4 月的一項調查,NGINX 現已服務於網際網路上約 26.23% 的網站。其功能豐富且靈活多變。

目前 NGINX 有三個主要版本分支:

  • 穩定版:這是推薦使用的版本,由開發者和使用者共同認可,但通常會落後於主線版本。
  • 主線版:這是最新的可下載版本,包含最新的開發和錯誤修復。雖然它足夠穩定可以用於生產環境,但仍可能遇到偶爾的小問題。如果你重視穩定性過於新功能,選擇穩定版可能更適合。
  • 舊版:如果你對較舊的版本感興趣,也可以找到一些舊版。

主線版本是否足夠穩定以用於生產環境? NGINX Wiki 的創始人兼維護者 Cliff Wells 指出:「我通常使用並推薦最新的開發版本。它只曾讓我遇到過一次問題!」早期採用者很少報告嚴重問題。你可以根據自己的需求選擇適合你伺服器的版本。NGINX 的開發者們致力於保持新版本的向下相容性,因此書中的指示應該適用於所有版本。

主要功能

截至主線版本 1.25.2,NGINX 提供了豐富的功能,以下是官方網站上的部分主要功能:

  • 靜態檔案和索引檔案提供、自動索引、開放檔案描述符快取、加速反向代理與快取、負載平衡和故障容錯。
  • 加速支援 FastCGI、uWSGI、SCGI 和 memcached 伺服器的快取、負載平衡和故障容錯、模組化架構。篩選器包括 gzip 壓縮、位元組範圍、分塊回應、XSLT、SSI 和影像轉換過濾器。
  • SSL 和 TLS SNI 支援。

此外,NGINX 還可以作為郵件代理伺服器使用。以下是一些關於郵件代理功能的簡要介紹:

  • 使用外部 HTTP 驗證伺服器將使用者重定向到 IMAP/POP3 後端。
  • 使用外部 HTTP 驗證伺服器進行使用者驗證並將連線重定向到內部 SMTP 後端。
  • 支援多種驗證方法:POP3(USER/PASS, APOP, AUTH LOGIN/PLAIN/CRAM-MD5)、IMAP(LOGIN, AUTH LOGIN/PLAIN/CRAM-MD5)、SMTP(AUTH LOGIN/PLAIN/CRAM-MD5)。
  • 支援 SSL、STARTTLS 和 STLS。

NGINX 相容大多數電腦架構和作業系統,包括 Windows、Linux、macOS、FreeBSD 和 Solaris。它在 32 位元和 64 位元架構上都能良好執行。

下載及解壓縮

選擇好要使用的版本後,前往 nginx.org 下載對應的檔案。在你的家目錄中建立一個 src 資料夾來存放要編譯的原始碼,然後使用 wget 下載檔案:

[user@server ~]$ mkdir src && cd src
[user@server src]$ wget https://nginx.org/download/nginx-1.25.2.tar.gz

這裡我們使用的是最新穩定版本 1.25.2(截至 2023 年 9 月)。下載完成後解壓縮檔案:

[user@server src]$ tar zxf nginx-1.25.2.tar.gz

你已成功下載並解壓縮了 NGINX 原始碼。接下來我們需要組態編譯過程以獲得適合你作業系統的二進位制檔案。

組態編譯選項

從原始碼編譯應用程式通常分為三個步驟:組態、編譯和安裝。組態步驟允許你選擇一些在程式建立後無法修改的選項,因為它們會直接影響到專案二進位制檔案。因此這一步非常重要,需要仔細跟隨指示以避免後續出現缺少特定模組或檔案位於隨機資料夾等問題。

編譯過程組態

編譯過程中的組態步驟決定了最終生成的二進位制檔案會包含哪些功能和模組。這一步非常重要,因為一旦編譯完成後就無法再更改這些選項了。玄貓會在接下來探討如何組態這些選項以適應不同需求。

小段落標題:基本組態選項

以下是一些基本組態選項:

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre --with-zlib=../zlib-1.2.11
編譯及安裝過程
make
sudo make install

編譯與安裝

編譯及安裝步驟相對簡單。首先執行 make 命令來編譯原始碼:

[user@server src]$ make

接著使用 sudo make install 安裝編譯好的二進位制檔案:

[user@server src]$ sudo make install

完成以上步驟後,你就可以在指定路徑(如 /usr/local/nginx)找到 NGINX 二進位制檔案了。

組態與啟動

組態檔案

安裝完成後需要組態 NGINX 的設定檔。預設情況下設定檔位於 /usr/local/nginx/conf/nginx.conf 。開啟設定檔進行必要修改:

sudo nano /usr/local/nginx/conf/nginx.conf
小段落標題:設定基本伺服器區塊

在設定檔中設定基本伺服器區塊:

server {
    listen       80;
    server_name  localhost;

    location / {
        root   html;
        index  index.html index.htm;
    }
}

啟動 NGINX

組態完成後可以啟動 NGINX:

[user@server ~]$ sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

驗證執行狀態

你可以透過存取 http://localhosthttp://<your_server_ip> 驗證 NGINX 是否正常執行。如果一切正常,你應該看到預設歡迎頁面。

停止及重啟

如果需要停止或重啟 NGINX ,可以使用以下命令:

# 停止 NGINX
sudo /usr/local/nginx/sbin/nginx -s stop

# 檢查組態檔案語法是否正確並重啟 NGINX (推薦)
sudo /usr/local/nginx/sbin/nginx -s reload

# 優雅重啟(不中斷現有連線)
sudo /usr/local/nginx/sbin/nginx -s reopen

# 停止所有連線並立即離開(不推薦)
sudo /usr/local/nginx/sbin/nginx -s quit
小段落標題:常見組態引數說明
商用組態引數舉例:
worker_processes auto;               # 自動根據 CPU 數量設定 worker_processes 數量
events {
    worker_connections 1024;         # 每個 worker 能處理多少連線數量(限制取決於作業系統)
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;             # 開啟 sendfile 功能提高檔案傳輸效率
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout   65;         # keepalive 超時時間設為65秒

    gzip            on;             # 開啟 gzip 壓縮提高網路傳輸效率

    server {
        listen       80;
        server_name  example.com;

        location / {
            root   /path/to/root;
            index  index.html index.htm;
        }
    }
}
小段落標題:此圖示展示了 NGINX 基本工作流程:
graph TD;
    A[Client Request] --> B[Worker Process];
    B --> C{Static File?};
    C -- Yes --> D[Serve Static File];
    C -- No --> E{Reverse Proxy?};
    E -- Yes --> F[Forward Request to Backend Server];
    E -- No --> G{Application Server?};
    G -- Yes --> H[Forward Request to Application Server];
    G -- No --> I[Return Error Page];
    D --> J[Return Response];
    F --> K[Receive Response from Backend Server];
    K --> J;
    H --> L[Receive Response from Application Server];
    L --> J;
    I --> J;
小段落標題:此圖示展示了 NGINX 工作流程中的負載平衡策略:
graph TD;
   A[Client Request] --> B{Load Balancer};
   B --> C[Server A];
   B --> D[Server B];
   B --> E[Server C];

   C --> F{Available?};
   D --> G{Available?};
   E --> H{Available?};

   F -- Yes --> I[Handle Request];
   F -- No --> B;

   G -- Yes --> I;
   G -- No --> B;

   H -- Yes --> I;
   H -- No --> B;

   I --> J[Return Response to Client]

組態反向代理

反向代理是 NGINX 一個強大功能之一,透過反向代理可以將請求轉發到不同的伺服器或應用程式例項上以達到負載平衡和高用性目的。

小段落標題:反向代理基本組態範例:
http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen       80;
        server_name example.com;

        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;
        }
    }
}
小段落標題:內容解密:
  1. upstream 標籤 : 用來定義後端伺服器叢集。
  2. proxy_pass :將客戶端請求轉發到上游伺服器叢集。
  3. proxy_set_header :設定請求頭資訊以便傳遞客戶端 IP 地址等資訊給後端伺服器。

安全性組態

SSL/TLS 組態

SSL/TLS 是確保資料傳輸安全性的一個重要手段。以下是如何在 NGINX 中組態 SSL/TLS 的基本步驟:

小段落標題:SSL/TLS 基本組態範例:
server {
    listen       443 ssl;
    server_name example.com;

    ssl_certificate     /path/to/ssl_certificate.crt;
    ssl_certificate_key /path/to/ssl_certificate.key;

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2; # only allow secure protocols (excluting older SSL protocols)
    ssl_ciphers         HIGH:!aNULL:!MD5; # Disable weak ciphers (excluting MD5-based ciphers)

    location / {
        root   /path/to/root;
        index index.html index.htm;
    }
}
小段落標題:內容解密:
  1. listen :監聽 HTTPS 點 (443)。
  2. ssl_certificatessl_certificate_key :指定 SSL 憑據檔案路徑。
  3. ssl_protocols :指定允許使用的 SSL/TLS協定。
  4. ssl_ciphers :指定允許使用的加密套件。

防火牆與防毒軟體整合

除了 SSL/TLS 組態外還有一些安全性措施需要注意例如防火牆與防毒軟體整合;例如 iptables 用來防止不必要地攻擊;iThemes Security 外掛用來保護 WordPress 網站等安全性措施。

高階特性與最佳實踐

檢視日誌

檢視日誌是排查問題和監控系統健康狀況的一個重要手段。NGINX 提供了多種日誌格式和日誌管理工具來幫助你更好地管理日誌檔案。

小段落標題:常見日誌格式範例:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';

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

error_log /var/log/nginx/error.log warn;
小段落標題:內容解密:
  1. log_format :自定義日誌格式名稱。
  2. access_log :設定存取日誌路徑及格式。
  3. error_log :設定錯誤日誌路徑及日誌級別(error, warn, info, debug)。

效能最佳化技巧

小段落標題:調整 worker_processes 數量:

根據 CPU 的核心數量調整 worker_processes 數量可以提升處理能力:

worker_processes auto; # 自動根據 CPU 數量設定 worker_processes 數量。
小段落標題:啟用 gzip 壓縮提高傳輸效率:
gzip on;              # 開啟 gzip 壓縮功能;
gzip_min_length      1k;             # 壓縮內容長度達到此值才進行壓縮;
gzip_buffers         4              # 指令設定 gzip 壓縮所需要快取大小;
gzip_http_version     gzip http/1.0;             # 指令表示壓縮資料要求 http 的協定為 http/1.x;

gzip_types text/plain application/x-javascript application/xml application/xml+rss text/css text/javascript text/x-js application/x-shockwave-flash image/svg+xml font/font-symbol font/vml x-font-x-icon x-font-opentype x-font-opentype-generic x-font-opentype-variant x-font-opentype-style x-font-opentype-weight x-font-opentype-stretch x-font-opentype-adstyle x-font-opentype-vendor x-font-opentype-product x-font-opentype-variant-ligature x-font-opentype-variant-alt x-font-opentype-variant-alt-ligature x-font-opentype-variant-alt-capitalization x-font-opentype-variant-alt-case-sensitivity x-font-opentype-variant-alt-character-set x-font-opentype-variant-alt-display-sensitivity x-font-opentype-variant-alt-histogram-level-x y;font-family:style font-family:weight font-family:style font-family:width font-family:slant font-family:width-integer font-family:slant-integer font-family:slant-angle font-family:slant-angle integer font-family:slant-angle integer font-style name font-weight name font-style name font-weight name font-style name;font-size;font-size medium;font-size small;font-size large;font-size extra-large;font-size xx-large;font-size xxx-large;font-size small-caps;font-size small-caps bold;font-size small-caps normal weight;font-size small-caps bold weight;font-size small-caps bold italic weight;font-size small-caps bold italic normal weight;font-stretch:none;font-stretch:-condensed;font-stretch:-extra-expanded;font-stretch:-expanded;# 各種資料型別應用壓縮;
小段落標題:內容解密:

1.gzip on : 啟用 gzip 壓縮功能. 2.gzip_min_length : 長度小於此值不進行壓縮. 3.gzip_buffers : gzip 壓縮所需要快取大小. 4.gzip_http_version: 指令表示壓縮資料要求 http 的協定為 http/1.x. 5.gzip_types: 各種資料型別應用壓縮.

未來趨勢與技術預測

隨著技術不斷演進與市場需求變化;未來隨著 AI 人工智慧技術逐漸普及更加智慧化;而區塊鏈技術也逐漸普及;以及物聯網(IoT) ,邊緣計算技術更加廣泛地應用等等將深刻改變各行各業;也會對目前成熟技術如 Nginx 在未來提出更高要求;例如更加強調安全性與隱私保護;還有對高效能與低延遲需求等等.

玄貓相信隨著技術不斷演進未來 Nginx 或許會提供更多智慧化功能;未來或許會利用AI技術進行自動化維運;或許利用AI加入自我修復機制等等或許還有更多意想不到方面對 Nginx 的最佳化吧!