我有一个基于 WordPress 4.9.6 的站点,它使用 AWS ECS 部署,EFS 用于存储 WordPress 的文件。作为数据库,我使用与 AWS Aurora MySQL 5.7 兼容的实例。我还设置了一个应用程序负载均衡器来访问容器化的 WordPress 实例。(有关以下设置的更多详细信息。)
问题概述
这种设置似乎在大多数情况下都有效。即我能够GET
在网站上提出请求。我可以登录,查看仪表板,并且经常成功更新。我面临的问题是,当我提交更新时,我的更新尝试也经常导致502 Bad Gateway响应,即POST /wp-admin/post.php
.
细节
设置
首先,我的数据库实例编写器填充了我的本地开发数据库的转储。指向站点本身的数据库 URL 条目(例如siteurl
,home
在选项表中)的值带有https
.
EFS 是使用性能模式General Purpose创建的。我最初尝试使用Max I/O模式,但资源建议宁愿使用前一种模式。但是,切换性能模式并没有改变 502 错误的频率。
我的 Amazon Linux ECS 集群实例被预置为使用 AWS 建议的 NFSv4.1 挂载 EFS 卷(mount
选项 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2
)。
我有一个从官方 WordPress图像派生的 Docker 图像,我在其中/usr/src/wordpress
用我的自定义内容更新了原始图像。自定义内容包括wp_config.php
我设置的更新$_SERVER['HTTPS']='on';
将我的 ECS 任务定义拼凑在一起,使用我的自定义 Docker 映像,并将我的 EFS 驱动器上的一个目录作为 Docker 容器中的 Docker 卷挂载。这里的底线是,当我使用任务定义创建 ECS 服务时,容器会启动并写入,/var/www/html
随后我可以在我的 EFS 驱动器中看到它。这一切看起来都很好。
然后,我的容器化 WordPress 实例成功注册到我之前为应用程序负载均衡器设置的目标组中。
然后我可以通过 https 协议访问我的网站。如果我尝试使用 http,我会按计划重定向到 https。我可以打开登录页面。当我登录时,我尝试编辑登录页面。
问题
这是我面临真正问题的地方。通常,但并非总是如此,当我在登录页面上进行更新并单击更新按钮时,我会收到对请求的 502 Bad Gateway 响应POST /wp-admin/post.php
。通常当我开始编辑并被GET /wp-admin/post.php?post=2&action=edit
要求时,我会得到相同的 502。
当我这样做并且没有得到 502 时,我看不到太多模式。我尝试更新文本内容以及将图像添加到登录页面。502 有时会发生,但并非总是在任何一种情况下发生。
我还试图解决这个问题,因为我怀疑它与 EFS 的使用以及我为测试设置的两个 ECS 实例之间的后续同步问题有关。进行了以下尝试,但没有看到明显的改进。
- 按照 EFS 用户指南
sync
的建议添加挂载选项,以避免在 ECS 实例上缓存 - 增加负载均衡器的空闲超时
最后,我将 ECS 服务任务的数量从 2 个减少到 1 个,但问题仍然存在。
作为遇到 502 时浏览器控制台中的错误消息,我经常(可能总是)看到以下内容:The character encoding of the HTML document was not declared. The document will render with garbled text in some browser configurations if the document contains characters from outside the US-ASCII range. The character encoding of the page must be declared in the document or in the transfer protocol.
那么,有没有人知道接下来要尝试什么以及在哪里寻找问题原因的迹象?