在 Azure VM(Ubuntu 20.04/22.04 或 CentOS 7/8)上從原始碼編譯 Nginx,能精確控制模組、優化效能、修補 CVE。本文記錄完整流程:依賴安裝、PCRE/OpenSSL 靜態連結、編譯參數解析、systemd 服務化、權限強化與常見坑點修復。
# Ubuntu/Debian
apt update && apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev wget
# CentOS/RHEL/Rocky
yum groupinstall -y "Development Tools"
yum install -y pcre-devel zlib-devel openssl-devel wget
cd /usr/local/src
NGINX_VER=1.24.0
PCRE_VER=8.45
OPENSSL_VER=3.0.10
wget https://nginx.org/download/nginx-${NGINX_VER}.tar.gz
wget https://sourceforge.net/projects/pcre/files/pcre/${PCRE_VER}/pcre-${PCRE_VER}.tar.gz
wget https://www.openssl.org/source/openssl-${OPENSSL_VER}.tar.gz
# 建議驗簽(略)
tar xzf nginx-${NGINX_VER}.tar.gz
tar xzf pcre-${PCRE_VER}.tar.gz
tar xzf openssl-${OPENSSL_VER}.tar.gz
cd nginx-${NGINX_VER}
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/run/nginx.pid \
--lock-path=/run/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre=../pcre-${PCRE_VER} \
--with-openssl=../openssl-${OPENSSL_VER} \
--with-threads \
--with-file-aio \
--with-http_slice_module \
--add-module=../ngx_brotli # 可選:Brotli 壓縮
make -j$(nproc)
make install
--with-pcre=... / --with-openssl=...:靜態連結,避免系統庫版本過舊導致 TLS 1.3 不支援或 PCRE JIT 無法啟用--with-threads + --with-file-aio:啟用執行緒池與非同步 I/O,大幅提升靜態檔案吞吐--user=nginx --group=nginx:專用低權限帳號,符合最小權限原則cat > /etc/systemd/system/nginx.service <<'EOF'
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
LimitNOFILE=65535
LimitNPROC=65535
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now nginx
預設需 root 才能綁定 < 1024 埠。兩種方案二選一:
setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx
# 驗證
getcap /usr/sbin/nginx
# 輸出:/usr/sbin/nginx = cap_net_bind_service+ep
在 [Service] 區塊加入:
AmbientCapabilities=CAP_NET_BIND_SERVICE CapabilityBoundingSet=CAP_NET_BIND_SERVICE
並移除 User=nginx(或保留,systemd 會自動處理)。
| 現象 | 原因 | 修復 |
|---|---|---|
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) |
未給 capabilities 或 selinux 阻擋 | 執行 setcap 或檢查 audit2allow -a |
nginx: [emerg] unknown directive "brotli" |
未編譯 ngx_brotli 模組 | 重新 ./configure --add-module=... 並 make install |
啟動後 systemctl status nginx 顯示 failed 但 nginx -t 通過 |
PIDFile 路徑不一致或啟動腳本未 fork |
核對 pid 指令與 PIDFile 一致;確認 Type=forking |
# 版本與編譯參數
nginx -V
# 靜壓測
wrk -t4 -c200 -d30s https:///
# 關鍵指標:Req/sec、Latency P99、Error rate
gzip / brotli、http2、ssl_session_cache、keepaliveclient_max_body_size、client_body_timeout 防濫用logrotate 切割 /var/log/nginx/*.log結語: 從原始碼編譯 Nginx 雖步驟較多,但能獲得最新 TLS 特性、自訂模組組合與極致效能。配合 Azure VM 的靈活規格(B 系列爆發型、D 系列通用型),即可低成本構建高可用反向代理/負載均衡層。
Debian/Ubuntu 網路設定完整指南:靜態 IP、DHCP 與 DNS 設定
Linux 壓縮解壓實戰大全:zip、tar、tar.gz、tar.bz2 核心參數與場景選型
Linux 檔案內容查看指令大全:cat、more、less、head、tail 進階用法
ITDB 整合 LDAP 導入用戶實戰:自動同步、權限映射與 Init.php 擴展
Linux 密碼攻防實戰:單用戶模式破解、GRUB/BIOS 加固與救援模式對抗
Linux SSH 登錄「Access Denied」終極排查:從權限到 sshd_config 隱藏陷阱