Nginx 簡介
Nginx 功能介紹
Nginx(發音為 "Engine X")是一個功能強大、高效能的網頁伺服器(Web Server)、反向代理(Reverse Proxy)及負載均衡(Load Balancer)軟體。以下將分別介紹其主要功能:
-
網頁伺服器(Web Server):
- Nginx 作為網頁伺服器時,主要用於托管網站,處理來自客戶端(如瀏覽器)的 HTTP 請求,並返回網頁內容,如 HTML、CSS、JavaScript 檔案等。
- 它的效能高、資源消耗低,特別適合於處理高並發的請求,常被用於大型網站和高流量網站。
-
反向代理(Reverse Proxy):
- 作為反向代理,Nginx 能夠接收來自客戶端的請求,然後將這些請求轉發到後端的伺服器(如應用伺服器)。
- 這種方式可以提升安全性,因為它隱藏了後端伺服器的真實 IP,並且可以進行請求的過濾、監控和日誌記錄。
-
負載均衡(Load Balancer):
- Nginx 可以將流量均勻地分配到多個後端伺服器,這樣可以提高網站的可用性和可擴展性。
- 它支持多種負載均衡策略,例如輪詢(Round-Robin)、最少連接(Least Connections)和 IP 哈希(IP Hash)等。
除此之外,Nginx 還支持以下功能:
- HTTPS 加密:透過 SSL/TLS 協議來加密客戶端和伺服器之間的通訊,保障數據安全。
- 緩存(Caching):提供靜態和動態內容的緩存功能,加快響應速度,降低後端伺服器的負擔。
- 壓縮(Compression):通過壓縮響應內容(例如使用 gzip),可以減少數據傳輸量,加快頁面加載速度。
- URL 重寫(URL Rewriting):提供強大的 URL 處理和重寫功能,有助於 SEO 優化和網址管理。
安裝 Nginx
以下是在不同作業系統上安裝 Nginx 的基本步驟:
參考資料: Installing nginx
Windows 安裝 Nginx
- 下載
- 訪問 Nginx 官方網站 下載 Windows 版本的 Nginx。
-
選擇適合的版本進行下載,一般選擇穩定版 (Stable version)。
-
安裝
- 解壓縮下載的文件到指定目錄。
-
打開命令提示字元,切換到 Nginx 目錄。
-
啟動
- 在命令提示字元中執行
start nginx
啟動 Nginx。
macOS 安裝 Nginx
- 安裝 Homebrew
-
如果尚未安裝 Homebrew,請在終端機執行以下命令:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
-
安裝 Nginx
-
使用 Homebrew 安裝 Nginx:
brew install nginx
-
啟動
- 啟動 Nginx:
sudo nginx
Ubuntu 安裝 Nginx
- 更新套件庫
-
在終端機執行:
sudo apt update sudo apt upgrade
-
安裝 Nginx
-
安裝 Nginx:
sudo apt install nginx
-
啟動和管理
- 啟動 Nginx:
sudo systemctl start nginx
- 啟用開機自動啟動:
sudo systemctl enable nginx
配置與驗證
- 無論在哪個平台,安裝後可以通過訪問
http://localhost
或127.0.0.1
在瀏覽器中檢查 Nginx 是否運行。 - Nginx 的配置文件通常位於
/etc/nginx/nginx.conf
(Linux/macOS) 或安裝目錄下的conf/nginx.conf
(Windows)。 - 修改配置後,可使用命令
nginx -s reload
來重新加載設定。
停止 Nginx
停止執行中的 Nginx 服務,可以根據作業系統的不同而有不同的方法。以下是幾種常見作業系統下停止 Nginx 服務的步驟:
Windows
- 打開命令提示字元。
- 切換到 Nginx 的安裝目錄。
- 執行以下命令停止 Nginx:
nginx -s stop
macOS 和 Linux
- 打開終端機。
- 使用以下命令停止 Nginx:
或者,如果你是使用系統服務管理器 (如 systemd):
sudo nginx -s stop
sudo systemctl stop nginx
補充說明
nginx -s stop
命令會立即停止 Nginx 服務。- 你也可以使用
nginx -s quit
命令,這將會優雅地停止 Nginx 服務,處理完所有當前的連線後再退出。 - 如果你是使用系統服務管理器 (如 systemd),則
sudo systemctl stop nginx
命令會是更常見的做法。
Nginx 配置範例與說明
以下是使用 Nginx 作為 Web Server、Reverse Proxy、Load Balancer(使用 Round-Robin 算法)以及實施 A/B 部署的配置範例。
Web Server
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
這個配置將 Nginx 設定為一個基本的 Web Server,用於處理對 example.com
的請求,並將請求路由到 /var/www/example.com
目錄。
Reverse Proxy
server {
listen 80;
server_name proxy.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;
}
}
這個配置將 Nginx 設定為 Reverse Proxy,將所有進入 proxy.example.com
的請求轉發到後端服務器(backend_server
)。
Nginx Load Balancer
以下設定採用 Round-Robin 算法來分配流量:
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name loadbalancer.example.com;
location / {
proxy_pass http://backend;
}
}
}
在這個配置中,Nginx 將作為一個 Load Balancer,使用 Round-Robin 算法在多個後端服務器(backend1.example.com
, backend2.example.com
, backend3.example.com
)之間分配請求。
Nginx 實施 A/B 部署
upstream backend_a {
server backend_a1.example.com;
server backend_a2.example.com;
}
upstream backend_b {
server backend_b1.example.com;
server backend_b2.example.com;
}
server {
listen 80;
server_name ab.example.com;
location / {
split_clients "${remote_addr}AAA" $variant {
50% .a;
* .b;
}
if ($variant = .a) {
proxy_pass http://backend_a;
}
if ($variant = .b) {
proxy_pass http://backend_b;
}
}
}
在 A/B 部署的配置中,Nginx 使用 split_clients
模組將流量根據設定的權重分配到不同的後端群組(在本例中為 backend_a 和 backend_b),實現 A/B 測試或藍綠部署。
輸出 JSON 結構化日誌
要配置 Nginx 以輸出結構化 JSON 日誌(適用於 Fluentd 或其他日誌處理系統),您需要在 Nginx 的設定檔進行修改。以下是一個配置示例,展示了如何設置 Nginx 以輸出 JSON 格式的日誌:
定義 JSON 日誌格式
首先,在 Nginx 的 http
塊中定義一個新的日誌格式。可以在 Nginx 的主設定檔(例如 /etc/nginx/nginx.conf
)中完成。
http {
log_format json_combined escape=json '{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request":"$request",'
'"status": $status,'
'"body_bytes_sent": $body_bytes_sent,'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"http_host":"$http_host",'
'"server_name":"$server_name",'
'"request_time":$request_time,'
'"upstream_response_time":"$upstream_response_time"'
'}';
...
}
這個 log_format
指令定義了一個名為 json_combined
的新日誌格式,其中包含了各種 Nginx 變量,並以 JSON 格式輸出。
指定日誌文件的輸出格式
接下來,在您的 server
塊中指定使用此 JSON 格式輸出日誌:
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/access.log json_combined;
location / {
...
}
}
在這裡,access_log
指令將日誌文件設置為 /var/log/nginx/access.log
,並使用之前定義的 json_combined
格式。
重載 Nginx 配置
配置完成後,您需要重新載入或重啟 Nginx 以應用這些更改:
sudo nginx -s reload
與 Fluentd 整合
完成上述設定後,Nginx 會將訪問日誌以 JSON 格式寫入指定的文件。Fluentd 可以配置為讀取這個日誌文件,並進行後續的處理和分析。
請根據您的具體需求和環境調整上述配置。例如,日誌文件的位置(/var/log/nginx/access.log
)和伺服器名稱(example.com
)應根據您的實際情況進行修改。