Nginx 是高性能 HTTP 與反向代理服務器,佔據全球 Web 服務器市場份額第一。本文記錄 CentOS 7 源碼編譯安裝全過程、目錄職能、核心管理命令、平滑升級步驟、負載均衡核心概念與 Rewrite 規則語法,適合運維與開發快速上手。
| 特性 | 說明 |
| 輕量級 | 主進程 + 多 Worker 進程,內存佔用極低 (靜態內存 ~2-3MB/1萬連接) |
| 高併發 | Epoll (Linux) / Kqueue (BSD) 事件驅動,單進程支撐 10萬+ 並發連接 |
| 反向代理 | 隱藏後端服務器,統一入口,支持負載均衡、緩存、SSL 卸載 |
| 負載均衡 | 輪詢、加權、IP Hash、最少連接、一致性 Hash 等多種算法 |
| 靜態資源 | 極快服務靜態文件,支持 sendfile、Gzip、瀏覽器緩存控制 |
| Rewrite | URL 重寫,支持正則、條件判斷、跳轉、限制 IP 訪問 |
| 跨平台 | Linux/Unix/Windows/macOS,Linux 性能最優 |
二、CentOS 7 源碼編譯安裝 (Nginx 1.8.1 示例)
1. 安裝編譯依賴
yum -y install gcc gcc-c++ autoconf automake
yum -y install pcre pcre-devel # Rewrite 模塊依賴
yum -y install zlib zlib-devel # Gzip 模塊依賴
yum -y install openssl openssl-devel # SSL 模塊依賴 (可選)
2. 下載、解壓、配置、編譯、安裝
wget https://nginx.org/download/nginx-1.8.1.tar.gz
tar -zxvf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_stub_status_module
make
make install
關鍵點:--prefix 指定安裝目錄,默認 /usr/local/nginx。
3. 驗證安裝
ls /usr/local/nginx
# conf/ html/ logs/ sbin/
三、目錄結構職能
| 目錄 | 作用 |
| conf/ | 配置文件 (nginx.conf、mime.types、fastcgi_params) |
| html/ | 默認靜態網頁根目錄 |
| logs/ | 訪問日志 (access.log)、錯誤日志 (error.log) |
| sbin/ | 可執行二進制文件 (nginx) |
四、核心管理命令
# 啟動 (指定配置文件)
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 測試配置語法
/usr/local/nginx/sbin/nginx -t
# 或指定配置
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
# 從容停止 (完成當前請求)
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid`
# 快速停止 (立即終止)
kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
# 強制殺死
pkill -9 nginx
# 重載配置 (平滑重啟,不中斷服務)
/usr/local/nginx/sbin/nginx -s reload
# 或
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
# 關閉 Worker 進程 (Master 存活)
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid` # 僅關閉 Worker
# 查看進程
ps -ef | grep nginx
# Master 進程號 + 多個 Worker 進程
五、Nginx 平滑升級 (不停服務升級版本)
- 查看當前版本:
/usr/local/nginx/sbin/nginx -V
- 下載新版本源碼 (如 1.9.2),
./configure 相同參數,make 不執行 make install。
- 備份舊二進制:
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
- 替換二進制:
cp objs/nginx /usr/local/nginx/sbin/nginx
- 發送升級信號:
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
- Master 重命名
nginx.pid → nginx.pid.oldbin
- 啟動新 Master + 新 Worker
- 舊 Worker 完成當前請求後自然退出
- 確認新版本運行正常後,發送
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin` 關閉舊 Master。
- 回滾:若新版有問題,
kill -HUP `cat /usr/local/nginx/logs/nginx.pid.oldbin` (舊 Master 重啟舊 Worker) + kill -QUIT `cat /usr/local/nginx/logs/nginx.pid` (關閉新 Master)。
六、負載均衡核心配置
upstream backend {
# 輪詢 (默認)
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 backup; # 熱備
# IP Hash (會話保持)
# ip_hash;
# 最少連接
# least_conn;
}
server {
listen 80;
location / {
proxy_pass https://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
七、Rewrite 規則速查
| 指令 | 標誌位 | 含義 |
| rewrite | last | 重寫後繼續匹配新 location (內部跳轉) |
| rewrite | break | 重寫後停止匹配,在當前 location 執行 |
| rewrite | redirect | 302 臨時重定向,瀏覽器地址欄變化 |
| rewrite | permanent | 301 永久重定向,SEO 傳遞權重 |
# 例子:靜態化偽靜態
rewrite ^/article/(\d+)\.html$ /article.jsp?id=$1 last;
# 例子:強制 HTTPS
if ($scheme = http) {
return 301 https://$host$request_uri;
}
# 例子:限制 IP 訪問
location /admin/ {
allow 192.168.1.0/24;
deny all;
}
八、Nginx vs Apache 選型建議