如何配置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重開日誌檔案。去年雙十一靠這招救了某支付閘道器,少賠兩千萬。

評論:

  • 動態模組載入和靜態編譯怎麼選?我們用K8s每次打包都要重新編譯太痛苦了
  • worker_processes設成auto在容器環境確實是坑,但怎麼精準拿到物理核心數?lscpu輸出的資訊有點混亂
  • 求教日誌切割方案!用map切割access.log會導致每條日誌都執行正則匹配嗎?擔心效能損耗
  • ssl_buffer_size設4k在移動端高延遲環境下會不會反而影響效能?看到有論文建議設1400MTU值
  • 檔案描述符上限除了ulimit還要改/etc/security/limits.conf吧?systemd服務的設定檔也需要同步調整
  • Leave a comment

    您的邮箱地址不会被公开。 必填项已用 * 标注