在 Linux 環境下,將 NGINX 設定為系統服務能有效管理其執行狀態,並確保開機自啟動。首先,需建立一個 systemd 服務檔案,定義 NGINX 的啟動、停止和重啟方式。該檔案需包含 NGINX 可執行檔案的路徑、組態檔案位置以及相關依賴項,例如網路服務。建立完畢後,使用 systemctl 命令即可控制 NGINX 服務的啟停和重啟。過程中,可能會遇到一些錯誤,例如組態檔案語法錯誤或埠衝突,需仔細檢查組態檔案並根據錯誤資訊排除故障。NGINX 的組態檔案結構清晰,主要由區塊組成,例如 events、http、server 和 location 等。每個區塊包含特定的指令,用於控制 NGINX 的行為。events 區塊主要管理網路連線,http 區塊則定義 HTTP 伺服器的相關設定,server 區塊組態虛擬主機,而 location 區塊則根據 URI 路徑比對不同的請求。理解這些區塊和指令的用法,是組態 NGINX 的關鍵。此外,NGINX 的組態檔案也支援繼承機制,子區塊會繼承父區塊的組態,簡化了組態過程。一些常用的指令,例如 worker_connections、access_log、log_format 等,用於控制連線數、存取日誌和日誌格式等。熟悉這些指令的用法,可以更好地管理和監控 NGINX 的執行狀態。

NGINX 服務設定與基本組態

在這篇文章中,玄貓將詳細介紹如何在系統中設定 NGINX 服務並進行基本組態。這包括如何將 NGINX 新增為系統服務、處理常見錯誤以及使用 NGINX Plus 提供的高階功能。接下來,玄貓將探討 NGINX 組態檔案的語法和基本模組指令,幫助讀者建立適當的網頁伺服器組態。

在系統中設定 NGINX 服務

首先,玄貓將介紹如何將 NGINX 作為系統服務來設定。這樣可以確保 NGINX 在系統啟動時自動啟動,並且可以透過 systemctl 命令來管理。

步驟一:建立系統服務檔案

  1. 使用以下命令建立一個名為 nginx.service 的檔案:

    nano /etc/systemd/system/nginx.service
    

    這個檔案將包含 NGINX 的系統服務組態。確保路徑正確,並且 After= 部分告訴 systemd 在啟動 syslog.targetnetwork-online.target 之後再執行 NGINX。你可以根據需要新增其他服務,如資料函式庫伺服器或 PHP 伺服器。

  2. 儲存檔案後,重新載入 systemd 組態:

    systemctl daemon-reload
    
  3. 啟動 NGINX 服務:

    systemctl start nginx
    

    你可以透過相同的方式來啟動、停止和重啟服務。

  4. 若要在開機時自動啟動 NGINX,請執行以下命令:

    systemctl enable nginx
    
  5. 若要防止 NGINX 在開機時自動啟動,請使用以下命令:

    systemctl disable nginx
    
  6. 檢查 NGINX 是否會在開機時啟動:

    systemctl is-enabled nginx
    

    如果顯示 enabled,則表示 NGINX 已設定為在開機時自動啟動。

處理常見錯誤

在使用 systemd 啟動 NGINX 時,可能會遇到一些錯誤。這時可以使用以下命令來檢查當前狀態:

systemctl status nginx

這通常會告訴你為什麼 NGINX 無法啟動。常見原因是組態檔案中有錯誤,如拼寫錯誤或遺漏字元。檢查並修正組態檔案後,再嘗試重新啟動 NGINX。

探索組態檔案語法

NGINX 的組態檔案是由管理員編輯的純文字檔案,並由程式解析以定義程式的行為。在 Linux 作業系統中,大多數應用程式依賴於複雜的組態檔案。NGINX 的組態語法相對簡潔明瞭,易於管理和維護。

組態語法介紹

NGINX 組態檔案由多個模組組成,每個模組包含一組指令和引數。以下是一些基本概念:

  • 主組態區塊:這是整個組態檔案的起點,包含全域性設定。
  • 事件區塊:定義與網路連線相關的設定。
  • HTTP 區塊:定義 HTTP 伺服器相關的設定。
  • 伺服器區塊:定義虛擬主機的設定。
  • 位置區塊:定義 URL 路徑對應的處理規則。
# 主組態區塊開始
user nginx;
worker_processes auto;

# 除錯日誌設定
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# 工作程式設定
events {
    worker_connections 1024;
}

# HTTP 組態區塊開始
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # 日誌格式設定
    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;

    # 虛擬主機設定開始
    server {
        listen       80;
        server_name  localhost;

        # 網站根目錄設定
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

        # 錯誤頁面設定
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}
# HTTP 組態區塊結束

# 主組態區塊結束

基本模組指令

以下是一些常見的基本模組指令:

  • user:指定執行 Nginx 工作程式的使用者和組。
  • worker_processes:指定 Nginx 工作程式的數量。
  • error_log:指定錯誤日誌的位置。
  • pid:指定 Nginx 主程式的 PID 檔案位置。
  • events:定義與網路連線相關的設定。
  • http:HTTP 組態區塊。

測試與維護網頁伺服器

在完成基本組態後,玄貓建議進行測試以確保一切正常執行。以下是一些測試步驟:

  1. 建立一個測試 HTML 頁面:
<!DOCTYPE html>
<html>
<head>
    <title>Test Page</title>
</head>
<body>
    <h1>Welcome to the Test Page!</h1>
</body>
</html>

將這個 HTML 頁面儲存到 /usr/share/nginx/html/index.html

  1. 測試網頁伺服器: 開啟瀏覽器並存取 http://localhost,應該能夠看到剛剛建立的測試頁面。

  2. 測試錯誤頁面: 可以嘗試存取一個不存在的 URL,如 http://localhost/nonexistent,應該能夠看到自定義的錯誤頁面。

推薦進階功能:NGINX Plus

NGINX Plus 是由 Nginx, Inc. 提供的一種付費訂閱版本,包含了高階功能和專業支援。適合大型企業需要無縫整合 NGINX 到全球架構中的情況。NGINX Plus 提供了更高效能和可擴充套件性。

此圖示展示了 NGINX Plus 的高階功能概覽:
```mermaid
graph TD;
A[NGINX Plus] --> B[高效能]
A --> C[可擴充套件性]
A --> D[專業支援]
B --> E[高吞吐量]
C --> F[負載平衡]
D --> G[技術支援]

語境解說:

高效能與可擴充套件性:

NGINX Plus 提供高效能和可擴充套件性功能,如高吞吐量和負載平衡。這些功能使得企業可以根據需求靈活調整資源分配。

做好專業支援:

專業支援是付費訂閱的一大亮點。Nginx, Inc. 的專業團隊提供技術支援和協助解決問題。

NGINX 基本組態

在當今的網路環境中,各種應用程式都有自己獨特的組態檔案語法和風格。PHP 使用 Windows 格式的 .ini 檔案,Sendmail 則使用 M4 宏處理器來編譯組態檔案,Zabbix 更是從 MySQL 資料函式庫中讀取其組態。不幸地,並沒有一個廣泛認可的標準來統一這些組態語法和風格。NGINX 也是如此,你必須學習它獨特的語法及其特有的用詞。

NGINX 組態指令

NGINX 的組態檔案可以被描述為一系列按照邏輯結構組織的指令。整個應用程式的行為都是由這些指令的值來定義的。預設情況下,NGINX 使用一個主要的組態檔案,其路徑在安裝過程中已經定義好。如果你沒有修改組態檔案路徑和字首選項,它應該位於 /usr/local/nginx/conf/nginx.conf。然而,如果你是使用套件管理器安裝 NGINX 的話,組態檔案可能位於 /etc/nginx/nginx.conf

以下是一些基本的 NGINX 組態指令:

#user nobody;
worker_processes 1;

# 字元可以看出,第一行是註解,它不會被解釋且沒有任何實際價值,只是給閱讀者提供一些說明或暫時停用現有組態部分。第二行則是實際的指令,表示 NGINX 應該以單一 worker 處理程式執行。

內容解密:

  • 註解:在組態檔中使用 # 開頭來新增註解,這些註解不會影響程式執行。
  • 指令worker_processes 是一個指令,表示 NGINX 應該以多少個 worker 處理程式來執行。在這裡設定為 1
  • 語法:每個指令都必須以分號 (;) 結尾。

組態檔案組織與包含

nginx.conf 檔案中,你可能會看到 include 指令:

include mime.types;

這個指令會包含指設定檔案中的內容到當前位置。以下是一個實際範例:

# nginx.conf
user nginx nginx;
worker_processes 4;
include other_settings.conf;

# other_settings.conf
error_log logs/error.log;
pid logs/nginx.pid;

最終結果如下:

user nginx nginx;
worker_processes 4;
error_log logs/error.log;
pid logs/nginx.pid;

包含機制是遞迴處理的,你可以在 other_settings.conf 中再次使用 include 指令來包含另一個檔案。

在初始設定中,有兩個主要的組態檔案:nginx.confmime.types。但在更高階的組態中,可能會有更多的檔案,例如 fastcgi.confproxy.confsites.conf

模組化與指令塊

NGINX 的設計是模組化的,每個模組都帶來了一組特定的指令。例如:

events {
    worker_connections 1024;
}

這裡的 events 是一個指令塊,允許邏輯地構建組態。

內容解密:

  • 模組化:NGINX 的設計使得每個模組都可以帶來一組特定的指令。
  • 指令塊:如 events 指令塊,允許邏輯地構建組態。

NGINX 基本組態

在進行 NGINX 組態時,瞭解其組態檔案結構及其相關指令是非常重要的。以下是對 NGINX 基本組態的深入解析,旨在幫助讀者更好地理解和應用。

組態檔案結構

NGINX 組態檔案的基本結構由多個巢狀的區塊組成,每個區塊都有其特定的作用和範圍。以下是一些關鍵區塊的解說:

  1. 事件區塊(events block): 事件區塊由 events 模組控制,該模組的指令僅能在這個區塊內使用。例如,worker_connections 只在事件區塊內具有意義。

  2. 主區塊(main block): 主區塊位於組態檔案的根部,包含了對整個伺服器有全域性影響的指令。這些指令會影響所有的伺服器和位置組態。

  3. HTTP 區塊(http block): HTTP 區塊是最頂層的指令區塊,可以包含各種組態指令和一個或多個伺服器區塊。每個伺服器區塊代表一個虛擬主機,即一個要託管在機器上的網站。

  4. 伺服器區塊(server block): 伺服器區塊用於組態虛擬主機。例如,下面的組態表示監聽 80 專案並將所有來自 example.com 的 HTTP 請求轉發到 /admin/ 路徑:

http {
    server {
        listen 80;
        server_name example.com;
        access_log /var/log/nginx/example.com.log;

        location ^~ /admin/ {
            index index.php;
        }
    }
}
  1. 位置區塊(location block): 在伺服器區塊內,可以嵌入一個或多個位置區塊。這些位置區塊允許根據請求的 URI 路徑設定特定的組態。例如,下面的組態表示當請求 URI 以 /admin/ 開頭時,將啟用 index.php 檔案:
location ^~ /admin/ {
    index index.php;
}

組態遺傳

組態遺傳是 NGINX 組態檔案的一個重要特性。子區塊會繼承父區塊的組態。例如,access_log 指令在伺服器區塊中設定後,會適用於所有子位置區塊,除非在子位置區塊中重新設定:

server {
    access_log /var/log/nginx/example.com.log;

    location ^~ /admin/ {
        index index.php;
        access_log off;
    }
}

在這個例子中,除了 /admin/ 路徑外,網站上的其他請求都會被記錄在日誌中。

高階語法規則

NGINX 組態檔案語法有一些特殊規則需要注意:

  1. 指令語法: 每個指令都有其特定的語法。例如,rewrite 指令可以使用複雜的正規表示式來比對特定模式:
rewrite ^/(.*)\.(png|jpg|gif)$ /image.php?file=$1&format=$2 last;
  1. 單位縮寫: 在指令值中,可以使用縮寫來表示檔案大小和時間:
  • kK:千位元組 (Kilobytes)
  • mM:兆位元組 (Megabytes)
  • gG:吉位元組 (Gigabytes)
client_max_body_size 2G;
client_max_body_size 2048M;
client_max_body_size 2097152k;
  1. 時間單位: 時間值可以使用以下縮寫:
  • ms:毫秒 (Milliseconds)
  • s:秒 (Seconds)
  • m:分鐘 (Minutes)
  • h:小時 (Hours)
  • d:天 (Days)
  • w:週 (Weeks)
  • M:月 (30 天)
  • y:年 (365 天)
client_body_timeout 3m;
client_body_timeout 180s;
client_body_timeout 180;
  1. 變數: 模組提供變數來動態設定指令值。變數以 $ 開頭。例如,NGINX HTTP 主模組定義了 $nginx_version 變數:
location ^~ /admin/ {
    access_log logs/main.log;
    log_format main '$pid - $nginx_version - $remote_addr';
}

此圖示

  graph TD;
    A[HTTP 區塊] --> B[Server 區塊];
    A --> C[另一個 Server 區塊];
    B --> D[Location 區塊];
    C --> E[另一個 Location 區塊];

內容解密:

此圖示展示了 HTTP、Server 和 Location 區塊之間的巢狀關係。HTTP 區塊是最頂層的指令區塊,包含一或多個 Server 區塊;每個 Server 區塊則可以包含一或多個 Location 區塊。這種結構使得 NGINX 能夠靈活地處理不同網域名稱和路徑下的請求。

指令詳細解說

worker_connections

syntax: worker_connections number; 預設值: worker_connections 512;** 上下文: events

工作程式連線數設定為每個工作程式能夠同時開啟的最大連線數量。 一旦建立了新連線後不會再超過設定值。 若連線超過最大限制會出現錯誤碼503:Service Unavailable。 此限制不能超過作業系統的最大連線數限制。

access_log

syntax: access_log path [format [buffer=size] [flush=time] [if=condition] [gzip[=level]] [proxy] [buffering=on|off]]; default: access_log logs/access.log combined; context: http, server, location, if in location 該命令用於設定存取紀錄檔案路徑及格式。 此處針對所有存取紀錄檔案以及所需存取紀錄檔案格式做設定。 若不需要存取紀錄可將命令off。

log_format

syntax: log_format name [escape=default|json|none] string...; 預設值: log_format combined ‘$remote_addr - $remote_user [$time_local] ' ‘"$request" $status $body_bytes_sent ' ‘"$http_referer" “$http_user_agent”’; 上下文: http

此命令用於設定存取紀錄檔案格式名稱及格式。 使用者可依照需求設計自訂存取紀錄格式及命名方式。 目前已知name引數之預設值為combined.

client_body_timeout

syntax: client_body_timeout time; 預設值: client_body_timeout 60;** 上下文: http, server, location

客戶端提交 request body 的時間限制。 此項設定對長時間提交資料之客戶端有助益。 time為時間長度預設單位為秒。 若超過此設定時間後客戶端仍未完成提交資料則會出現錯誤碼408: Request Timeout. 此項設定適用於傳送大量資料之需求。

client_max_body_size

syntax: client_max_body_size size; 預設值: client_max_body_size 1m;** 上下文: http, server, location

客戶端提交 request body 的最大容量限制。 此項設定用以防止攻擊者透過上傳大型檔案攻擊伺服器系統資源。 size為可接受最大容量單位為byte. 若超過此限制則會出現錯誤碼413:Request Entity Too Large. 預設允許最大提交容量為1MB.

摘要

透過對 NGINX 基本組態結構和高階語法規則的瞭解,可以更靈活地進行網站組態和最佳化。NGINX 的強大功能和靈活性使其成為現代網站架構中的重要選擇。希望這篇文章能幫助你更好地理解和應用 NGINX 組態技術。