優化 Web 服務器(如 Nginx 和 Apache)的并發連接處理能力是一個系統工程,需要從操作系統、服務器配置、應用程序和架構等多個層面進行。恒訊科技為您提供一份全面且深入的優化指南。Web服務器并發優化全攻略:從系統配置到架構設計
在調整Web服務器之前,必須確保操作系統本身能夠支持大量的并發連接。
調整文件描述符限制
為何重要:每個網絡連接都會消耗一個文件描述符。系統默認值(如1024)對于高并發場景來說太低了。
如何操作:
臨時調整:ulimit -n 65535
永久生效:編輯 /etc/security/limits.conf 文件,添加:
text
* soft nofile 65535
* hard nofile 65535
系統級全局限制:檢查 /proc/sys/fs/file-max,如果需要,在 /etc/sysctl.conf 中設置 fs.file-max = 100000。
優化TCP/IP網絡堆棧
編輯 /etc/sysctl.conf,應用以下配置后執行 sysctl -p 生效。
bash
# 增大等待連接隊列長度,應對突發流量
net.core.somaxconn = 65535
# 加快TIME-WAIT狀態的端口回收,便于應對短連接高并發
net.ipv4.tcp_tw_reuse = 1
# 調整系統最大跟蹤的連接數
net.netfilter.nf_conntrack_max = 655360
# 增加TCP緩沖區大小,提升吞吐量
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 16384 4194304
# 啟用TCP Fast Open (TFO) 以減少連接建立的延遲
net.ipv4.tcp_fastopen = 3
Nginx 以其事件驅動的異步架構聞名,非常適合高并發。
工作進程與連接數
nginx
# 設置為與CPU核心數相同或自動
worker_processes auto;
events {
# 每個worker進程能處理的最大連接數
worker_connections 10240;
# 允許工作進程同時接受所有新連接
multi_accept on;
# 使用高效的事件模型(Linux下為epoll)
use epoll;
}
高效緩沖區與超時設置
nginx
http {
# 禁用響應頭中的版本號,提升安全性
server_tokens off;
# 允許服務器直接發送文件,提升靜態文件性能
sendfile on;
# 在sendfile開啟時,合并數據包再發送,提升網絡效率
tcp_nopush on;
# 禁用Nagle算法,提升實時響應
tcp_nodelay on;
# 保持連接超時時間,減少TCP握手開銷
keepalive_timeout 30;
# 單個保持連接上最多服務的請求數
keepalive_requests 1000;
# 客戶端請求超時時間
client_header_timeout 15;
client_body_timeout 15;
# 發送響應給客戶端的超時時間
send_timeout 15;
# 限制客戶端請求體大小,防止濫用
client_max_body_size 64m;
}
限制與防護
nginx
http {
# 限制單個IP的并發連接數
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 100;
# 限制請求速率(防CC攻擊)
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
limit_req zone=one burst=20 nodelay;
}
Apache 的優化關鍵在于選擇正確的工作模式(MPM)。
選擇并優化MPM
Event MPM(推薦):對于高并發、非阻塞I/O場景最佳。
Worker MPM:線程化模型,內存占用少于Prefork。
Prefork MPM:進程模型,兼容性最好,但內存消耗大,并發能力弱。
Event MPM 配置示例(在 /etc/httpd/conf.modules.d/00-mpm.conf 中啟用并配置):
apache
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400 # (MaxRequestWorkers = ThreadsPerChild * ServerLimit)
MaxConnectionsPerChild 0 # 設為0表示進程不重啟,但可能內存泄漏;可設為10000
</IfModule>
通用模塊優化
apache
# 啟用保持連接,減少TCP握手
KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100
# 禁用不需要的模塊,減少內存占用和潛在攻擊面
# 例如:LoadModule version_module modules/mod_version.so
# 使用mod_deflate壓縮輸出,減少帶寬占用
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
</IfModule>
# 設置長緩存時間給靜態資源
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Expires "access plus 1 year"
</FilesMatch>
Web服務器只是鏈條的一環,應用本身效率至關重要。
啟用OPcache(PHP)
在 php.ini 中配置,極大提升PHP腳本執行速度。
ini
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
使用外部緩存
將頻繁查詢的結果緩存到 Redis 或 Memcached 中。
對完整的頁面或頁面片段使用 Varnish 等HTTP加速器。
優化數據庫
確保查詢語句使用了索引。
考慮使用數據庫連接池(如 PgBouncer for PostgreSQL)。
當單機優化到達瓶頸時,架構升級是唯一出路。
動靜分離
使用Nginx直接處理靜態文件(圖片、CSS、JS),其效率遠高于Apache和任何后端語言。
nginx
server {
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
負載均衡
使用Nginx或專門的負載均衡器(如HAProxy)將流量分發到多臺后端應用服務器,實現水平擴展。
引入CDN
將全球分布的靜態資源交給CDN,讓用戶從最近的節點獲取內容,極大減輕源站服務器壓力。
使用工具監控
htop, iotop:查看系統資源。
nginx -t 和 apachectl configtest:測試配置是否正確。
Nginx Status / Apache Status Module:查看服務器實時狀態。
Prometheus + Grafana:建立可視化監控儀表盤。
壓力測試
使用 ab (Apache Bench), wrk, 或 siege 等工具模擬高并發場景,驗證優化效果。
bash
ab -n 10000 -c 1000 http://your-website.com/
基礎:從操作系統參數和Web服務器的基礎配置(工作進程、連接數)開始。
核心:調整緩沖區、超時和保持連接參數,并啟用壓縮、緩存等性能特性。
防護:配置連接和請求限制,防止惡意流量拖垮服務器。
縱深:優化應用程序和數據庫,減少后端處理時間。
擴展:通過動靜分離、負載均衡和CDN等架構手段,突破單機性能瓶頸。
Copyright ? 2013-2020. All Rights Reserved. 恒訊科技 深圳市恒訊科技有限公司 粵ICP備20052954號 IDC證:B1-20230800.移動站


