我厌倦了多次尝试使用 PHP-FPM 修复 Apache 2.4 中 mod_proxy 的 504 网关超时问题。所以我尝试在这里找到解决方案。实际上,我计划将软件从旧的 Apache 服务器迁移到新的 Ubuntu 18.04。20 GB MySQL 超过 3000 万个条目 98 个表,虽然不大,但有时很慢。
脚本正在运行,但耗时较长的操作(如用户、数据删除或数据库优化(5000 秒))以 504 结束。Apache 错误日志显示
[Fri Sep 20 22:08:44.426924 2019] [proxy_fcgi:error] [pid 9308] (70007)The timeout specified has expired: [client 87.xx.204.109:62982] AH01075: Error dispatching request to : (polling), referer: https://test.xxxx
[Fri Sep 20 22:14:05.539446 2019] [proxy_fcgi:error] [pid 9308] (70007)The timeout specified has expired: [client 87xx.204.109:62982] AH01075: Error dispatching request to : (polling), referer: https://test.xxxx
[Fri Sep 20 22:39:54.892255 2019] [proxy_fcgi:error] [pid 9273] (70007)The timeout specified has expired: [client 87.x.204.109:50931] AH01075: Error dispatching request to : (polling), referer: https://test.xxxx
第一个是设置max_execution_time
为无限,但没有效果。第二个memory limit
也是input time
没有效果
我决定在 PHP-FPM 池中设置,request_terminate_timeout = 0
但同样无效 [我知道这是标准]。也许我必须设置一个 proxy_timeout,但我的服务器管理系统 liveconfig 管理虚拟主机。我找到了 Ngix 的解决方案,但没有找到 apache 的解决方案。我还尝试了 mod_php,它适用于解决方案,所以我认为问题出在 mod_proxy 上,php 端没问题。
我该怎么做才能将 mod_proxy 的超时时间提高到 5000 以上
<IfModule mod_proxy_fcgi.c>
<FilesMatch ".+\.ph(p[3457]?|t|tml|ps)$">
SetHandler "proxy:unix:/var/run/php7.2-fpm/web0.sock|fcgi://localhost"
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</FilesMatch>
</IfModule>
有人能帮我吗?我发现我可以使用超时
答案1
默认情况下,Apache 使用Timeout
配置为60
秒的指令。
要修改代理请求的超时时间,您必须使用ProxyTimeout
。
例如:
<IfModule mod_proxy.c>
ProxyTimeout 180
</IfModule>
Apache 文档中的更多信息:https://httpd.apache.org/docs/2.4/en/mod/mod_proxy.html#proxytimeout
答案2
我遇到了类似的问题,在仔细阅读示例后,我找到了解决方案https://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html
特别是“通过处理程序代理”的示例很有帮助。
这应该将 mod_proxy 的超时设置为 '''超过 9000!!!'''
<IfModule mod_proxy_fcgi.c>
<FilesMatch ".+\.ph(p[3457]?|t|tml|ps)$">
SetHandler "proxy:unix:/var/run/php7.2-fpm/web0.sock|fcgi://localhost"
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</FilesMatch>
<Proxy "fcgi://localhost">
ProxySet timeout=9001
</Proxy>
</IfModule>
来自上面的链接:
“与 SetHandler 匹配的部分是跟随管道的部分。”
该部件fcgi://localhost
必须在SetHandler
和内Proxy
。
答案3
我通过链接修复https://shouts.dev/articles/apache-proxy-fcgi-the-timeout-specified-has-expired-on-rhel 这是 apache 的错误超时