nginx 重新加载时,端口 443 上发生 SYN 泛洪

nginx 重新加载时,端口 443 上发生 SYN 泛洪

重新加载 nginx 时,我开始在消息日志中收到错误“端口 443 上可能存在 SYN 泛洪”,并且似乎 nginx 在那时(很长一段时间)完全没有响应,因为 zabbix 报告“nginx 已关闭”,ping 为 0。当时的 RPS 约为 1800。

但是,服务器在其他非 Web 端口(SSH 等)上保持响应。

我应该查看哪里以及应该显示哪些配置(sysctl,nginx)来找到这个问题的根本原因。

提前致谢。

一些附加信息:

$ netstat -tpn |awk '/nginx/{print $6,$7}' |sort |uniq -c
   3266 ESTABLISHED 31253/nginx
   3289 ESTABLISHED 31254/nginx
   3265 ESTABLISHED 31255/nginx
   3186 ESTABLISHED 31256/nginx

nginx.conf示例:

worker_processes  4;
timer_resolution 100ms;
worker_priority -15;
worker_rlimit_nofile 200000;

events {
  worker_connections  65536;
  multi_accept on;
  use epoll;
}

http {

  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;

  keepalive_requests 100;
  keepalive_timeout  65;

}

自定义 sysctl.conf

net.ipv4.ip_local_port_range=1024 65535
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.all.send_redirects=0
net.core.netdev_max_backlog=10000
net.ipv4.tcp_syncookies=0
net.ipv4.tcp_max_syn_backlog=20480
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_syn_retries=2
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.netfilter.nf_conntrack_max=1048576
net.ipv4.tcp_congestion_control=htcp
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_max_tw_buckets=1400000
net.core.somaxconn=250000
net.ipv4.tcp_keepalive_time=900
net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_fin_timeout=10

更新型多巴胺

在大约 1800 RPS 的正常负载下,当我将 80 和 443 端口上的 nginx 积压设置为 10000,然后重新加载 nginx 时,它会使用更多 RAM(我的 4GB 实例中有 3.8GB 被使用,一些工作进程被 OOM-killer 杀死),并且当 worker_priority 为 -15 时,负载超过 6(而我的实例只有 4 个核心)。因此,实例非常滞后,我将 worker_priority 设置为 -5,并将每个端口的积压设置为 1000。目前,它使用的内存较少,峰值负载为 3.8,但是,重新加载后 nginx 仍然会在一两分钟内无响应。所以,问题仍然存在。

一些 netstat 详细信息:

netstat -tpn |awk '/:80/||/:443/{print $6}' |sort |uniq -c
      6 CLOSE_WAIT
     14 CLOSING
  17192 ESTABLISHED
    350 FIN_WAIT1
   1040 FIN_WAIT2
    216 LAST_ACK
    338 SYN_RECV
  52541 TIME_WAIT

答案1

该消息表明您的 TCP SYN 队列在重新加载期间溢出 - 重新加载是否需要一段时间才能完成?我注意到您已将net.core.netdev_max_backlognet.ipv4.tcp_max_syn_backlognet.core.somaxconn设置为高值,这很好。您还需要确保您已告诉您的 nginx 服务器使用较大的 SYN 积压listen 443 backlog=10000; http://nginx.org/en/docs/http/ngx_http_core_module.html#listen

相关内容