我们在 RHEL 6.6 上的 Web 服务器 Varnish + Nginx + FastCGI (php-fpm) 上运行以下堆栈
它是一个动态网站,每次都有不同的结果集,并且有大约 200 万个 url 被谷歌索引。
我们在某些无法解决的页面上间歇性地收到 504 网关超时。一段时间后,给出 504 的 URL 可以正常工作。
我们从日志中了解到 504,但我们无法复制它,因为它随机发生在任何 URL 上并且在一段时间后起作用。
我与开发人员进行了几次讨论,但根据他的说法,底层的 php 脚本几乎没有做任何事情,它不应该花这么长时间(120 秒),但它仍然给出 504 网关超时。
需要确定问题发生的确切位置:
120 秒后 URL 超时并显示 504
下面是看到的错误:
2016/01/04 17:29:20 [错误] 1070#0:*196333149 连接上游时上游超时(110:连接超时),客户端:66.249.74.95,服务器:xxxx,请求:“GET/Some/url HTTP/1.1”,上游:“fastcgi://127.0.0.1:9000”,主机:“example.com”
早些时候 fastcgi_connect_timeout 为 150 秒 - 它曾经在 63 秒后给出 502 状态代码,默认 net.ipv4.tcp_syn_retries = 5 在 RHEL 6.6 上;之后我们设置 net.ipv4.tcp_syn_retries = 6 然后它在 127 秒后开始给出 502。
一旦我设置了 fastcgi_connect_timeout = 120,它就开始给出 504 状态代码。我理解具有如此高值的 fastcgi_connect_timeout 并不好。
需要找出为什么我们得到 504(我知道它的超时但原因未知)。需要找到根本原因以永久修复它。
我如何确认问题究竟出在哪里?
以下是一些已经定义的超时:
在服务器范围的 nginx.conf 下:
在特定的 vhost.conf 下:
使用了不同的超时值,因此我可以找出确切触发了哪个超时。
以下是 sysctl.conf 中的一些设置:
如果代码写得不好,那么我需要通知开发人员 504 是由于 php 代码问题而不是由于 nginx 或 php-fpm 而发生的,如果是由于 Nginx 或 Php-fpm 则需要修复它。
提前致谢!
======
进一步更新:
有2种情况:
2016/01/05 03:50:54 [错误] 1070#0:*201650845 连接上游时上游超时(110:连接超时),客户端:66.249.74.99,服务器:xxxx,请求:“GET/some/url HTTP/1.1”,上游:“fastcgi://127.0.0.1:9000”,主机:“example.com”
2016/01/05 00:51:43 [error] 1067#0: *200656359 从上游读取响应头时上游超时(110:连接超时),客户端:115.112.161.9,服务器:192.168.12.101,请求“GET/some/url HTTP/1.1”,上游:“fastcgi://127.0.0.1:9000”,主机:“example.com”
最佳答案
尝试增加 fastcgi_read_timeout
和 proxy_read_timeout
在您的 nginx 配置中甚至更多。
您可以将此添加到任何具有较长任务的文件的顶部
ini_set('max_execution_time', '0'); // for infinite time of execution
ini_set('max_execution_time', '300'); //300 seconds = 5 minutes
ini_set('memory_limit','2048M'); // For unlimited memory limit set -1
关于php - 调试504网关超时及实际原因及解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34593048/