Nginx服务器连接数告警处理及解决方案

 更新时间:2025年12月22日 10:26:33   作者:代码小侦探  
本文详细介绍了处理Nginx服务器连接数告警问题的方法,首先,通过查看连接状态和Nginx配置,可以确定是Nginx与upstream的连接是短连接,未开启长连接配置,其次,需要检查客户端的长连接配置,并可能需要优化操作系统的内核参数

序言

在系统间交互频繁的场景中,连接数是一个重要的指标。通常,我们会为连接数设置一个告警阈值,比如几万。

当连接数超过这个阈值时,就会触发告警。连接数过多会消耗CPU、内存、文件句柄等资源。虽然可以通过提高阈值(如10万或30万)来暂时缓解告警问题,但只要CPU和内存资源未告警,情况还不算紧急。本文将详细介绍如何处理Nginx服务器连接数告警问题。

服务端连接数异常告警排查

1. 查看连接状态

当Nginx充当转发服务器时,连接数告警是很常见的,尤其是在QPS(每秒查询数)很高的情况下。收到告警后,我们通常需要登录服务器,使用netstatss命令来查看连接状态。

注意:在使用ss命令时,如果命令格式和netstat类似,默认情况下ss不会显示TIME-WAIT状态的连接,因为ss认为这种状态不重要。

执行以下命令查看连接状态:

netstat -an | grep ESTABLISHED
# 或者
ss -ant | grep ESTABLISHED

执行命令后,我们可以发现哪种状态的连接占用最多。在正常情况下,TIME-WAIT状态的连接可能占用很多。接下来,我们可以查看是哪些IP占用了大量连接。

在当前场景下,如果发现与后端服务连接的TIME-WAIT状态较多,即显示的都是Nginx的upstream服务器,那么可以大致判断为Nginx与upstream的连接是短连接,未开启长连接配置。

2. 查看Nginx的配置

在默认情况下,如果在upstream的配置中没有特别设置,Nginx与upstream的连接是短连接的。

特别需要注意的是keepalive参数,它限制的是空闲连接的数量(不会限制upstream的最大连接数)。以下是相关参数的配置:

Syntax:  keepalive_timeout timeout;
Default: keepalive_timeout 60s;
Context: upstream

Syntax:  keepalive_requests number;
Default: keepalive_requests 1000;
Context: upstream

在一般情况下,这两个参数保持默认值即可。如果并发量很大,可以将keepalive设置为300,并将timeoutrequests设置得大一点,以减少连接被释放的次数。

如果keepalive_timeout设置得很小,会导致连接不停地被释放和创建,最直接的影响是增大请求的响应时间(RT),消耗Nginx的资源,并有更高的连接和关闭开销,同时也会影响后端服务器的性能。

在upstream的长连接需要关闭时,会按照四次挥手协议进行关闭,并且会等连接处理完成后再关闭,不会像某些框架那样到了时间直接关闭,不管请求是否结束。

3. 客户端的长连接

对于Nginx来说,默认情况下就开启了客户端的长连接功能,所以一般只需要配置超时时间即可。

Syntax:  keepalive_timeout timeout [header_timeout];
Default: keepalive_timeout 75s;
Context: http, server, location

需要注意的是,如果客户端的连接都是短连接,而没有长连接,那么需要检查客户端的请求头,查看Connection头部是否为close,强制要求使用短连接。

另外,还需要查看客户端使用的协议是否是HTTP/1.0(默认都是短连接)。如果未出现上述情况,那么需要检查Nginx的配置中,是否将Connection头部设置为空字符串,否则不但客户端是短连接,还会影响Nginx和upstream之间也是短连接。

如果客户端发送的Connection头部是close,但是Nginx设置了Connection头部为空字符串,那么Nginx和后端依旧是长连接。

4. 优化操作系统的内核参数

如果发现客户端的连接有很多TIME-WAIT状态,可以通过优化操作系统的内核参数来解决。编辑/etc/sysctl.conf文件,添加或修改以下参数:

net.ipv4.tcp_keepalive_time = 1200  # 使用TCP探测尽快处理空闲的连接
net.ipv4.tcp_fin_timeout = 30       # 设置FIN WAIT2等待时间,减少等待关闭连接的时间,尽快释放系统资源
net.ipv4.tcp_max_tw_buckets = 200000 # 控制TIMEWAIT数量
net.ipv4.tcp_tw_recycle = 0         # 禁用TIMEWAIT的快速回收,已废弃,防止潜在网络问题
net.ipv4.tcp_tw_reuse = 1           # 启用TIMEWAIT状态的连接便于新的连接
net.ipv4.tcp_timestamps = 1         # 启用TCP时间戳选项,提高网络传输效率,提高TCP连接安全性
net.ipv4.netdev_max_backlog = 262148 # 允许入队列的数据包的最大数量

保存文件后,执行sysctl -p命令使配置生效。

运行结果示例

假设我们在服务器上执行了以下命令来查看连接状态:

ss -ant | grep ESTABLISHED

可能得到如下输出:

ESTAB      0      0      192.168.1.100:80       192.168.1.101:54321  
ESTAB      0      0      192.168.1.100:80       192.168.1.102:54322  
...

这表示有多个建立的连接。通过类似的方法,我们可以进一步分析具体哪些IP或端口占用了大量连接。

总结

Nginx的复杂之处在于它既是客户端又是服务端。在充当客户端时,需要设置连接超时参数;在充当服务端时,也需要设置连接超时参数。并且这些参数的名字还差不多,只是写的位置不一样,有的是在http段中,有的是在upstream段中。通过仔细排查和优化配置,我们可以有效解决Nginx服务器连接数告警问题。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Nginx map 实现时间格式转换的方法

    Nginx map 实现时间格式转换的方法

    最近我们需要把 Nginx 的日志接入到自研的日志采集平台上,但是这个平台只支持 JSON 格式,所以需要把 Nginx 日志格式改成 JSON 格式,这篇文章主要介绍了Nginx map 实现时间格式转换,需要的朋友可以参考下
    2023-09-09
  • Nginx下载、安装与使用图文教程

    Nginx下载、安装与使用图文教程

    Nginx是一个高性能的HTTP和反向代理服务器,支持IMAP/POP3/SMTP服务,本文介绍了Nginx的下载、安装、启动和关闭方法,包括Windows版和Linux版(CentOS下)的详细步骤,需要的朋友可以参考下
    2024-11-11
  • Nginx中autoindex的具体使用

    Nginx中autoindex的具体使用

    autoindex是Nginx配置的一个指令,它可以控制Nginx是否允许在浏览器中显示一个目录的内容,本文主要介绍了Nginx中autoindex的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • 使用MongoDB分析Nginx日志的方法详解

    使用MongoDB分析Nginx日志的方法详解

    在项目开发过程中,总是离不开日志解析的工作,虽然有些时候觉得确实挺繁琐的,但是静下心来会发现有时候也是挺有趣的1件工作。 下面这篇文章主要介绍了使用MongoDB分析Nginx日志的方法,需要的朋友可以参考借鉴,一起来看看吧。
    2017-01-01
  • Nginx 启用 OCSP Stapling的配置

    Nginx 启用 OCSP Stapling的配置

    本篇文章主要介绍了Nginx 启用 OCSP Stapling的配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • nginx中配置sse的方法示例

    nginx中配置sse的方法示例

    本文主要介绍了nginx中配置sse的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • Nginx代理本地文件夹实现方式

    Nginx代理本地文件夹实现方式

    文章介绍了如何使用Nginx作为代理来访问本地文件夹,并通过修改nginx.conf文件来配置Nginx,启动Nginx后,可以通过startnginx.exe命令来启动服务,个人经验分享,希望能为读者提供参考
    2025-11-11
  • nginx proxy_set_header设置自定义header的实现步骤

    nginx proxy_set_header设置自定义header的实现步骤

    在Nginx中,使用 proxy_set_header指令可以自定义header并在反向代理时传递到后端服务器,本文就来详细的介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • 详解Nginx中的Rewrite的重定向配置与实践

    详解Nginx中的Rewrite的重定向配置与实践

    这篇文章主要介绍了详解Nginx中的Rewrite的重定向配置与实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 使用Nginx和pm2部署Next.js项目

    使用Nginx和pm2部署Next.js项目

    本文主要介绍了使用Nginx和pm2部署Next.js项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论