在 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 命令來管理。
步驟一:建立系統服務檔案
-
使用以下命令建立一個名為
nginx.service的檔案:nano /etc/systemd/system/nginx.service這個檔案將包含 NGINX 的系統服務組態。確保路徑正確,並且
After=部分告訴 systemd 在啟動syslog.target和network-online.target之後再執行 NGINX。你可以根據需要新增其他服務,如資料函式庫伺服器或 PHP 伺服器。 -
儲存檔案後,重新載入 systemd 組態:
systemctl daemon-reload -
啟動 NGINX 服務:
systemctl start nginx你可以透過相同的方式來啟動、停止和重啟服務。
-
若要在開機時自動啟動 NGINX,請執行以下命令:
systemctl enable nginx -
若要防止 NGINX 在開機時自動啟動,請使用以下命令:
systemctl disable nginx -
檢查 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 組態區塊。
測試與維護網頁伺服器
在完成基本組態後,玄貓建議進行測試以確保一切正常執行。以下是一些測試步驟:
- 建立一個測試 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。
-
測試網頁伺服器: 開啟瀏覽器並存取
http://localhost,應該能夠看到剛剛建立的測試頁面。 -
測試錯誤頁面: 可以嘗試存取一個不存在的 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.conf 和 mime.types。但在更高階的組態中,可能會有更多的檔案,例如 fastcgi.conf、proxy.conf 和 sites.conf。
模組化與指令塊
NGINX 的設計是模組化的,每個模組都帶來了一組特定的指令。例如:
events {
worker_connections 1024;
}
這裡的 events 是一個指令塊,允許邏輯地構建組態。
內容解密:
- 模組化:NGINX 的設計使得每個模組都可以帶來一組特定的指令。
- 指令塊:如
events指令塊,允許邏輯地構建組態。
NGINX 基本組態
在進行 NGINX 組態時,瞭解其組態檔案結構及其相關指令是非常重要的。以下是對 NGINX 基本組態的深入解析,旨在幫助讀者更好地理解和應用。
組態檔案結構
NGINX 組態檔案的基本結構由多個巢狀的區塊組成,每個區塊都有其特定的作用和範圍。以下是一些關鍵區塊的解說:
-
事件區塊(events block): 事件區塊由
events模組控制,該模組的指令僅能在這個區塊內使用。例如,worker_connections只在事件區塊內具有意義。 -
主區塊(main block): 主區塊位於組態檔案的根部,包含了對整個伺服器有全域性影響的指令。這些指令會影響所有的伺服器和位置組態。
-
HTTP 區塊(http block): HTTP 區塊是最頂層的指令區塊,可以包含各種組態指令和一個或多個伺服器區塊。每個伺服器區塊代表一個虛擬主機,即一個要託管在機器上的網站。
-
伺服器區塊(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;
}
}
}
- 位置區塊(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 組態檔案語法有一些特殊規則需要注意:
- 指令語法:
每個指令都有其特定的語法。例如,
rewrite指令可以使用複雜的正規表示式來比對特定模式:
rewrite ^/(.*)\.(png|jpg|gif)$ /image.php?file=$1&format=$2 last;
- 單位縮寫: 在指令值中,可以使用縮寫來表示檔案大小和時間:
k或K:千位元組 (Kilobytes)m或M:兆位元組 (Megabytes)g或G:吉位元組 (Gigabytes)
client_max_body_size 2G;
client_max_body_size 2048M;
client_max_body_size 2097152k;
- 時間單位: 時間值可以使用以下縮寫:
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;
- 變數:
模組提供變數來動態設定指令值。變數以
$開頭。例如,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 組態技術。