资讯专栏INFORMATION COLUMN

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

Coding01 / 3741人阅读

摘要:印象中相关的,在环境的话,有一个参数可能会造成丢包。不过总算解决了。参考文章之内核参数优化协议字段导致问题分析内核参数对用户的影响和导致失败问题

这两天生产上面的一个业务遇到一个超时的问题, 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 错误,综合第二步和第三步骤,可以确定,问题可能应该出现在两个地方

前端服务器访问 LVS 的时候

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失败问题

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39086.html

相关文章

  • Nginx高并发下优化

    摘要:效率低,主要是轮询效率低,而且还要分别轮询三个事件描述符的集合。不同点是为事件事件以及事件只创建一个集合,在每个描述符对应的结构上分别设置事件事件以及事件。 写在前面 最近在进行服务器的优化,正好在看nginx相关的知识,所以把一些知识整理一下。参考资料为《Nginx高性能web服务器详解》,建议大家都去读读这本书。我的机器为四核CPU,16G内存。 内核参数优化 把如下的参数追加到L...

    lavor 评论0 收藏0
  • redis连接成功操作无反应,nginx 504另一个原因

    摘要:遇到的个问题问题启动后,连接成功,时无反应,查看进程存在。问题,,访问页面正常,访问页面每次出现错误,修改配置文件调大响应时间均无效。一些尝试这两个问题不是同一天遇到的,究根结底原因是一样的。 遇到的2个问题 问题1: redis-server启动后,redis-client连接成功,set时无反应,查看redis-server进程存在。问题2: nginx,php-fpm,访问ht...

    I_Am 评论0 收藏0

发表评论

0条评论

Coding01

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<