Nginx內(nèi)存占用過(guò)高排查與處理過(guò)程
一、排查流程
1. 確認(rèn)內(nèi)存占用情況
使用 top 或 ps 命令查看 Nginx 進(jìn)程內(nèi)存占用:
top -p $(pgrep nginx | tr '\n' ',') # 實(shí)時(shí)查看 Nginx 進(jìn)程 ps -o pid,rss,command -p $(pgrep nginx) # 查看 RSS(實(shí)際物理內(nèi)存)占用
使用 pmap 分析單個(gè)進(jìn)程內(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; # 每個(gè)請(qǐng)求可能占用 64KB # 檢查 proxy_buffer 配置 proxy_buffers 8 16k; # 每個(gè)連接可能占用 128KB
4. 分析日志與監(jiān)控?cái)?shù)據(jù)
檢查錯(cuò)誤日志:
tail -f /var/log/nginx/error.log | grep -i "memory"
- 使用監(jiān)控工具(如 Prometheus + Grafana)收集內(nèi)存指標(biāo):
- 總內(nèi)存使用量
- 每個(gè) worker 進(jìn)程內(nèi)存使用
- 緩存命中率
二、常見(jiàn)原因與處理方法
1. 工作進(jìn)程(worker)過(guò)多
- 問(wèn)題表現(xiàn):多個(gè) worker 進(jìn)程占用大量?jī)?nèi)存
- 解決方法:
# 根據(jù) CPU 核心數(shù)調(diào)整 worker 數(shù)量 worker_processes auto; # 自動(dòng)匹配 CPU 核心數(shù)
2. 單個(gè)請(qǐng)求內(nèi)存消耗過(guò)大
- 問(wèn)題表現(xiàn):處理大文件或大請(qǐng)求時(shí)內(nèi)存激增
- 解決方法:
# 減小緩沖區(qū)大小 client_body_buffer_size 8k; # 客戶端請(qǐng)求體緩沖區(qū) large_client_header_buffers 4 8k; # 請(qǐng)求頭緩沖區(qū) # 限制上傳文件大小 client_max_body_size 10m;
3. 緩存配置不合理
- 問(wèn)題表現(xiàn):proxy_cache 或 fastcgi_cache 占用過(guò)多內(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"; # 限制單個(gè)緩存項(xiàng)大小 proxy_cache_max_range_offset 1m;
4. 內(nèi)存泄漏或第三方模塊問(wèn)題
- 問(wèn)題表現(xiàn):內(nèi)存持續(xù)增長(zhǎng)不釋放
- 解決方法:
# 啟用內(nèi)存調(diào)試(編譯時(shí)添加 --with-debug) error_log /var/log/nginx/error.log debug; # 逐步禁用第三方模塊,定位問(wèn)題模塊
5. SSL 會(huì)話緩存配置不當(dāng)
- 問(wèn)題表現(xiàn):HTTPS 流量大時(shí)內(nèi)存占用高
- 解決方法:
# 優(yōu)化 SSL 會(huì)話緩存 ssl_session_cache shared:SSL:20m; # 減少共享內(nèi)存大小 ssl_session_timeout 10m; # 縮短會(huì)話超時(shí)時(shí)間
三、內(nèi)存優(yōu)化建議
1. 調(diào)整工作進(jìn)程內(nèi)存分配
# 限制每個(gè) worker 進(jìn)程的最大內(nèi)存使用(需要 nginx-plus 或第三方模塊) worker_rlimit_nofile 65535;
2. 使用內(nèi)存限制工具
# 使用 cgroups 限制 Nginx 進(jìn)程組內(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. 臨時(shí)減少并發(fā)連接
# 限制每個(gè) IP 的并發(fā)連接數(shù) limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn perip 20; # 每個(gè) IP 最多 20 個(gè)連接
2. 關(guān)閉高內(nèi)存消耗功能
# 臨時(shí)關(guān)閉緩存 proxy_cache off; # 臨時(shí)關(guān)閉 SSL 會(huì)話緩存 # ssl_session_cache shared:SSL:20m; → 注釋掉此行
3. 重啟 Nginx 釋放內(nèi)存
# 平滑重啟(不中斷服務(wù)) nginx -s reload # 強(qiáng)制重啟 systemctl restart nginx
五、驗(yàn)證優(yōu)化效果
1. 壓力測(cè)試對(duì)比
# 使用 wrk 進(jìn)行壓力測(cè)試 wrk -t12 -c400 -d30s http://example.com/ # 對(duì)比優(yōu)化前后內(nèi)存增長(zhǎng)曲線
2. 長(zhǎng)期監(jiān)控指標(biāo)
- 內(nèi)存使用率趨勢(shì)圖
- 單個(gè)請(qǐng)求內(nèi)存消耗分布
- OOM(Out of Memory)事件記錄
3. 內(nèi)存泄漏檢測(cè)
# 使用 valgrind 檢測(cè)內(nèi)存泄漏(僅建議在測(cè)試環(huán)境使用) valgrind --leak-check=full --show-leak-kinds=all /usr/sbin/nginx -g "daemon off;"
通過(guò)以上步驟,可以系統(tǒng)性地排查和解決 Nginx 內(nèi)存占用過(guò)高問(wèn)題,同時(shí)建立長(zhǎng)效的內(nèi)存監(jiān)控機(jī)制,避免因內(nèi)存問(wèn)題導(dǎo)致服務(wù)中斷。
以上就是Nginx內(nèi)存占用過(guò)高排查與處理過(guò)程的詳細(xì)內(nèi)容,更多關(guān)于Nginx內(nèi)存占用過(guò)高的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nginx 部署啟動(dòng)jar包用到的一些命令和流程操作
這篇文章主要介紹了nginx 部署啟動(dòng)jar包用到的一些命令和流程操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11
k8s部署nginx訪問(wèn)Tomcat的實(shí)現(xiàn)示例
本文介紹了如何使用Kubernetes部署Nginx,并通過(guò)Nginx訪問(wèn)Tomcat,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
Nginx+Tomcat負(fù)載均衡集群安裝配置案例詳解
Nginx是一款非常優(yōu)秀的http服務(wù)器軟件,它能夠支持高達(dá)50000個(gè)并發(fā)連接數(shù)的相應(yīng),Nginx+Tomcat負(fù)載均衡集案列是應(yīng)用于生產(chǎn)環(huán)境的一套可靠的Web站點(diǎn)解決方案,對(duì)Nginx Tomcat負(fù)載均衡集群相關(guān)知識(shí)感興趣的朋友一起看看吧2021-10-10
centos7下基于nginx+uwsgi部署Django項(xiàng)目的實(shí)現(xiàn)
Django是一個(gè)開(kāi)源的Web應(yīng)用框架,使用Python語(yǔ)言編寫(xiě),主要用于搭建Web項(xiàng)目,本教程介紹如何在centos7下基于nginx+uwsgi部署Django項(xiàng)目的實(shí)現(xiàn),感興趣的可以了解一下2024-04-04
nginx外網(wǎng)訪問(wèn)內(nèi)網(wǎng)站點(diǎn)配置操作
這篇文章主要介紹了nginx外網(wǎng)訪問(wèn)內(nèi)網(wǎng)站點(diǎn)配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
利用nginx實(shí)現(xiàn)動(dòng)靜分離的負(fù)載均衡集群實(shí)戰(zhàn)教程
這篇文章介紹了利用nginx實(shí)現(xiàn)動(dòng)靜分離的負(fù)載均衡集群實(shí)戰(zhàn),本次用到的操作系統(tǒng)及服務(wù),本次實(shí)驗(yàn)一共需要3臺(tái)服務(wù)器,一臺(tái)nginx做為負(fù)載均衡分發(fā)器和動(dòng)靜分離的分發(fā)器,兩臺(tái)apache做為后端服務(wù)器,使用nginx實(shí)現(xiàn)兩臺(tái)apache服務(wù)器的負(fù)載均衡和動(dòng)靜分離,需要的朋友可以參考下2023-03-03

