首页 文章

在弹性beanstalk上配置apache

提问于
浏览
17

我正在使用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中并进行部署,但它不起作用 .

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

3 回答

  • 4

    这是一个简单的解决方案

    • ssh进入您的EC2实例

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

    • 编辑wsgi.conf的本地版本,并在<VirtualHost> </ VirtualHost>标记内添加以下重定向规则

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
    
    • “/status” 更改为您用作 health check 页面的任何页面 .

    • 保存文件

    • 编辑您的<app> .conf文件 . ebextensions 目录添加容器命令以通过Amazon版本复制此版本的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

  • 46

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

    此答案假定您已在负载均衡器安全组中启用了https,将SSL证书添加到负载均衡器,将443添加到负载均衡器转发的端口,并使用Route 53将您的域名指向Elastic Beanstalk环境(或等效的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的分段环境之间进行共享配置 . 如果您在所有环境中使用负载 balancer 器和https,则不需要这样做,但拥有它并没有什么坏处 .

    我见过不好的解决方案

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

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

    • SSH into the server and...: 这与Elastic Beanstalk完全相反,并且存在很多问题 . 通过自动缩放创建的任何新实例都具有配置 . 任何数量的合理环境更改都将消除配置 . 这真是个坏主意 .

    • Overwrite the Apache config with a new file: 这已经进入了正确的解决方案领域,但如果Elastic Beanstalk改变了方面,则会给您带来维护噩梦服务器设置(他们很可能会这样做) . 另请参阅下一个项目中的问题 .

    • Dynamically edit the Apache config file to add a few lines: 这是一个不错的主意 . 这样做的问题是,如果Elastic Beanstalk更改了默认Apache配置文件的名称,它将无法工作,并且当您最不期望时,此文件可能会被覆盖:https://forums.aws.amazon.com/thread.jspa?threadID=163369

  • 2

    仅供其他人参考,使用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>
    

相关问题