Nginx資源占用過高(主要表現為CPU、內存占用飆升)通常與配置不合理、系統參數限制或模塊問題有關。以下是系統性解決步驟:
在優化前,需明確是CPU占用過高還是內存占用過高,以及具體原因:
top -p $(pgrep nginx | tr '\n' ',')
實時查看Nginx進程的CPU/內存占用;ps -o pid,rss,command -p $(pgrep nginx)
查看每個進程的實際物理內存(RSS)使用情況。pmap -x $(pgrep nginx | head -n1) | tail -n 10
查看單個Nginx進程的內存映射,識別是否有異常大的內存段(如共享內存、緩存)。large_client_header_buffers
、proxy_buffer
),或配置了過大的緩沖區(如client_body_buffer_size
、proxy_buffers
)。CPU占用高通常與工作進程配置、連接數限制、SSL處理有關:
worker_processes
設置為CPU核心數(或auto
,Nginx會自動匹配):worker_processes auto; # 推薦,自動適配CPU核心數
events
塊中調整worker_connections
(每個worker的最大并發連接數),建議設置為1024-10000(根據服務器性能調整):events {
worker_connections 4096; # 提高并發處理能力
use epoll; # 使用epoll事件模型(Linux下高性能選擇)
multi_accept on; # 允許一個worker同時接受多個連接
}
http
塊中啟用sendfile
(零拷貝傳輸)、tcp_nopush
(合并小包發送)、tcp_nodelay
(禁用Nagle算法,減少延遲):http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
ssl_session_cache shared:SSL:20m; # 共享內存緩存大小
ssl_session_timeout 10m; # 會話超時時間
ssl_protocols TLSv1.2 TLSv1.3; # 僅啟用TLS 1.2/1.3(更安全且高效)
ssl_ciphers HIGH:!aNULL:!MD5; # 使用高效加密套件
ssl_prefer_server_ciphers on;
內存占用高通常與緩存配置、工作進程數量、內存泄漏有關:
expires
),減少重復請求:location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 緩存30天
add_header Cache-Control "public, no-transform";
access_log off; # 關閉訪問日志(減少IO)
}
proxy_cache
參數,限制緩存大小和單個緩存項大?。?pre class="hljs">proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m; # 緩存路徑、共享內存大小、最大容量
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m; # 200/302狀態碼緩存10分鐘
proxy_cache_use_stale error timeout updating; # 緩存過期時仍可使用(避免頻繁請求后端)
worker_rlimit_nofile
限制每個worker進程的最大文件描述符數(避免內存耗盡):worker_rlimit_nofile 65535; # 推薦值(需與系統ulimit一致)
worker_memory_limit
限制每個worker的內存使用(如worker_memory_limit 512m
)。nginx.conf
中設置error_log /var/log/nginx/error.log debug;
(僅排查時開啟,會產生大量日志),觀察內存是否持續增長。valgrind --leak-check=full /usr/sbin/nginx -g "daemon off;"
(測試環境使用)分析內存泄漏位置。/etc/security/limits.conf
,增加以下內容(針對Nginx用戶):* soft nofile 65535
* hard nofile 65535
編輯/etc/sysctl.conf
,優化TCP參數(減少TIME_WAIT連接占用):net.ipv4.tcp_tw_reuse = 1 # 重用TIME_WAIT連接
net.ipv4.tcp_tw_recycle = 1 # 快速回收TIME_WAIT連接(官方已不建議,可移除)
net.ipv4.tcp_max_tw_buckets = 6000 # 最大TIME_WAIT連接數
net.core.somaxconn = 65535 # 監聽隊列長度
net.ipv4.tcp_max_syn_backlog = 65535 # SYN隊列長度
應用配置:sysctl -p
。dd if=/dev/zero of=/swapfile bs=1G count=8
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
調整swappiness
參數(0-100,值越小越傾向于使用物理內存):echo 10 > /proc/sys/vm/swappiness
http
塊中添加limit_conn
配置,限制每個IP的并發連接數(如每個IP最多20個連接):limit_conn_zone $binary_remote_addr zone=perip:10m; # 定義共享內存區域
server {
limit_conn perip 20; # 每個IP最多20個連接
}
proxy_cache off;
(nginx.conf
中)ssl_session_cache
行。nginx -s reload
;強制重啟(中斷服務):systemctl restart nginx
(僅在緊急時使用)。$upstream_cache_status
)。wrk
或ab
進行壓力測試(如wrk -t12 -c400 -d30s http://example.com/
),對比優化前后的內存/ CPU增長曲線;dmesg
或/var/log/messages
,確認無OOM(Out of Memory)事件發生。通過以上步驟,可系統性解決CentOS下Nginx資源占用過高的問題,同時建立長效監控機制,避免問題復發。