首页 > 解决方案 > Wordpress:负载均衡器后面的一个写入器节点和几个读取器节点。无法将登录定向到仅写入器节点

问题描述

我被困在 AWS 和 Wordpress 之间。我已经通过教程作为练习进行了工作,我很确定教程中有一些失败的逻辑。如果你有时间,这里是设置。它应该像这样工作。

您有一个安装了 WP 的 EC2 实例。我们将其称为写入器节点。它位于负载均衡器之外。

数据库位于 RDS 实例上。

然后,您将拥有一个应用程序负载均衡器,该负载均衡器使用它们自己的 WP 安装来加载 EC2 实例,这些 WP 安装也从 RDS 实例中读取。

这就是想法。您将所有帖子都发给作者,这超出了公共用户阅读的视野。公共用户通过 Route 53 被引导到 ALB。

把它放在一起的是 S3 和 crontab。写入器节点将 html 文件夹的内容写入 S3 存储桶,并将上传文件夹的内容写入 Cloudfront 分配读取的另一个存储桶。

ALB 后面的 EC2 WP 实例每分钟检查一次存储桶的更改,以确保它们是最新的。(我应该注意,我从写入节点为 ALB 后面的 Auto Scaling 组 EC2 创建了一个 AMI,并调整了 crontab 以从 S3 读取 - 不写入 S3)。

到目前为止,一切都很好。数据更新并从写入器以正确的方向流动,写入器写入 RDS 数据库并写入 S3,而读取器从 RDS db 和 S3 读取。AWS 运行正常。但是,本教程的问题是 Wordpress- 具体来说,如何登录写入节点 EC2 的 wp-admin 页面?从表面上看,这似乎很容易。

本教程让您为 yoursite.com 创建和 A/Alias 记录,以指向 Application Load Balancer 的 DNS 地址。然后它会告诉您创建另一个名为 write.yoursite.com 的 A 记录,并将其指向您的写入节点/EC2 的公共 IP 地址。这听起来合乎逻辑,但如果您了解 Wordpress,您可能知道问题所在(并希望知道答案!)。

因此,当您访问 yoursite.com/wp-admin 时,它会将您定向到 ALB 后面的 EC2 之一。

如果您访问 write.yoursite.com/wp-admin,它会将您定向到写入节点一秒钟,然后 Wordpress 会将您推送到 ALB 后面的 EC2 之一。

换句话说,您必须在 Wordpress 数据库中选择其中一个,对吗?要么你得到了 writer 节点,一切都很好,但是你基本上不使用负载均衡器和自动伸缩组,或者你得到了负载均衡器和自动伸缩组,但是一旦你上传了一个图像或插件,crontab 设置覆盖它,删除它,因为它是从 S3 到读取器节点的单向读取。他们不打算让 Wordpress 撤销 Route53 试图完成的任务。

那么,他们的教程不正确?是的?

我需要的是 Route 53 实际上能够将 write.yoursite.com 定向到写入节点的 IP,并且所有常规 yoursite.com 读取流量到 ALB 以供 Auto Scaling 组 EC2 处理业务。

有谁知道是否可以在 Wordpress 安装的某个地方设置这样的规则?您可以在 Wordpress 级别上像那样拆分流量吗?是否有可以在 Wordpress 中打开的基于路径的路由功能?我一直在互联网上搜索,发现大量使用高可用性 WP 安装的人做类似事情的帖子,但要么这些帖子已有 10 年历史,要么没有明确的答案。我也一直试图让发布教程的公司的人做出回应,但到目前为止还没有运气。

提前感谢您的任何想法!我真的很想把这件事搁置一旁。

-菲尔

标签: wordpressamazon-web-servicesamazon-route53high-availability

解决方案


好的,我会发布我自己的答案,然后大声笑。

问题是 WordPress 数据库。它始终存储绝对文件路径 URL。所有流量都定向到主 URL,在这种情况下,它实际上指向负载均衡器后面的所有(我所说的)读取节点服务器。

因此,要解决此问题,您必须安装一个 WordPress 插件,该插件将从数据库中删除绝对文件路径,从而使所有内容都具有相对路径。那里有一些插件似乎会去除浏览器端的绝对文件路径,但不会在数据库本身中,所以请注意这一点。我使用了 Yas Global 的一个名为“Make Paths Relative”的插件,它确实改变了数据库 URL。

接下来,我将这段代码添加到 wp-config.php 文件中:

定义('WP_HOME', 'http://'.$_SERVER['HTTP_HOST'].'/');

定义('WP_SITEURL', 'http://'.$_SERVER['HTTP_HOST'].'/')

现在,您可以让 admin.yoursite.com 指向特定服务器,而 yoursite.com 指向另一台服务器或负载均衡器,它们都共享上述相同的 WordPress 安装,而无需求助于 AWS EFS(如果您尝试保存钱)。


推荐阅读