在 Elastic Beanstalk 上部署 Wordpress 的多个问题

Posted

技术标签:

【中文标题】在 Elastic Beanstalk 上部署 Wordpress 的多个问题【英文标题】:Multiple issues on Wordpress deployment on Elastic Beanstalk 【发布时间】:2018-05-25 09:26:17 【问题描述】:

我从 AWS 部署开始,主要是出于必要,在 Elastic Beanstalk、Elastic Filesystem、Amazon RDS (MariaDB) 和 Route 53 上安装 Wordpress 以及证书。我跟着几个人一起启动并保持一切在一起,到目前为止我做得很好,但现在我面临着几个问题。

    设置 Route 53 和证书后,我想强制使用 HTTPS,所以我做了我以前在 WP 安装中所做的:安装真正简单的 SSL。到目前为止,进展顺利。然后我通过 EB CLI 部署了一些更改,然后我进入了重定向循环地狱,迫使我删除了该插件。我尝试了几次,结果相同。 我发现重新部署 Wordpress 会重置一些应该保存在数据库中的配置。到目前为止,我注意到在部署新版本的应用程序后,永久链接、语言和其他次要设置被重置。也许这会导致我提到的重定向循环。

在寻找解决方案时,我遇到了我已经实现的this answer,但我不知道它是否真的有效。

我能做什么?

更新

我尝试了this answer 提出的解决方案,但无济于事,问题再次出现。进一步搜索让我找到了find someone with exactly the same issue as mine。

由此我认为可能是真正简单的 SSL 是罪魁祸首,并开始寻找不使用插件的替代方案。所以我登陆this AWS Developer Forums thread,有些事情进展顺利,因为我设法将主页和 WP Admin 重定向到 HTTPS。 但网站的其他部分没有。

【问题讨论】:

您是否正在恢复/迁移到与当前在数据库中配置的域不同的域? @RodrigoM 不,这是全新安装。当我将 Route 53 域与 Elastic Beanstalk 相关联时,我在 Wordpress 设置上所做的唯一一件事就是更改站点 url 选项。 【参考方案1】:

我没有从您的评论中得到如果您使用的是负载平衡器 (ELB)。但即便如此,Really-simple-ssl 也应该检测到这一点。

永久链接的问题可归因于您实际上忽略了本地 .htaccess 文件,或者它与服务器上的文件不同。确保在更新时包含它。更新时您的数据库未重置或更改。 请注意,当您使用 EB CLI 进行部署时,它基本上会拍摄本地版本的快照、对其进行压缩并上传到新的应用程序版本,因此它会完全忽略您在服务器上之前版本中的任何内容。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
</IfModule>

尝试在 EBS 中保留所有重要的环境值,请使用look here。我还在这些 ENV 变量中包含了 WP_HOME 和 WP_SITEURL,因此可以轻松调整它们。如果您无法通过 Phpmyadmin 或类似软件更新您的数据库,请在您的 functions.php 中使用以下内容来更新为 HTTPS!

update_option( 'siteurl', 'https://example.com' );
update_option( 'home', 'https://example.com' );

在任何情况下,你都需要这个插件到你的 wp-config.php

if (($_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] ==
'https') OR ($_SERVER['HTTP_X_FORWARDED_PROTO'] ==
'https'))
 $_SERVER['HTTPS']='on';

如果您还没有安装 EBS,我建议您使用此 step-by-step guide 来安装。..

如果您以前尝试过这些方法,请告诉我,我还有其他一些技巧。另请注意,我假设您在任何地方都使用正确的安全组设置!

干杯!

【讨论】:

感谢您的回答 Hendrik,但这只能部分解决问题,就像我已经遇到的那样。你提到了.htaccess 文件,但我的项目没有。我应该生成一个吗?基于什么?我已经在wp-config.php 中定义了WP_HOMEWP_SITEURL。我还需要使用update_option() 吗?到目前为止,您链接的指南与我迄今为止所做的相距不远。 是的没错,这实际上很好,它是一样的。这个问题似乎来自 .htaccess 。使用上面的编辑在本地创建一个。如果您在子文件夹或其他东西上运行它,请确保相应地更新它。确保您的 .gitignore 不会忽略这些文件并使用 eb cli 进行部署。我会尝试上面概述的 update_option,除非您有权访问 PhpmyAdmin 或 Adminer 来更新您的数据库。【参考方案2】:

以下内容多次为我工作。这假定您拥有 AWS Certificate Manager 的 SSL 证书。

1。配置您的证书

在您的.ebextensions 目录中创建一个文件secure-listener.config,其内容如下:

option_settings:
    aws:elb:listener:443:
        SSLCertificateId: replace:with:your:arn
        ListenerProtocol: HTTPS
        InstancePort: '80'

replace:with:your:arn 文本替换为您的证书的 ARN。以上内容告诉 Elastic Beanstalk 将您的 SSL 证书用于端口 443 上的请求,并将这些请求转发到 EC2 实例上的端口 80。

2。设置重定向和环境变量

在您的.ebextensions 目录中创建一个文件ssl-rewrite.config,其内容如下:

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000444"
        owner: root
        group: root
        content: |
            RewriteEngine On
            <If "-n '%HTTP:X-Forwarded-Proto' && %HTTP:X-Forwarded-Proto != 'https'">
                RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L=301]
            </If>
            SetEnvIfNoCase X-FORWARDED-PROTO "^https$" HTTPS=on

&lt;If&gt;&lt;/If&gt; 子句检查 Elastic Beanstalk 设置的 X-Forwarded-Proto 标头是否等于 https。如果没有,请求将被重定向到 https。如果原始请求通过 https,SetEnvIfNoCase 语句将创建一个 HTTPS 环境变量。 WordPress 需要设置此环境变量才能正常运行。

3。更新您的 WordPress 配置

假设您的网站是 www.example.com,请将以下内容添加到您的 wp-config.php 文件中:

define('WP_HOME', 'https://www.example.com');
define('WP_SITEURL', 'https://www.example.com');

此回复基于this tutorial,可能有助于了解更多详情。

【讨论】:

感谢您的回答,@s-cherry,但这并没有让我远离我所在的位置。当我在步骤 1 中尝试您的建议时,ELB 控制台抱怨 secure-listener.config 中的已弃用指令。无论如何,我在 ELB 控制台配置中手动更改了这些设置。关于其余的,这与我尝试过的没有什么不同。在此之后我是否需要安装真正简单的 SSL 插件或者它不是强制性的?提前致谢。 无赖,抱歉没用。您能否分享有关已弃用说明的确切信息?过去我在手动配置路线上遇到了麻烦,所以如果我们可以让它工作,使用配置文件会更好。以上不需要真正简单的 SSL 插件。【参考方案3】:

尝试在 wp-config.php 中设置 RELOCATE

define('RELOCATE',true);

来自Changing the Site URL

注意:当 RELOCATE 标志设置为 true 时,站点 URL 将为 自动更新到您用来访问 登录屏幕。这将使管理部分启动并在 新 URL,但它不会更正设置的任何其他部分。那些 您仍然需要手动更改。

还要检查下表的一致性:

select * from options where option_name = 'siteurl';
select * from options where option_name = 'home';
select domain from site;
select * from sitemeta;
select * from blogs;
select * from  sitemeta where meta_key = 'siteurl';

【讨论】:

您好,我尝试了您的建议,但无济于事。请查看我对 OP 情况的更新。

以上是关于在 Elastic Beanstalk 上部署 Wordpress 的多个问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Elastic Beanstalk 上部署 Wordpress 的多个问题

Elastic Beanstalk 上的 Docker + Django

在 Elastic Beanstalk 上部署 Pyramid 应用程序

在 Elastic Beanstalk 上部署 WordPress?

Elastic Beanstalk 未部署在所有实例上

在 Elastic Beanstalk 上部署 NestJS 应用程序