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实现URL重定向的简单方法

    利用Nginx实现URL重定向的简单方法

    使用Nginx的重定向功能时,除了可以重定向到新域名,还可以将请求重定向到特定的协议上,下面这篇文章主要给大家介绍了关于如何利用Nginx实现URL重定向的简单方法,需要的朋友可以参考下
    2022-04-04
  • Nginx实现动态拦截非法访问ip的方法

    Nginx实现动态拦截非法访问ip的方法

    最近在访问时不时会被暴力刷量,爬虫和恶意攻击导致数据库,服务等瘫痪,所以本文介绍了在Nginx上实现一个动态拦截IP的方法,具体是当某个IP在1分钟内访问超过60次时,将其加入Redis并拦截,拦截时间默认1天,需要的朋友可以参考下
    2025-02-02
  • Nginx实现非套路镜像站的踩坑记录

    Nginx实现非套路镜像站的踩坑记录

    这篇文章主要给大家介绍了关于Nginx实现非套路镜像站的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-02-02
  • nginx docker官方镜像添加自定义命令自动退出方式

    nginx docker官方镜像添加自定义命令自动退出方式

    文章介绍了在使用Nginx官方Docker镜像时遇到容器自动退出的问题,并解释了原因,通过在CMD命令中添加`-g 'daemon off'`参数,可以确保Nginx在前台运行,从而使容器不会因为CMD命令执行完毕而自动退出
    2026-01-01
  • 利用Nginx反向代理解决跨域问题详解

    利用Nginx反向代理解决跨域问题详解

    这篇文章主要介绍了利用Nginx反向代理解决跨域问题详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Nginx实现前端灰度发布

    Nginx实现前端灰度发布

    灰度发布是一种重要的策略,它允许我们在不影响所有用户的情况下,逐步推出新功能或更新,通过灰度发布,我们可以测试新版本的稳定性和性能,下面就来介绍一下前端灰度发布的使用,感兴趣的可以了解一下
    2025-03-03
  • 详解Nginx 静态文件服务配置及优化

    详解Nginx 静态文件服务配置及优化

    这篇文章主要介绍了Nginx 静态文件服务配置及优化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • nginx调用php-fpm出错解决方法和nginx配置详解

    nginx调用php-fpm出错解决方法和nginx配置详解

    这篇文章介绍了nginx调用php-fpm出错的解决方法,最后给出了nginx配置方法,需要的朋友可以参考下
    2014-03-03
  • Nginx防盗链与服务优化配置的全过程

    Nginx防盗链与服务优化配置的全过程

    由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,下面这篇文章主要给大家介绍了关于Nginx防盗链与服务优化配置的相关资料,需要的朋友可以参考下
    2022-01-01
  • Nginx在linux和windows下代理静态文件夹方式

    Nginx在linux和windows下代理静态文件夹方式

    Windows下配置Nginx代理E盘data文件夹,开发端口7766;Linux下配置Nginx代理home/mydata文件夹,开发端口7766,重启Nginx方法:Windows直接nginx -s reload;Linux根据安装位置使用find命令找到sbin目录后,使用/usr/sbin/nginx -s reload重启
    2025-11-11

最新评论