Nginx 相關

Posted by Adam on August 24, 2022
Nginx 是一個非常流行的開源網頁伺服器,除了作為網頁伺服器外,它還可以用作反向代理、負載均衡器以及HTTP快取。下面將透過一些基本步驟來介紹如何安裝和配置 Nginx。 ### 安裝 Nginx 1. **Ubuntu/Debian 系統** 可以使用 `apt` 命令來安裝 Nginx: ```bash sudo apt update sudo apt install nginx ``` 2. **CentOS/RHEL 系統** 在 CentOS 7 或 RHEL 7 上,你可以使用 `yum` 命令來安裝: ```bash sudo yum install epel-release sudo yum install nginx ``` 3. **Windows 系統** 你可以從 Nginx 官方網站下載 Windows 版本的 Nginx。 下載後,解壓縮並運行 `nginx.exe`。 ### 啟動 Nginx 在大多數 Linux 發行版中,你可以使用 systemctl 來啟動 Nginx 服務: ```bash sudo systemctl start nginx ``` 如果你使用的是 Windows,則可以直接運行解壓後的 `nginx.exe`。 ### 配置 Nginx Nginx 的主要配置檔案是 `nginx.conf`,這個檔案通常位於 `/etc/nginx/nginx.conf`。我們來看一個簡單的配置範例: ```nginx http { server { listen 80; # 監聽 80 端口 location / { root /usr/share/nginx/html; # 網站根目錄 index index.html index.htm; } location /images/ { root /data; # 圖像文件存放在 /data/images 目錄下 } } } ``` 這個配置定義了基本的 HTTP 伺服器聽在 80 端口,並設置了網頁的根目錄以及特定於 `/images/` 路徑的更多設定。 ### 測試和重啟 Nginx 當你修改了 Nginx 的配置後,可以用以下命令來測試配置是否正確: ```bash sudo nginx -t ``` 如果顯示為 "syntax is OK",那麼可以安全地重新啟動 Nginx 來應用新配置: ```bash sudo systemctl reload nginx ``` 或在 Windows 上,你可能需要先停止並重新啟動 `nginx.exe`。 ### 常見用途 - **靜態網頁伺服器**:直接將 HTML, CSS, JS 文件放在 Nginx 的 `root` 指定的目錄下。 - **反向代理**:配置 Nginx 以將請求轉發到後端應用伺服器。 - **負載均衡器**:使用 Nginx 的 `upstream` 模塊來分散流量到多個後端伺服器。 這只是 Nginx 功能的入門指南,Nginx 能夠做的遠不止這些。隨著你對它的了解加深,你可以根據自己的需求來做更深入的配置。 --- 在設定 Nginx 來處理 HTTP requests 的時候,有時需要捕捉請求發生的時間,例如為了日誌記錄或其他處理需求。Nginx 提供了內置的變數來獲取與請求相關的時間戳(timestamp)信息。以下是幾種方法來捕捉請求的時間戳: ### 1. 使用 `$time_iso8601` 或 `$time_local` 變數 Nginx 提供了一些變數來直接獲得請求的時間: - `$time_iso8601`:輸出 ISO 8601 標準格式的時間(包括日期和時間) - `$time_local`:輸出本地時間格式的時間 #### 配置範例:紀錄時間到日誌 在 Nginx 配置檔中(通常是 `nginx.conf`),你可以設置 log_format 來包含這些時間變數: ```nginx http { 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 /path/to/access.log main; server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } } } ``` 在這個例子中,所有的訪問請求將會被紀錄在 `/path/to/access.log`,並包括每個請求的本地時間(`$time_local`)。 ### 2. 高級配置:以 millisecond 記錄 request 時間 如果需要更精確的時間(例如毫秒),可以使用 Nginx 的 `ngx_http_lua_module` 模組,透過 Lua 腳本來實現。首先要確保你的 Nginx 安裝了此模組。 #### Lua 腳本配置範例 在 Nginx 配置檔中加入 Lua 代碼區塊,用以捕捉每個請求的毫秒時間戳: ```nginx http { server { listen 80; location / { content_by_lua_block { ngx.say("Time since epoch in milliseconds: ", ngx.now() * 1000) } } } } ``` 在這個設定中,當訪問服務器的根路徑時,它會返回從 Unix 紀元(1970年1月1日)到當前時間的毫秒數。 這些方法提供了不同的方式來捕捉和使用 Nginx 中的時間戳,視你的需求而定。使用 `$time_iso8601` 和 `$time_local` 是最直接也最簡單的方式,而使用 Lua 腳本則提供了更高的自訂性和精確度。 --- ``` split_clients "${remote_addr}${time_local}" $variant { 20% https://example.com/; 30% https://example.org/; * https://example.edu/; } server { listen 80; listen [::]:80; server_name _; return 302 ${variant}; } ``` 這段代碼是針對 Nginx 配置文件的一個示例,用來說明如何實現流量分流。這被稱為分流測試或者 A/B 測試。讓我來分步解釋這個配置的各個部份: 1. **split_clients 指令**: - `split_clients "${remote_addr}${time_local}" $variant` - 這行代碼的核心是透過 `split_clients` 模塊將用戶請求分配到不同的變體。`${remote_addr}` 表示請求者的 IP 地址,`${time_local}` 則代表請求的本地時間。將這兩個變量組合用作輸入鍵,然後將結果存儲在變量 `$variant` 中。 2. **分配比例**: - `20% https://example.com/` - 這表示有 20% 的請求會被導向 `https://example.com/` - `30% https://example.org/` - 表示有 30% 的請求會被導向 `https://example.org/` - `* https://example.edu/` - 這裡的 `*` 代表所有其他的(也就是剩餘的 50%)請求,這些請求將被導向 `https://example.edu/` 3. **server 塊**: - `listen 80;` 和 `listen [::]:80;` - 這些行設定這個伺服器監聽所有來自 IPv4 和 IPv6 的連接在 80 端口。 - `server_name _;` - 這行指定這個伺服器塊將處理所有未明確匹配到其他伺服器名的請求。 - `return 302 ${variant};` - 當用戶連接到這個伺服器時,他們的請求會被重定向到具體的 URL,這是根據 `$variant` 變量決定的,該變量指定了導向的目的地。302 代表暫時性重定向。 ### 使用範例: 假設用戶的 IP 是 `192.168.1.1`,並且他們在特定的時間發起了一個請求。那麼 `split_clients` 模塊會根據設定的比率把這個請求導向到三個不同的網站之一: - 有 20% 的機率會被導向到 `https://example.com/` - 有 30% 的機率會被導向到 `https://example.org/` - 有 50% 的機率會被導向到 `https://example.edu/` 每次請求可能由於 `${remote_addr}${time_local}` 的組合不同而導向不同的網站。這種配置適用於實施流量分配或進行線上實驗。