Nginx 採用 Master-Worker 多進程模型:
worker_processes auto;)。所有控制操作本質上是向 Master 進程發送特定信號,由 Master 協調 Worker 完成對應動作。
# 方法一:ps 過濾
ps -ef | grep nginx
# 找到「master process」那一行,第二欄即 PID
# 方法二:讀取 pid 檔(需 nginx.conf 配置 pid 路徑)
cat /usr/local/nginx/logs/nginx.pid
# 或自定義路徑:cat /var/run/nginx.pid
| 模式 | 信號 | 指令 | 行為 | 適用場景 |
|---|---|---|---|---|
| 從容停止 | QUIT | nginx -s quitkill -QUIT | Master 停止接收新連接,等待所有 Worker 處理完當前請求後自然退出 | 計劃維護、發布窗口、優雅下線 |
| 快速停止 | TERM / INT | nginx -s stopkill -TERM | Master 立即終結所有 Worker,強制關閉連接,不等待請求完成 | 緊急故障、配置錯誤導致服務異常、需立即釋放埠口 |
| 強制殺死 | KILL (9) | pkill -9 nginxkill -9 | 作業系統層面強制回收資源,Nginx 無任何清理機會,可能殘留共享記憶體、鎖檔案 | 進程假死、失去控制、最後手段 |
# 推薦方式:nginx 命令列工具(自動讀取 pid 檔)
nginx -s reload
# 等效信號方式
kill -HUP
# 或直接用 pid 檔
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
流程:
nginx -t)。QUIT 信號。黃金法則:執行
reload前務必先執行nginx -t驗證語法,避免語法錯誤導致 Master 拒絕重載,舊配置繼續運行但新配置不生效,造成認知偏差。
# 指定配置檔檢查
nginx -t -c /usr/local/nginx/conf/nginx.conf
# 使用預設路徑檢查
nginx -t
# 僅顯示編譯參數與模組
nginx -V
適用於 Nginx 版本升級、新增/移除模組、修補安全漏洞:
nginx 覆蓋舊檔(或放入新目錄並調整啟動腳本)。kill -USR2 <舊Master_PID>
舊 Master 將 nginx.pid 重命名為 nginx.pid.oldbin,然後啟動新 Master(載入新二進制)。新舊 Master 共存,雙倍 Worker 同時服務。
# 通知舊 Master 關閉其 Worker
kill -WINCH <舊Master_PID>
舊 Worker 隨請求完成自然退出,新 Worker 漸漸接管所有流量。
| 決策 | 操作 |
|---|---|
| 確認新版穩定,正式切換 | 向舊 Master發送 QUIT:kill -QUIT <舊Master_PID>。舊 Master 退出,新 Master 成為唯一 Master。 |
向新 Master發送 QUIT:kill -QUIT <新Master_PID>。新 Master 退出,舊 Master 重新接管(需再次 WINCH 重啟舊 Worker)。 |
配合 logrotate 實現無縫日誌輪轉:
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
USR1 通知 Master 重新打開日誌檔案,舊檔案被 logrotate 壓縮歸檔,新請求寫入新檔案,無需重啟 Nginx。
| 操作 | 推薦指令 | 備註 |
|---|---|---|
| 啟動 | nginx 或 systemctl start nginx | 指定配置:nginx -c /path/to/nginx.conf |
| 驗證配置 | nginx -t | 任何變更後必執行 |
| 平滑重載 | nginx -s reload | 修改配置後生效 |
| 從容停止 | nginx -s quit | 優雅下線 |
| 快速停止 | nginx -s stop | 緊急停機 |
| 平滑升級 | kill -USR2 → kill -WINCH <舊PID> → kill -QUIT <舊/新PID> | 零停機換版本 |
| 日誌輪轉 | kill -USR1 | 配合 logrotate |
| 查看編譯參數 | nginx -V | 模組、路徑、編譯器資訊 |
Nginx 的信號控制機制設計精妙,實現了從配置熱載到二進制平滑升級的全生命週期零停機運維。掌握 QUIT/TERM/HUP/USR1/USR2/WINCH 六大信號語義,配合 nginx -t 預檢習慣,是每位 Nginx 運維與開發者的必備內功。