在弹性 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在弹性 beantalk 配置上运行 wget cron 命令

在弹性 beantalk 环境中读取数据库配置详细信息的 API 是啥?

单独的环境配置弹性beantalk

配置弹性beantalk以使用新版本的python

如何使用 https 在弹性 beantalk 中配置单个 ec2 实例

aws弹性beantalk上的nginx扩展