在弹性beanstalk上配置apache

Dan*_*ofe 21 apache .htaccess amazon-web-services amazon-elastic-beanstalk

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

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

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

我没有apache配置的经验,谷歌搜索它让我觉得我应该把RewriteRules放在.htaccess文件中.

示例: 如何在亚马逊弹性beanstalk上强制使用https而不会失败运行状况检查

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

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

Zag*_*ags 51

www.example.com去到example.com可以用CNAME在DNS做,如果你不关心有它实际上是一个重定向.如果需要重定向,可以将其添加到下面的Apache配置中.这个答案的主要内容是详细说明如何在Elastic Beanstalk上修改Apache配置(因为正确地执行此操作并不是非常简单).

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

您需要做的就是将以下内容添加到项目目录中的一个.conf文件中.ebextensions:

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>
Run Code Online (Sandbox Code Playgroud)

说明

这在Elastic Beanstalk之外是适度的直接向前.通常会添加一个Apache重写规则,如下所示:

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Run Code Online (Sandbox Code Playgroud)

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

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Run Code Online (Sandbox Code Playgroud)

但是,这些配置仅在<VirtualHost>块内工作.更改RewriteCond<If>块允许它在块外部正常工作<VirtualHost>,允许我们放入独立的Apache配置文件.请注意,CentOS上的标准Apache设置(包括ElasticBeanstalk上的设置)包含所有/etc/httpd/conf.d/*.conf匹配的文件,这与我们存储此文件的文件路径相匹配.

-n '%{HTTP:X-Forwarded-Proto}'如果您不在负载均衡器之后,条件的一部分可以防止它重定向,允许您在生产环境与负载均衡器和https之间进行共享配置,以及作为单实例且没有https的分段环境.如果您在所有环境中使用负载平衡器和https,则不需要这样做,但拥有它并没有什么坏处.

我见过不好的解决方案

我已经看到了很多关于这个问题的糟糕解决方案,值得深入了解为什么这个解决方案是必要的.

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

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

  3. 使用新文件覆盖Apache配置:如果Elastic Beanstalk更改了服务器设置的各个方面(他们很可能会这样做),这将进入正确的解决方案领域,但会让您遇到维护噩梦.另请参阅下一个项目中的问题.

  4. 动态编辑Apache配置文件以添加几行:这是一个不错的主意.这样做的问题是,如果Elastic Beanstalk更改了默认Apache配置文件的名称,它将无法工作,并且当您最不期望时,此文件可能会被覆盖:https://forums.aws.amazon.com/thread .jspa?线程ID = 163369

  • 这是一个很好的答案,感谢您节省了我们很多时间(并帮助我们避免未来的维护噩梦).如果AWS员工正在阅读此内容,则应添加类似于您的文档的内容. (4认同)

gus*_*ard 5

这是一个简单的解决方案

  1. ssh进入您的EC2实例
  2. 将/etc/httpd/conf.d/wsgi.conf的内容复制到名为wsgi.conf的本地文件中,该文件将放置在应用程序的基本文件夹中
  3. 编辑wsgi.conf的本地版本,并在<VirtualHost> </ VirtualHost>标记内添加以下重定向规则

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
    
    Run Code Online (Sandbox Code Playgroud)
  4. “ / status”更改为您用作运行状况检查页面的任何页面。

  5. 保存文件
  6. 在中编辑<app> .conf文件。ebextensions  目录添加一个容器命令,以将该版本的wsgi.conf复制到Amazon的版本上

    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'
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  7. 部署代码。

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

它应该可以正常工作,并且将为每个部署正确更新文件。唯一需要注意的是,如果亚马逊将来更改其基本wsgi.conf文件的内容,则您的副本可能不再起作用。

资料来源:rickchristianson

  • 最后一句话很重要=&gt;“维修噩梦” (10认同)
  • 确保您要提交对&lt;app&gt; .config文件的更改,否则将不会运行container_commands。 (3认同)
  • 对于www.domain.com到domain.com,您可以在Amazon Route 53中进行设置,在主机区域上有一条记录,该记录将www.domain.com映射到您的Elastic Load Balancer,就像您可能已经对域所做的那样。 com。 (3认同)

Imr*_*oor 5

这在 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
Run Code Online (Sandbox Code Playgroud)

要完全覆盖 Elastic Beanstalk 默认 Apache 配置,请在源包中的.ebextensions/httpd/conf/httpd.conf.

~/workspace/my-app/
|-- .ebextensions
|   `-- httpd
|       `-- conf
|           `-- httpd.conf
`-- index.jsp
Run Code Online (Sandbox Code Playgroud)

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

IncludeOptional conf.d/*.conf
IncludeOptional conf.d/elasticbeanstalk/*.conf
Run Code Online (Sandbox Code Playgroud)

笔记

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

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

可以在此链接下查看更多详细信息Extending and overriding the default Apache configuration。最好使用正确的方法而不是补丁或解决方法。

  • 最后的 Linux 平台使用 `.platform` 目录而不是 `.ebexensions` 目录来覆盖 httpd 配置:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html (2认同)