在弹性 beantalk 上配置 apache

Posted

技术标签:

【中文标题】在弹性 beantalk 上配置 apache【英文标题】:Configure apache on elastic beanstalk 【发布时间】:2014-03-19 15:18:50 【问题描述】:

我正在使用 django 在弹性 beanstalk 上进行开发,我想对 apache 配置进行两处更改:

1。 将 www.domain.com 重定向到 domain.com

2。 将http://domain.com 重定向到https://domain.com

我没有 apache 配置的经验,谷歌搜索它让我想到我应该将 RewriteRules 放在 .htaccess 文件中。

示例: How to force https on amazon elastic beanstalk without failing the health check

我找不到有关如何使用弹性 beanstalk 配置 (.ebextensions) 的说明,我尝试简单地将 .htaccess 文件放在我的根文件中并进行部署,但它不起作用。

有谁知道如何在弹性豆茎中添加 RewriteRules?

【问题讨论】:

【参考方案1】:

如果您不关心它实际上是重定向,则可以使用 DNS 中的 CNAME 将 www.example.com 转到 example.com。如果您需要重定向,可以将其添加到下面的 Apache 配置中。这个答案的要点是详细说明您如何在 Elastic Beanstalk 上修改 Apache 配置(因为正确执行此操作并不是很直接)。

此答案假设您已经在负载均衡器安全组中启用了 https,将 SSL 证书添加到负载均衡器,将 443 添加到负载均衡器转发的端口,并使用 Route 将您的域名指向 Elastic Beanstalk 环境53(或等效的 DNS 服务)。

亚马逊 Linux 2

大多数基于 AWS Linux 版本 2 的平台都可以选择 Apache 作为您的代理主机。这可以通过转到“配置”>“软件”> “容器选项”并将“代理服务器”设置为“Apache”。

完成后,将名为 .platform/httpd/conf.d/ssl_rewrite.conf 的配置文件添加到您的代码库 (relevant AWS docs) 中,内容如下:

RewriteEngine On
<If "-n '%HTTP:X-Forwarded-Proto' && %HTTP:X-Forwarded-Proto != 'https'">
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]
</If>

亚马逊 Linux 1

您只需将以下内容添加到您的.config files in the .ebextensions directory of your project 之一:

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        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]
            </If>

说明

这在 Elastic Beanstalk 之外是相当直接的。通常会添加一个 Apache 重写规则,如下所示:

RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI

或者,如果在负载均衡器后面,就像我们在这种情况下一样:

RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]

但是,这些配置仅适用于 &lt;VirtualHost&gt; 块。将RewriteCond 更改为&lt;If&gt; 块允许它在&lt;VirtualHost&gt; 块之外正常工作,允许我们放入独立的Apache 配置文件。请注意,CentOS 上的标准 Apache 设置(包括 ElasticBeanstalk 上的设置)包含与 /etc/httpd/conf.d/*.conf 匹配的所有文件,这与我们存储此文件的文件路径匹配。

条件的-n '%HTTP:X-Forwarded-Proto' 部分会阻止它在您不在负载均衡器之后进行重定向,从而允许您在具有负载均衡器和 https 的生产环境以及单实例和暂存环境之间共享配置没有https。如果您在所有环境中都使用负载平衡器和 https,则这不是必需的,但拥有它并没有什么坏处。

我见过的糟糕解决方案

我已经看到了很多关于这个问题的糟糕解决方案,值得通过它们来理解为什么这个解决方案是必要的。

    使用 Cloudfront: 有人建议在 Elastic Beanstalk 前面使用非缓存 Cloudfront 设置来执行 HTTP 到 HTTPS 的重定向。这增加了一个不完全合适的全新服务(从而增加了复杂性)(Cloudfront 是一个 CDN;它不是在固有动态内容上强制使用 HTTPS 的正确工具)。 Apache config 是这个问题的常规解决方案,而 Elastic Beanstalk 使用 Apache,所以我们应该这样做。

    SSH 进入服务器并...: 这与 Elastic Beanstalk 的观点完全相反,并且存在很多问题。通过自动缩放创建的任何新实例都不会具有修改后的配置。任何克隆的环境都没有配置。任何数量的合理环境更改都将清除配置。这真是个坏主意。

    用新文件覆盖 Apache 配置: 这进入了正确的解决方案领域,但如果 Elastic Beanstalk 更改服务器设置的各个方面(他们很可能做)。另请参阅下一项中的问题。

    动态编辑 Apache 配置文件以添加几行: 这是一个不错的想法。这样做的问题是,如果 Elastic Beanstalk 更改其默认 Apache 配置文件的名称,它将无法正常工作,并且此文件可能会在您最意想不到的时候被覆盖:https://forums.aws.amazon.com/thread.jspa?threadID=163369

【讨论】:

您的解决方案在我的一个环境中运行良好,但在另一个环境中却不行。两者应该是相同的。 /etc/httpd/conf.d/ssl_rewrite.conf 文件之一在那里并且它正确重定向。另一方面,文件丢失。 eb_extension 配置文件还向 php.ini 添加了一个变量,该变量在两种环境中都显示,因此只有 ssl_rewrite.conf 因某些奇怪的原因而丢失。有任何想法吗?谢谢。 @NitzanWilnai 如果您的某个环境中缺少 ssl_rewrite.conf 文件,那么您很可能需要重新部署到该环境。确保您正在部署的分支中包含新配置。如果这不起作用,请将其作为自己的问题发布在 *** 上。 这是一个很好的答案,感谢您为我们节省了大量时间(并帮助我们避免了未来的维护噩梦)。如果 AWS 员工正在阅读本文,您应该添加与您的文档类似的内容。 完全同意KayakinKoder。 AWS 支持刚刚将我指向 github 上 awslabs 上的 this 解决方案,这与接受的答案类似。但是,据我所知,Zags 的答案更可取。 @Zags,也许您可​​以尝试将此解决方案拉入 awslabs 存储库? 感谢@Zags 的帖子。我发现它适用于重定向域。但是,它似乎没有重定向任何子目录?我猜这就是 REQUEST_URI 部分应该涵盖的内容。有什么想法吗?【参考方案2】:

这在 AWS 文档中得到了很好的解释,如下所示:

要扩展 Elastic Beanstalk 默认 Apache 配置,请将 .conf 配置文件添加到应用程序源包中名为 .ebextensions/httpd/conf.d 的文件夹中。 Elastic Beanstalk Apache 配置自动在此文件夹中包含 .conf 文件。

~/workspace/my-app/
|-- .ebextensions
|   -- httpd
|      -- conf.d
|         -- myconf.conf
|         -- ssl.conf
-- index.jsp

要完全覆盖 Elastic Beanstalk 默认 Apache 配置,请在源包中包含一个配置,地址为 .ebextensions/httpd/conf/httpd.conf

~/workspace/my-app/
|-- .ebextensions
|   `-- httpd
|       `-- conf
|           `-- httpd.conf
`-- index.jsp

如果您覆盖 Elastic Beanstalk Apache 配置,请将以下几行添加到您的 httpd.conf 以提取 Elastic Beanstalk 配置以用于增强型运行状况报告和监控、响应压缩和静态文件。

IncludeOptional conf.d/*.conf
IncludeOptional conf.d/elasticbeanstalk/*.conf

注意

要覆盖端口80 上的默认侦听器,请包含一个名为 00_application.conf.ebextensions/httpd/conf.d/elasticbeanstalk/ 覆盖 Elastic Beanstalk 配置。

对于一个工作示例,请查看您环境中实例上位于 /etc/httpd/conf/httpd.conf 的 Elastic Beanstalk 默认配置文件。在部署期间,源包中 .ebextensions/httpd 文件夹中的所有文件都会复制到 /etc/httpd

可以在linkExtending and overriding the default Apache configuration 下查看更多详细信息。最好使用正确的方法而不是补丁或变通方法。

【讨论】:

请注意,此配置仅适用于较新的 Amazon Linux 2 平台 最后一个linux平台使用.platform目录而不是.ebexensions来覆盖httpd配置:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…【参考方案3】:

仅供参考,使用Zags' solution将非www重定向到www,将此添加到您的.ebextensions/your_file.config

files:
    "/etc/httpd/conf.d/www_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: | 
            RewriteEngine On
            <If "'%HTTP_HOST' !~ /^www\./">
            RewriteRule ^(.*)$ http://www.%HTTP_HOST%REQUEST_URI [R=301,L]
            </If>

【讨论】:

【参考方案4】:

这是一个简单的解决方案

    SSH 到您的 EC2 实例 将 /etc/httpd/conf.d/wsgi.conf 的内容复制到名为 wsgi.conf 的本地文件中,该文件将放置在应用程序的基本文件夹中

    编辑 wsgi.conf 的本地版本并在 标签中添加以下重定向规则

    RewriteEngine On
    RewriteCond %HTTP:X-Forwarded-Proto !https
    RewriteRule !/status https://%SERVER_NAME%REQUEST_URI [L,R=301]
    

    “/status”更改为您用作健康检查页面的任何页面。

    保存文件

    在您的 .ebextensions 目录中编辑您的 .conf 文件,以添加一个容器命令,将这个版本的 wsgi.conf 复制到亚马逊的版本

    container_commands:
    01_syncdb:
      command: "django-admin.py syncdb --noinput" leader_only: true
    02_collectstatic:
      command: "django-admin.py collectstatic --noinput"
    03_wsgireplace:
      command: 'cp wsgi.conf /etc/httpd/conf.d/wsgi.conf'
    ...
    

    部署代码。

    /etc/httpd/conf.d/wsgi.conf 中部署的 wsgi.conf 版本现在将包含必要的重定向规则。

它应该可以工作,并且每次部署都会正确更新文件。唯一需要注意的是,如果 Amazon 将来更改其基本 wsgi.conf 文件内容,那么您的副本可能不再有效。

来源:rickchristianson

【讨论】:

最后一句话很重要=>“维护噩梦” 正是 =( ,你有一个优雅的解决方案 =D 吗?? 自从写下那条评论后,我就能够让它适应我的情况。我试图将http重定向到https。这可以通过 django-secure 解决,然后设置 SECURE_PROXY_SSL_HEADER、SECURE_SSL_REDIRECT 和 SECURE_HSTS_SECONDS。这并不能解决 OP 对 www.domain.com -> domain.com 的重定向。 确保您承诺将您的更改 git 到您的 .config 文件中,否则 container_commands 将不会运行。 对于 www.domain.com 到 domain.com,您可以在 Amazon Route 53 中使用主机区域上的记录进行设置,该主机区域将 www.domain.com 映射到您的弹性负载均衡器,例如您可能已经为 domain.com 做过。

以上是关于在弹性 beantalk 上配置 apache的主要内容,如果未能解决你的问题,请参考以下文章