首页 > 解决方案 > 带有 ECS、EFS 和 ELB 的 AWS 上的 WordPress 返回 502

问题描述

我有一个基于 WordPress 4.9.6 的站点,它使用 AWS ECS 部署,EFS 用于存储 WordPress 的文件。作为数据库,我使用与 AWS Aurora MySQL 5.7 兼容的实例。我还设置了一个应用程序负载均衡器来访问容器化的 WordPress 实例。(有关以下设置的更多详细信息。)

问题概述

这种设置似乎在大多数情况下都有效。即我能够GET在网站上提出请求。我可以登录,查看仪表板,并且经常成功更新。我面临的问题是,当我提交更新时,我的更新尝试也经常导致502 Bad Gateway响应,即POST /wp-admin/post.php.

细节

设置

首先,我的数据库实例编写器填充了我的本地开发数据库的转储。指向站点本身的数据库 URL 条目(例如siteurlhome在选项表中)的值带有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 实例之间的后续同步问题有关。进行了以下尝试,但没有看到明显的改进。

最后,我将 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.

那么,有没有人知道接下来要尝试什么以及在哪里寻找问题原因的迹象?

标签: wordpressamazon-web-servicesamazon-efs

解决方案


看起来像这样

https://wordpress.org/support/article/editing-wp-config-php/#increasing-memory-allocated-to-php

帮助解决了我的问题,通常会超时的时间段已经停止。TLDR;在 Dockerfile 构建过程中,我添加了以下几行

# Copy php.ini Over to Container
COPY php.ini /usr/local/etc/php/
COPY phpinfo.php /var/www/html/wp-admin/
COPY .htaccess /var/www/html

php.ini

upload_max_filesize = 500M
post_max_size = 256M
memory_limit = 256M
max_execution_time = 1800
max_input_time = 180
max_input_vars = 5000

.htaccess

php_value upload_max_file 500M
php_value post_max_size 256M
php_value memory_limit 256M
    

phpinfo.php 这可以通过导航到 /wp-admin/phpinfo.php 访问它会为您提供当前 WP 配置的摘要,以查看更改是否已实施,也非常适合故障排除

<?php
phpinfo();
?>

您可以使用 ECR 中内置的新 Container 更新您的任务定义,(不确定您是否已自动执行此操作?)

或者只是通过 Bastion 主机访问 EC2,然后 docker exec -it 并手动编辑文件,看起来你有一个 EFS,它将是静态的。

这帮助了我的超时问题。让我知道你怎样去!


推荐阅读