在弹性 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]
但是,这些配置仅适用于 <VirtualHost>
块。将RewriteCond
更改为<If>
块允许它在<VirtualHost>
块之外正常工作,允许我们放入独立的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 是啥?