Nginx内存占用过高排查与处理过程

 更新时间:2025年08月18日 10:42:13   作者:alden_ygq  
Nginx内存使用率过高就像是一场暴风雨,会给我们的网站和应用带来不小的麻烦,但只要我们能够冷静分析,找出问题的根源,对症下药,就一定能够化解危机,所以本文给大家介绍了Nginx内存占用过高排查与处理过程,需要的朋友可以参考下

一、排查流程

1. 确认内存占用情况

使用 top 或 ps 命令查看 Nginx 进程内存占用:

top -p $(pgrep nginx | tr '\n' ',')  # 实时查看 Nginx 进程
ps -o pid,rss,command -p $(pgrep nginx)  # 查看 RSS(实际物理内存)占用

使用 pmap 分析单个进程内存分布:

pmap -x $(pgrep nginx | head -n1) | tail -n 10  # 查看内存映射

2. 分析内存占用类型

共享内存(SHM)

# 查看共享内存段
ipcs -m | grep nginx

缓存内存

# 检查 proxy_cache 或 fastcgi_cache 配置
grep -r "proxy_cache" /etc/nginx/

3. 检查 Nginx 配置

查看是否启用高内存消耗模块:

# 检查是否启用 large_client_header_buffers
large_client_header_buffers 4 16k;  # 每个请求可能占用 64KB
 
# 检查 proxy_buffer 配置
proxy_buffers 8 16k;  # 每个连接可能占用 128KB

4. 分析日志与监控数据

检查错误日志:

tail -f /var/log/nginx/error.log | grep -i "memory"
  • 使用监控工具(如 Prometheus + Grafana)收集内存指标:
    • 总内存使用量
    • 每个 worker 进程内存使用
    • 缓存命中率

二、常见原因与处理方法

1. 工作进程(worker)过多

  • 问题表现:多个 worker 进程占用大量内存
  • 解决方法
# 根据 CPU 核心数调整 worker 数量
worker_processes auto;  # 自动匹配 CPU 核心数

2. 单个请求内存消耗过大

  • 问题表现:处理大文件或大请求时内存激增
  • 解决方法
# 减小缓冲区大小
client_body_buffer_size 8k;        # 客户端请求体缓冲区
large_client_header_buffers 4 8k;  # 请求头缓冲区
 
# 限制上传文件大小
client_max_body_size 10m;

3. 缓存配置不合理

  • 问题表现:proxy_cache 或 fastcgi_cache 占用过多内存
  • 解决方法
# 优化缓存参数
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. 内存泄漏或第三方模块问题

  • 问题表现:内存持续增长不释放
  • 解决方法
# 启用内存调试(编译时添加 --with-debug)
error_log /var/log/nginx/error.log debug;
 
# 逐步禁用第三方模块,定位问题模块

5. SSL 会话缓存配置不当

  • 问题表现:HTTPS 流量大时内存占用高
  • 解决方法
# 优化 SSL 会话缓存
ssl_session_cache shared:SSL:20m;  # 减少共享内存大小
ssl_session_timeout 10m;           # 缩短会话超时时间

三、内存优化建议

1. 调整工作进程内存分配

# 限制每个 worker 进程的最大内存使用(需要 nginx-plus 或第三方模块)
worker_rlimit_nofile 65535;

2. 使用内存限制工具

# 使用 cgroups 限制 Nginx 进程组内存
echo "1000000000" > /sys/fs/cgroup/memory/nginx/memory.limit_in_bytes  # 限制为 1GB

3. 优化静态资源处理

# 禁用不必要的静态资源缓冲区
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 分区作为缓冲

# 创建 swap 文件(8GB 示例)
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

四、应急处理措施

1. 临时减少并发连接

# 限制每个 IP 的并发连接数
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 20;  # 每个 IP 最多 20 个连接

2. 关闭高内存消耗功能

# 临时关闭缓存
proxy_cache off;
 
# 临时关闭 SSL 会话缓存
# ssl_session_cache shared:SSL:20m; → 注释掉此行

3. 重启 Nginx 释放内存

# 平滑重启(不中断服务)
nginx -s reload
 
# 强制重启
systemctl restart nginx

五、验证优化效果

1. 压力测试对比

# 使用 wrk 进行压力测试
wrk -t12 -c400 -d30s http://example.com/
 
# 对比优化前后内存增长曲线

2. 长期监控指标

  • 内存使用率趋势图
  • 单个请求内存消耗分布
  • OOM(Out of Memory)事件记录

3. 内存泄漏检测

# 使用 valgrind 检测内存泄漏(仅建议在测试环境使用)
valgrind --leak-check=full --show-leak-kinds=all /usr/sbin/nginx -g "daemon off;"

通过以上步骤,可以系统性地排查和解决 Nginx 内存占用过高问题,同时建立长效的内存监控机制,避免因内存问题导致服务中断。

以上就是Nginx内存占用过高排查与处理过程的详细内容,更多关于Nginx内存占用过高的资料请关注脚本之家其它相关文章!

相关文章

  • nginx 部署启动jar包用到的一些命令和流程操作

    nginx 部署启动jar包用到的一些命令和流程操作

    这篇文章主要介绍了nginx 部署启动jar包用到的一些命令和流程操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Nginx的HA高可用的搭建的实现

    Nginx的HA高可用的搭建的实现

    高可用是一种系统设计策略,旨在确保服务或应用在面对硬件故障、软件缺陷或任何其他异常情况时,仍能持续稳定地运行,本文主要介绍了Nginx的HA高可用的搭建,感兴趣的可以了解一下
    2024-08-08
  • 升级nginx以支持http2的方法

    升级nginx以支持http2的方法

    本篇文章主要介绍了升级nginx以支持http2的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • k8s部署nginx访问Tomcat的实现示例

    k8s部署nginx访问Tomcat的实现示例

    本文介绍了如何使用Kubernetes部署Nginx,并通过Nginx访问Tomcat,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • Nginx实现接口限流的方法汇总

    Nginx实现接口限流的方法汇总

    这篇文章主要为大家详细介绍了Nginx实现接口限流的相关方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • Nginx+Tomcat负载均衡集群安装配置案例详解

    Nginx+Tomcat负载均衡集群安装配置案例详解

    Nginx是一款非常优秀的http服务器软件,它能够支持高达50000个并发连接数的相应,Nginx+Tomcat负载均衡集案列是应用于生产环境的一套可靠的Web站点解决方案,对Nginx Tomcat负载均衡集群相关知识感兴趣的朋友一起看看吧
    2021-10-10
  • 浅析Nginx配置文件中的变量的编写使用

    浅析Nginx配置文件中的变量的编写使用

    这篇文章主要介绍了Nginx配置文件中的变量的编写使用,包括从常用的rewrite等方面来深入变量的相关定义,需要的朋友可以参考下
    2016-01-01
  • centos7下基于nginx+uwsgi部署Django项目的实现

    centos7下基于nginx+uwsgi部署Django项目的实现

    Django是一个开源的Web应用框架,使用Python语言编写,主要用于搭建Web项目,本教程介绍如何在centos7下基于nginx+uwsgi部署Django项目的实现,感兴趣的可以了解一下
    2024-04-04
  • nginx外网访问内网站点配置操作

    nginx外网访问内网站点配置操作

    这篇文章主要介绍了nginx外网访问内网站点配置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 利用nginx实现动静分离的负载均衡集群实战教程

    利用nginx实现动静分离的负载均衡集群实战教程

    这篇文章介绍了利用nginx实现动静分离的负载均衡集群实战,本次用到的操作系统及服务,本次实验一共需要3台服务器,一台nginx做为负载均衡分发器和动静分离的分发器,两台apache做为后端服务器,使用nginx实现两台apache服务器的负载均衡和动静分离,需要的朋友可以参考下
    2023-03-03

最新评论