編譯安裝 NGINX 前,需先安裝必要的編譯工具和函式庫。系統通常已預裝 GCC,若無則需透過套件管理器(如 yum、apt)安裝。接著,安裝 NGINX 運作所需的 PCRE、zlib 和 OpenSSL 函式庫,這些函式庫提供正規表示式、壓縮演算法和 SSL/TLS 加密功能。準備好相依套件後,即可從 NGINX 官方網站下載原始碼,並使用 tar 解壓縮。進入解壓縮後的目錄,執行 configure 指令設定安裝路徑、模組和功能,再以 make 編譯程式碼。最後,使用 make install 完成安裝。NGINX 的設定檔位於 /etc/nginx/nginx.conf,其中包含全域設定、事件設定和 HTTP 設定等區塊。HTTP 區塊內可定義多個 server 區塊,每個 server 區塊代表一個虛擬主機,並可設定監聽埠、網域名稱、根目錄等。location 區塊則用於比對不同的 URL 路徑,並設定對應的處理方式,例如反向代理、靜態檔案服務等。NGINX 提供許多引數可供調校,例如 worker_processes、worker_connections、keepalive_timeout 等,可根據系統資源和負載情況調整,以提升效能。

下載與安裝 NGINX

NGINX 是一個以 C 語言撰寫的程式,因此首先需要在您的系統上安裝一個編譯工具,例如 GNU 編譯器套件(GCC)。GCC 可能已經安裝在您的系統上,但如果沒有,您必須先進行安裝。

安裝 GNU 編譯器套件

GCC 是一組免費的開源編譯器,適用於多種語言,包括 C、C++、Java、Ada、Fortran 等。它是 Linux 世界中最常用的編譯器套件,Windows 版本也可用。GCC 支援的處理器種類別眾多,包括 x86、AMD64、PowerPC、ARM、MIPS 等。

以下是安裝 GCC 的步驟:

  1. 首先,確認 GCC 是否已經安裝在您的系統上:
[user@server ~]$ gcc

如果看到以下輸出,表示 GCC 已經正確安裝在您的系統上,可以跳至下一節:

gcc: no input files

如果看到以下訊息,則需要繼續進行編譯器的安裝:

bash: gcc: command not found
  1. 使用您的套件管理器的預設倉函式庫來安裝 GCC。根據您的發行版,套件管理器會有所不同。例如,Red Hat Linux 基礎的發行版使用 yum,Debian 和 Ubuntu 使用 apt,SUSE Linux 使用 yast 等。以下是典型的下載和安裝 GCC 套件的方式:
[root@server ~]# yum groupinstall "Development Tools"
  1. 如果使用 apt,執行以下命令:
[root@server ~]# apt-get install build-essentials

如果您使用其他具有不同語法的套件管理器,可以使用 man 命令檢視相關檔案。無論如何,您的套件管理器應該能夠自動解析依賴關係並正確下載及安裝 GCC。

請注意,aptyum 命令不僅會安裝 GCC ,還會下載和安裝所有常見的從原始碼構建應用程式所需的要求專案,例如程式碼標頭和其他編譯工具。

編譯 NGINX 原始碼

要編譯 NGINX ,需要以下函式庫:Perl 相容正規表示式(PCRE)、zlib 和 OpenSSL。

PCRE 函式庫

PCRE 是 NGINX 中重寫和 HTTP 基本模組所需的正規表示式函式庫。PCRE 的完整版本提供了編譯後的函式庫,而 pcre-devel 提供了開發標頭和來源以編譯專案。這些元件對於我們來說都是必要的。

以下是安裝這些套件的一些範例命令:

  • 使用 yum 命令:
[root@server ~]# yum install pcre pcre-devel

或是一併安裝所有 PCRE 相關套件:

[root@server ~]# yum install pcre*
  • 使用 apt 命令:
[root@server ~]# apt install libpcre3 libpcre3-dev

如果這些套件已經安裝在您的系統上,您會看到類別似「nothing to do」的訊息,這意味著套件管理器沒有安裝或更新任何元件。

zlib 函式庫

zlib 提供了壓縮演算法,NGINX 的各個模組需要它來使用 .gzip 壓縮功能。同樣地,您可以使用套件管理器來安裝這個元件,因為它是預設倉函式庫的一部分。與 PCRE 一樣,您也需要 zlib 函式庫和 zlib-dev 元件。

  • 使用 yum 命令:
[root@server ~]# yum install zlib zlib-devel
  • 使用 apt 命令:
[root@server ~]# apt install zlib1g zlib1g-dev

這些套件會快速地安裝並且沒有已知的依賴問題。

OpenSSL

OpenSSL 是一個開源工具包集合,提供了 SSL v2/v3 和 TLS v1 協定以及完整功能的加密函式庫。這個專案由全球志願者共同管理與維護。

NGINX 需要 OpenSSL 函式庫來提供安全網頁服務。因此我們需要安裝函式庫和其開發包。過程依然相同——我們要安裝 openssl 和 openssl-devel:

  • 使用 yum 命令:
[root@server ~]# yum install openssl openssl-devel
  • 使用 apt 命令:
[root@server ~]# apt install openssl libssl-dev

請注意您所在國家/地區的法律和法規。有些國家不允許使用強加密技術。OpenSSL 和 NGINX 專案的作者、出版商及開發者對於任何違規或法律侵權行為概不負責。

下載與編譯 NGINX 原始碼

現在我們已經完成所有必要的準備工作。下面將探討如何下載並編譯 NGINX 的原始碼。

下載最新穩定版本

NGINX 的原始碼可以從官方網站下載。我們先來看看如何下載最新穩定版本:

首先開啟終端機並執行以下命令:

wget http://nginx.org/download/nginx-<version>.tar.gz

請將 <version> 換成實際想要下載版本號(例如:1.25.3)。

下載特定版本

如果需要特定版本而非最新穩定版本時可以參考 NGINX 下載頁面 按需求選擇對應版本號。

檢查 SHA256 檔案完整性

下載完成後檢查 SHA256 檔案完整性以確保下載沒有出錯:

wget http://nginx.org/download/nginx-<version>.tar.gz.sha256sum -O - | sha256sum -c -

如果檢查成功會顯示「OK」。

提取壓縮檔案

接下來提取剛剛下載好的壓縮檔案:

tar -zxvf nginx-<version>.tar.gz
cd nginx-<version>
編譯與安裝

接著進行編譯與安裝步驟:

  1. 編譯:執行以下命令進行編譯。
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-file-aio --with-threads --with-http_addition_module --with-http_auth_basic_module --with-http_autoindex_module --with-http_charset_module --with-http_flv_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-mail_ssl_module --with-stream_realip_module --without-mail_imap_module --without-mail_pop3_module --without-mail_smtp_module

make

安裝過程中的注意事項:

在這個過程中可能會遇到一些錯誤提示:

  1. 缺少標頭檔案或函式庫:確保已經按照前面章節正確地為編譯準備好了依賴函式庫(如PCRE、zlib、OpenSSL等)。

  2. 許可權問題:確保有足夠許可權執行編譯命令和將檔案放置在系統目錄中(通常需要 root 使用者許可權)。

  3. 編譯選項不支援:某些選項可能在你當前編譯環境中不支援或者需要額外組態支援函式庫。

安裝後啟動及驗證:

成功編譯後可以執行以下命令來啟動nginx服務並驗證其執行狀態:

sudo make install

sudo systemctl start nginx

sudo systemctl enable nginx

sudo systemctl status nginx    # 檢視nginx服務狀態確認正常執行。

以上是NGINX從原始碼編譯與基本組態完成過程,後續還可以根據實際需求進一步組態最佳化Nginx引數與設定各類別模組,以滿足具體應用場景需求.


NGINX 組態及最佳化實踐

基礎組態與調整

組態檔案位置與結構:

Nginx 的主組態檔案預設位於 /etc/nginx/nginx.conf ,其他模組組態通常放在 /etc/nginx/conf.d//etc/nginx/sites-enabled/目錄中。

此圖示展示了Nginx組態檔案結構:

  graph TD;
    A[主組態檔案nginx.conf] --> B[include指定目錄];
    A --> C[事件部分];
    A --> D[HTTP部分];
    B --> E[conf.d目錄];
    B --> F[sites-enabled目錄];
    D --> G[伺服器塊];
    D --> H[location塊];
    G --> I[監聽埠與IP];
    G --> J[根目錄設定];
    H --> K[靜態資源處理];
    H --> L[重寫規則];

此圖示展示了Nginx主組態檔案與其相關目錄及塊結構,透過include指定引入其他子組態檔案,HTTP部分主要包括伺服器塊與location塊,伺服器塊設定監聽埠與根目錄等基礎資訊,location塊則用於處理特定路徑請求.

常見引數調整

Nginx 有許多可調整引數來最佳化效能與穩定性,以下列舉一些常見引數及其作用:

  1. worker_processes:設定工作程式數量,通常設為CPU核心數量。
  2. worker_connections:每個工作程式能夠處理最大連線數。
  3. keepalive_timeout:保持連線超時時間,減少頻繁建立連線帶來開銷。
  4. client_max_body_size:客戶端請求體最大大小限制。
  5. sendfile:開啟或關閉sendfile系統呼叫,提升靜態資源傳輸效率。
  6. gzip:開啟Gzip壓縮,減少傳輸資料量。

高階最佳化技巧

動靜分離組態

動靜分離是將動態請求與靜態資源請求分別由不同伺服器處理,以提高回應速度及減少後端服務壓力。Nginx支援透過location塊將動態請求轉發至應用伺服器處理,而將靜態資源直接傳回客戶端:

動靜分離組態示例:
server {
    listen 80;
    server_name 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;
    }

    location /static/ {
        root /path/to/static/files;
        expires max;
        add_header Cache-Control public;
        access_log off;
    }
}

內容解密:

此組態透過location區分動態請求和靜態資源請求,前者透過proxy_pass轉發至應用伺服器處理(如後端應用),而後者直接傳回給客戶端。動態請求轉發時會設定必要頭部資訊如Host、真實IP等以保證正確處理;靜態資源則透過expires指令設定快取過期時間,並透過add_header指令新增Cache-Control頭部資訊以最佳化CDN快取效果。

此外access_log關閉記錄日誌功能,減少IO開銷並提升回應速度.

負載平衡策略

Nginx 提供多種負載平衡演算法來分配流量至多台後端伺服器,常見策略包括輪詢(polling)、最小連線(min_conn)及IP雜湊(ip_hash)等:

負載平衡輪詢策略:
upstream backend {
    server backend1.example.com;
    server backend2.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;
    }
}

內容解密:

此圖示展示了一個簡單Nginx負載平衡輪詢策略示例,透過upstream指令定義名為backend的一組伺服器(backend1.example.com與backend2.example.com),然後透過location區塊將請求轉發至該upstream組中任意一台機器上處理請求並傳回回應。

輪詢策略會依次分配流量至各台機器上進行處理;若希望根據具體情況選擇最佳負載平衡演算法(如最小連線或IP雜湊),可根據實際需求進行相應調整組態引數即可達到預期效果.

安全組態建議

防護DNS反向解析攻擊

DNS反向解析攻擊(DNS反查)可能導致DDoS攻擊甚至暴露敏感資訊,因此應該停用該功能以提升安全性:

DNS反向解析防護:
resolver_timeout 5s;
set_real_ip_from   xx.xx.xx.xx; #實際網路段IP範圍替換xx.xx.xx.xx.
real_ip_header     X-FORWARDED-FOR; #前端代理傳遞實際客戶端IP頭部.
real_ip_recursive on; #遞迴查詢真實客戶端IP.

內容解密:

此圖示展示了一種防護DNS反向解析攻擊(Nginx中DNS反查防護)示例:透過resolver_timeout指定DNS解析超時時間;set_real_ip_from指定允許取得實際客戶端IP來源範圍(即內網網段);real_ip_header則設定從代理傳遞過來頭部資訊取得真實客戶端IP;real_ip_recursive開啟遞迴檢索功能以正確識別出真實客戶端來源地址.採用這種方式可有效防止攻擊者透過DNS反向解析竊取敏感資訊並造成DDoS攻擊等安全問題.

此外還有其他安全策略可以採取如禁止列表過濾無效請求、限制連線速率等手段進一步增強安全性保障.


以上介紹了NGINX從下載到編譯以及基本組態最佳化過程與實踐技巧:包括動靜分離策略負載平衡演算法選擇以及如何防護DNS反向解析攻擊等內容針對具體業務場景進行調整與最佳化即可達到更高效穩定執行效果.