Nginx內(nèi)存占用過高排查與處理過程
一、排查流程
1. 確認內(nèi)存占用情況
使用 top 或 ps 命令查看 Nginx 進程內(nèi)存占用:
top -p $(pgrep nginx | tr '\n' ',') # 實時查看 Nginx 進程 ps -o pid,rss,command -p $(pgrep nginx) # 查看 RSS(實際物理內(nèi)存)占用
使用 pmap 分析單個進程內(nèi)存分布:
pmap -x $(pgrep nginx | head -n1) | tail -n 10 # 查看內(nèi)存映射
2. 分析內(nèi)存占用類型
共享內(nèi)存(SHM):
# 查看共享內(nèi)存段 ipcs -m | grep nginx
緩存內(nèi)存:
# 檢查 proxy_cache 或 fastcgi_cache 配置 grep -r "proxy_cache" /etc/nginx/
3. 檢查 Nginx 配置
查看是否啟用高內(nèi)存消耗模塊:
# 檢查是否啟用 large_client_header_buffers large_client_header_buffers 4 16k; # 每個請求可能占用 64KB # 檢查 proxy_buffer 配置 proxy_buffers 8 16k; # 每個連接可能占用 128KB
4. 分析日志與監(jiān)控數(shù)據(jù)
檢查錯誤日志:
tail -f /var/log/nginx/error.log | grep -i "memory"
- 使用監(jiān)控工具(如 Prometheus + Grafana)收集內(nèi)存指標:
- 總內(nèi)存使用量
- 每個 worker 進程內(nèi)存使用
- 緩存命中率
二、常見原因與處理方法
1. 工作進程(worker)過多
- 問題表現(xiàn):多個 worker 進程占用大量內(nèi)存
- 解決方法:
# 根據(jù) CPU 核心數(shù)調(diào)整 worker 數(shù)量 worker_processes auto; # 自動匹配 CPU 核心數(shù)
2. 單個請求內(nèi)存消耗過大
- 問題表現(xiàn):處理大文件或大請求時內(nèi)存激增
- 解決方法:
# 減小緩沖區(qū)大小 client_body_buffer_size 8k; # 客戶端請求體緩沖區(qū) large_client_header_buffers 4 8k; # 請求頭緩沖區(qū) # 限制上傳文件大小 client_max_body_size 10m;
3. 緩存配置不合理
- 問題表現(xiàn):proxy_cache 或 fastcgi_cache 占用過多內(nèi)存
- 解決方法:
# 優(yōu)化緩存參數(shù) proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m; proxy_cache_key "$scheme$request_method$host$request_uri"; # 限制單個緩存項大小 proxy_cache_max_range_offset 1m;
4. 內(nèi)存泄漏或第三方模塊問題
- 問題表現(xiàn):內(nèi)存持續(xù)增長不釋放
- 解決方法:
# 啟用內(nèi)存調(diào)試(編譯時添加 --with-debug) error_log /var/log/nginx/error.log debug; # 逐步禁用第三方模塊,定位問題模塊
5. SSL 會話緩存配置不當
- 問題表現(xiàn):HTTPS 流量大時內(nèi)存占用高
- 解決方法:
# 優(yōu)化 SSL 會話緩存 ssl_session_cache shared:SSL:20m; # 減少共享內(nèi)存大小 ssl_session_timeout 10m; # 縮短會話超時時間
三、內(nèi)存優(yōu)化建議
1. 調(diào)整工作進程內(nèi)存分配
# 限制每個 worker 進程的最大內(nèi)存使用(需要 nginx-plus 或第三方模塊) worker_rlimit_nofile 65535;
2. 使用內(nèi)存限制工具
# 使用 cgroups 限制 Nginx 進程組內(nèi)存 echo "1000000000" > /sys/fs/cgroup/memory/nginx/memory.limit_in_bytes # 限制為 1GB
3. 優(yōu)化靜態(tài)資源處理
# 禁用不必要的靜態(tài)資源緩沖區(qū)
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
sendfile on;
tcp_nopush on;
expires 7d;
access_log off;
add_header Cache-Control "public";
}4. 使用 swap 分區(qū)作為緩沖
# 創(chuàng)建 swap 文件(8GB 示例) dd if=/dev/zero of=/swapfile bs=1G count=8 chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 調(diào)整 swappiness 參數(shù)(0-100) echo 10 > /proc/sys/vm/swappiness
四、應(yīng)急處理措施
1. 臨時減少并發(fā)連接
# 限制每個 IP 的并發(fā)連接數(shù) limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn perip 20; # 每個 IP 最多 20 個連接
2. 關(guān)閉高內(nèi)存消耗功能
# 臨時關(guān)閉緩存 proxy_cache off; # 臨時關(guān)閉 SSL 會話緩存 # ssl_session_cache shared:SSL:20m; → 注釋掉此行
3. 重啟 Nginx 釋放內(nèi)存
# 平滑重啟(不中斷服務(wù)) nginx -s reload # 強制重啟 systemctl restart nginx
五、驗證優(yōu)化效果
1. 壓力測試對比
# 使用 wrk 進行壓力測試 wrk -t12 -c400 -d30s http://example.com/ # 對比優(yōu)化前后內(nèi)存增長曲線
2. 長期監(jiān)控指標
- 內(nèi)存使用率趨勢圖
- 單個請求內(nèi)存消耗分布
- OOM(Out of Memory)事件記錄
3. 內(nèi)存泄漏檢測
# 使用 valgrind 檢測內(nèi)存泄漏(僅建議在測試環(huán)境使用) valgrind --leak-check=full --show-leak-kinds=all /usr/sbin/nginx -g "daemon off;"
通過以上步驟,可以系統(tǒng)性地排查和解決 Nginx 內(nèi)存占用過高問題,同時建立長效的內(nèi)存監(jiān)控機制,避免因內(nèi)存問題導(dǎo)致服務(wù)中斷。
以上就是Nginx內(nèi)存占用過高排查與處理過程的詳細內(nèi)容,更多關(guān)于Nginx內(nèi)存占用過高的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Nginx實現(xiàn)動態(tài)攔截非法訪問ip的方法
最近在訪問時不時會被暴力刷量,爬蟲和惡意攻擊導(dǎo)致數(shù)據(jù)庫,服務(wù)等癱瘓,所以本文介紹了在Nginx上實現(xiàn)一個動態(tài)攔截IP的方法,具體是當某個IP在1分鐘內(nèi)訪問超過60次時,將其加入Redis并攔截,攔截時間默認1天,需要的朋友可以參考下2025-02-02
詳解Nginx 靜態(tài)文件服務(wù)配置及優(yōu)化
這篇文章主要介紹了Nginx 靜態(tài)文件服務(wù)配置及優(yōu)化,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
nginx調(diào)用php-fpm出錯解決方法和nginx配置詳解
這篇文章介紹了nginx調(diào)用php-fpm出錯的解決方法,最后給出了nginx配置方法,需要的朋友可以參考下2014-03-03
Nginx在linux和windows下代理靜態(tài)文件夾方式
Windows下配置Nginx代理E盤data文件夾,開發(fā)端口7766;Linux下配置Nginx代理home/mydata文件夾,開發(fā)端口7766,重啟Nginx方法:Windows直接nginx -s reload;Linux根據(jù)安裝位置使用find命令找到sbin目錄后,使用/usr/sbin/nginx -s reload重啟2025-11-11

