Nginx 504 问题解决 ---- 由 tcp_timestamps 导致的连接问题

本文详细记录了一次Nginx 504超时问题的排查过程,从日志分析开始,逐步深入到后端集群服务器和LVS之间的连接问题,最终通过抓包和调整内核参数找到了问题所在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天生产上面的一个业务遇到一个超时的问题, nginx 的日志现象 504 超时。最后终于解决了,写这篇博客记录下,梳理下处理的整个过程。

故障排查

第一步
首先是排查 nginx 的 504 错误日志,对错误日志分析,看是否有规律,主要是统计来源 IP, URL。

结论:

排查后的结果是,出现 504 的 URL 就那么两三个,来源 IP 没有规律,根据这个找到开发人员,看是否是其请求的 URL 有问题,通过和开发人员的定位,排除了 URL 的问题,所以 URL 和 IP 方面排除出去,进行下一步

第二步

在 nginx 的日志中,新增几个日志记录字段,新增了 $upstream_status$upstream_response_time$upstream_addr 这三个字段,通过这三个字段是想判断是后端集群的所有服务器都出现 504 还是说只有部分,还有每台的超时时间是多少。

通过在 nginx.conf 配置文件的日志部分新增这三个字段后,加载 nginx ,再查看 nginx 日志发现,是所有的后端集群都出现了 504 的问题

结论:

初步推断是不是后端集群服务器的问题。

第三步

因为我这边是前端是通过域名访问的后端,所以为了进一步确定问题,我在前端集群中的一台 /etc/hosts 上面把域名和后端的真实服务器做绑定,前端集群中的其他服务器还是通过域名与 LVS 的 VIP 做绑定访问

结论:

排查后的结果是直接绑定后端真实服务器的时候,不再出现 504 错误,而其他还是通过 VIP 访问的依旧有 504 错误,综合第二步和第三步骤,可以确定,问题可能应该出现在两个地方

  1. 前端服务器访问 LVS 的时候
  2. LVS 到 后端服务器之间

第四步

这步为了排除问题,只好是抓包解决了,使用的工具就是 tcpdumpWireshark
首先是在 前端服务器抓包,主要是抓取目的端是 LVS VIP 的

sudo /usr/sbin/tcpdump tcp -vv -i bond0 and  dst host 1.1.1.2 -w ./myi.cap

在 LVS 服务器上抓包,抓取去往后端集群中服务器的包

sudo /usr/sbin/tcpdump tcp -vv and dst host 1.21.4.11 or dst host 1.21.4.12 or dst host 1.21.4.13 or dst host 1.21.4.14 -w ./user.cap

最后把抓取的包用 wireshark 查看分析。

第五步

通过抓包确定了是 LVS 到 后端服务器直接可能有问题,然后询问下其他的同事,知道这在 3 层做了 snat。印象中 LVS 相关的,在 NAT 环境的话,有一个参数可能会造成丢包。感觉 google 下,最后发现有可能是 net.ipv4.tcp_timestamps = 1 这个参数引起的。因此把 timestamps 关闭。

查看有多少包由于这个原因被拒绝了:

 netstat -s |grep  rejects

172 packets rejects in established connections because of timestamp
sudo vim /etc/sysctl.conf  # 在该文件最后加入以下


net.ipv4.tcp_timestamps = 0

###生效
sudo /sbin/sysctl -p 

最后观察日志,504 消失,问题解决。不禁哀嚎,我也终于遇到这个问题。不过总算解决了。此文只是一个我的分析排查过程,具体的报文什么的就不贴了,因为我懒得涂鸦关键字(涉及一些 IP 信息,你们懂的)。

导致这个问题的详细原理,下面的参考文章已经讲的很清楚,我就不讲了。

参考文章

  • Linux 之 TCP/IP 内核参数优化
  • tcp 协议 timestamp 字段导致问题分析
  • tcp 内核参数对 NAT 用户的影响
  • tcp_tw_recycle和tcp_timestamps导致connect失败问题
cd /mnt mkdir -p iso cdrom mount -o loop /mnt/iso/*.iso /mnt/cdrom cd /etc/yum.repos.d/ mv openEuler.repo openEuler.repo.bak vi local.repo [openEuler] name=openEuler baseurl=file:///mnt/cdrom enabled=1 gpgcheck=1 gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-openEuler yum clean all yum makecache yum install -y java-1.8.0* yum install -y python3 hostnamectl set-hostname ogserver echo "192.168.1.15 ogserver" >>/etc/hosts systemctl stop firewalld.service systemctl disable firewalld.service sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config setenforce 0 echo "transparent_hugepage=never" >> /etc/default/grub grub2-mkconfig -o /boot/grub2/grub.cfg echo "RemoveIPC=no" >> /etc/systemd/logind.conf echo "RemoveIPC=no" >> /usr/lib/systemd/system/systemd-logind.service systemctl daemon-reload systemctl stop systemd-logind systemctl start systemd-logind vi /etc/sysctl.conf net.ipv4.tcp_max_tw_buckets=10000 net.ipv4.tcp_tw_reuse = 1 #net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_keepalive_probes=9 net.ipv4.tcp_keepalive_intvl=30 net.ipv4.tcp_retries1 = 5 net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_synack_retries = 5 net.ipv4.tcp_retries2 = 12 net.ipv4.tcp_rmem = 8192 250000 16777216 vm.overcommit_memory = 0 net.ipv4.tcp_wmem = 8192 250000 16777216 net.core.wmem_max = 21299200 net.core.rmem_max = 21299200 net.core.wmem_default = 21299200 net.core.rmem_default = 21299200 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_sack = 1 net.ipv4.tcp_timestamps = 1 fs.aio-max-nr=1048576 fs.file-max= 76724600 kernel.sem = 4096 2048000 32 32768 kernel.shmall = 1048576 kernel.shmmax = 4294967296 kernel.shmmni = 8192 net.core.netdev_max_backlog = 65535 net.core.somaxconn = 65535 net.ipv4.tcp_fin_timeout = 60 vm.swappiness = 0 net.ipv4.ip_local_port_range = 26000 65535 fs.nr_open = 20480000 sysctl -p groupadd -g 1000 dbgrp useradd -u 1000 omm -g dbgrp echo "Omm@1000" | passwd omm --stdin mkdir -p /data/{openGauss,backup,archive_wals,core_pattern} chmod 700 /data/{openGauss,backup,archive_wals,core_pattern} chown -R omm:dbgrp /data/{openGauss,backup,archive_wals,core_pattern} mkdir -p /opt/openGauss chown omm:dbgrp -R /opt/openGauss/ chmod 755 /opt/openGauss/ vi /etc/security/limits.conf omm soft nproc unlimited omm hard nproc unlimited omm soft nofile 102400 omm hard nofile 102400 omm soft stack unlimited omm hard stack unlimited omm soft core unlimited omm hard core unlimited omm soft memlock unlimited echo "/data/core_pattern/core-%e-%p-%t" > /proc/sys/kernel/core_pattern yum install -y zlib-devel libaio libuuid readline-devel krb5-libs yum install -y libicu libxslt tcl perl openldap pam openssl-devel libxml2 python3 将以上代码生成linux可以执行的shell文件
最新发布
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值