在 wordpress 网站上,我们会将请求发送到 CloudFront,然后 CloudFront 将请求发送到原点(如有必要),原点会经过 ELB,然后发送到为该请求提供服务的两个或三个实例。
大多数请求都可以正常工作,但是当我们将 JSON 文件上传到时admin-ajax.php
,会导致从 CloudFront 日志中捕获的 504 错误:
2022-01-31 21:32:24 MIA3-C2 1462 67.190.247.197 POST d2q8ixmwt0jy43.cloudfront.net /wp-admin/admin-ajax.php 504 https://xxxxxxx.com/wp-admin/edit.php?post_type=elementor_library&tabs_group=library Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/97.0.4692.99%20Safari/537.36%20Edg/97.0.1072.76 - - Error Ae0gLzThCiZR2N5D8gLO6s-o8IwwlmYrxWvUbUgr1A64_nMpzN0qRg== evolvetelemed.com https 167737 30.107 - TLSv1.3 TLS_AES_128_GCM_SHA256 Error HTTP/2.0 - - 64798 30.107 OriginCommError text/html 1033 - -
错误似乎是OriginCommError
,但我不明白为什么会出现这个错误。跟踪实例上的 Web 服务器上的日志显示请求甚至没有到达那里。
我不太清楚为什么有些请求可以工作,而有些则不行。进一步的结论是,当媒体库中的二进制文件上传到时async-upload.php
,它可以工作。
我们nginx
在前端使用它作为php-fpm
处理 php 的 web 服务器。
答案1
这不是一个完整的答案,但它太长了,不适合评论,它可能会给你一些想法。一旦我们得到真正的答案,我就会删除它。
一些想法:
- 字段“30.107”表示“处理请求所需的时间”,根据这一页。30s是标准的http超时长度,这个很有意思。
- 504 状态响应表示“网关超时”。更详细的说法是“服务器在充当网关或代理时,未及时收到完成请求所需的上游服务器的响应。”
- CloudFront 错误日志中未定义 OriginCommError。但是“ClientCommError – 由于服务器和查看器之间的通信问题,对查看器的响应被中断。”表明与服务器的连接中断,而不是未建立连接。
- 字段“sc-content-len”定义为“响应的 HTTP Content-Length 标头的值”。值为“1033”。这表明某种回复正在返回到负载均衡器。
所有这些都表明 CloudFront 已将请求发送到 ALB,但某些时候出现超时。我建议您查找 ALB 日志,看看它们是否能说明问题。我想看看它尝试将请求发送到哪个服务器,并仔细检查请求是否到达。