如何配置web服务器?Linux下Nginx安装与优化实战指南
凌晨三點的機房,冷氣嗡嗡作響,螢幕上nginx的error.log突然爆出499狀態碼。十年前第一次手抖編譯nginx時踩的坑,和昨天幫電商客戶緊急調優的場景突然重疊——這套開源軟體的生命力,恰恰藏在那些手動編譯參數和.conf檔案裡某個不起眼的timeout設定中。
源碼編譯不是儀式感,而是解鎖生產環境性能的鑰匙。當你從nginx.org下載tar.gz那刻起,就該甩開apt-get的舒適圈。最新穩定版?別急,先看CHANGES檔案裡有沒有你正在用的模組相關修復。我習慣把源碼扔到/usr/local/src/nginx-build,這裡的每一層目錄都是戰場遺跡——某次編譯openssl 3.0翻車的殘留還在角落裡躺著。
./configure才是真正的戰場。當你敲下–prefix=/usr/local/nginx這行,已經決定了未來所有日誌堆在哪個磁碟分割槽。我見過太多人載在–with-http_stub_status_module這個小東西上,等要監控QPS時才發現得重新編譯。最痛的領悟莫過於漏掉–with-file-aio,在高頻圖片服務場景直接損失30%吞吐量。別被網上那些複製貼上的參數清單騙了,真實場景要這麼玩:
make -j $(nproc) 這條命令啟動那刻,風扇的嘶吼就是最好的戰歌。但編譯成功只是拿到入場券,真正的戰鬥在nginx.conf展開。
worker_processes auto; 這句看似智慧,在128核的機器上可能釀成災難。去年某雲服務商故障根本原因就是auto把容器調度打爆。記住:worker數量=CPU物理核心數,超執行緒不算數。worker_connections 10240; 這個數字背後藏著檔案描述符的屍山血海——先確認ulimit -n返回65535再說。
當你在events區塊寫下use epoll;時,得知道FreeBSD兄弟正在用kqueue。多說句,accept_mutex早該進博物館了,新版本預設關閉才是正道。這些年調過最詭異的case是某客戶的keepalive_timeout設了300秒,結果被慢速攻擊打到跪,現在我一律強制壓到15秒。
Gzip壓縮省頻寬?小心CPU叛變!見過text/css被壓兩次的慘案嗎?這樣寫才穩:
靜態檔案服務暗藏殺機。sendfile on; 和aio on; 在NVMe盤上能起飛,但舊版核心可能直接崩潰。最坑的是directio 4m; 參數,配錯分頁大小直接IO翻倍。記得某次幫影片站點調優,開啟open_file_cache max=100000 inactive=30s; 後,400錯誤直接歸零。
SSL效能是另一個次元的戰場。TLS1.3早該全面上線,但某些銀行客戶的IE8還陰魂不散。重點記住三條:1) ssl_buffer_size別超過4k 2) OCSP裝訂用resolver 8.8.8.8 valid=300s; 兜底 3) 證書鏈順序錯了比沒證書更致命。給個實戰配置感受下:
緩存配置失誤可能讓CDN失業。曾目睹某商城把max_size設成100G,結果SSD寫廢兩塊。關鍵在分層設計:
日誌切割不是crontab跑下logrotate那麼簡單。當你發現access.log佔滿磁碟時,nginx可能正默默拒絕請求。推薦暴力方案:
安全加固藏在細節裡。add_header X-Frame-Options DENY; 這種基礎操作不提,高階玩法是動態封禁:
最後送個彩蛋:reload失敗時別急著kill -HUP,先nginx -t檢查,再nginx -s reopen重開日誌檔案。去年雙十一靠這招救了某支付閘道器,少賠兩千萬。
評論: