在弹性beanstalk上配置apache

时间:2014-02-19 10:40:41

标签: apache .htaccess amazon-web-services elastic-beanstalk

我正在使用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文件放在我的root filder中并进行部署,但它没有用。

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

4 个答案:

答案 0 :(得分:46)

如果您不关心实际是重定向,那么www.example.com转到example.com可以通过DNS中的CNAME完成。如果需要重定向,可以将其添加到下面的Apache配置中。这个答案的主要内容是详细说明如何在Elastic Beanstalk上修改Apache配置(因为这样做不是很直接)。

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

您需要做的就是将以下内容添加到.conf 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]

但是,这些配置仅适用于<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?threadID=163369

答案 1 :(得分:4)

这是一个简单的解决方案

  1. ssh进入您的EC2实例
  2. 将/etc/httpd/conf.d/wsgi.conf的内容复制到名为wsgi.conf的本地文件中,该文件将放在应用程序的基本文件夹中
  3. 编辑wsgi.conf的本地版本,并在&lt;中添加以下重定向规则。虚拟主机&GT; &LT; /虚拟主机&GT;标签

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

  5. 保存文件
  6. 编辑你的&lt;你的。 ebextensions 目录中的app&gt; .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'
    ...
    
  7. 部署代码。

  8. /etc/httpd/conf.d/wsgi.conf中部署的wsgi.conf版本现在将包含必要的重定向规则。
  9. 它应该可以正常工作,并且每个部署都会正确更新文件。唯一需要注意的是,如果Amazon将来更改其基本wsgi.conf文件内容,那么您的副本可能不再有效。

    来源:rickchristianson

答案 2 :(得分:2)

仅供其他人参考,使用Zags' solution将非www重定向到www,将其添加到您的$ cat file1 |1| $ cat file2 |2| |3| $ cat file3 |4| |5| |6| $ paste -d ',' file[123] | sed -e 's/|//g' -e 's/^/|/g' -e 's/$/|/g' |1,2,4| |,3,5| |,,6|

.ebextensions/your_file.config

答案 3 :(得分: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

可以在Extending and overriding the default Apache configuration下的link上看到更多详细信息。最好使用正确的方法代替补丁或解决方法。