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 Rewrite使用场景及配置方法解析

    Nginx Rewrite使用场景及配置方法解析

    这篇文章主要介绍了Nginx Rewrite使用场景及配置方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Nginx配置Https安全认证的实现

    Nginx配置Https安全认证的实现

    为了保障应用的安全性,我们在架构网络层的时候需要采用HTTPS协议。本文介绍了Nginx配置Https安全认证的实现,分享给大家,感兴趣的可以了解一下
    2021-05-05
  • nginx拦截非法host或直接使用ip访问的请求的实现

    nginx拦截非法host或直接使用ip访问的请求的实现

    非法拦截可以有效防止直接通过IP或本地绑定域名的方式进行非法访问,本文主要介绍了nginx拦截非法host或直接使用ip访问的请求的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • 使用nginx正向代理实现内网域名转发过程解析

    使用nginx正向代理实现内网域名转发过程解析

    这篇文章主要介绍了使用nginx正向代理实现内网域名转发过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Nginx进程杀不完的解决方法

    Nginx进程杀不完的解决方法

    这篇文章主要给大家介绍了Nginx进程杀不完的解决方法,文中通过图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,,需要的朋友可以参考下
    2023-12-12
  • Nginx代理WebSocket失败的完整排查过程

    Nginx代理WebSocket失败的完整排查过程

    在开发基于 WebSocket 的实时应用时,使用 Nginx 作为反向代理是常见做法,可是我遇见了后端直连 WebSocket 成功,通过 Nginx 代理却失败,本文将完整复盘一次真实排查过程,带你避开所有坑,需要的朋友可以参考下
    2025-11-11
  • Nginx与后台应用端口冲突的解决方案

    Nginx与后台应用端口冲突的解决方案

    在部署Web应用时,Nginx和后台应用(如Node.js、Python Flask、Java Spring Boot等)常常需要同时运行在一台服务器上,然而,当它们需要监听同一个端口(如8000)时,就会出现端口冲突的问题,本文将详细介绍几种解决Nginx与后台应用端口冲突的方法
    2025-02-02
  • Nginx配置及热升级的详细介绍

    Nginx配置及热升级的详细介绍

    Nginx与Apache一样,都是web服务器,但是Nginx比Apache多一些功能,比如Nginx可以做代理,可以做负载均衡,这篇文章主要介绍了Nginx配置以及热升级,需要的朋友可以参考下
    2024-07-07
  • nginx反向代理如何替换URL

    nginx反向代理如何替换URL

    这篇文章主要介绍了nginx反向代理如何替换URL问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • nginx实现多个域名和集群的方法步骤

    nginx实现多个域名和集群的方法步骤

    本文主要介绍了nginx实现多个域名和集群的方法步骤,需要配置Nginx作为反向代理服务器,将来自不同域名的请求转发到集群中的相应后端服务器,感兴趣的可以了解一下
    2024-04-04

最新评论