Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Azure 雲端部署 Nginx 完整實戰:從原始碼編譯到生產優化

編輯:Linux 系統常見問題解答

在 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

# 建議驗簽(略)

三、編譯安裝 Nginx

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:專用低權限帳號,符合最小權限原則

四、建立 systemd 服務

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 綁定 80/443 埠

預設需 root 才能綁定 < 1024 埠。兩種方案二選一:

方案 A:Capabilities(推薦,最小權限)

setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx
# 驗證
getcap /usr/sbin/nginx
# 輸出:/usr/sbin/nginx = cap_net_bind_service+ep

方案 B:systemd AmbientCapabilities(systemd 229+)

在 [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、keepalive
  • ✅ 限制 client_max_body_size、client_body_timeout 防濫用
  • ✅ 定期 logrotate 切割 /var/log/nginx/*.log
  • ✅ 納入 Ansible/Terraform 版本控制,實現 Immutable Infrastructure

結語: 從原始碼編譯 Nginx 雖步驟較多,但能獲得最新 TLS 特性、自訂模組組合與極致效能。配合 Azure VM 的靈活規格(B 系列爆發型、D 系列通用型),即可低成本構建高可用反向代理/負載均衡層。

Copyright © Windows教程網 All Rights Reserved