如何在弹性beantalk上强制使用https?


79

我似乎无法在弹性beantalk的免费使用层上强制使用https。

我在如何通过Amazon Elastic beantalk上强制https而不失败健康检查中尝试了以下建议

使用此Apache重写规则

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/status$ 
RewriteCond %{REQUEST_URI} !^/version$ 
RewriteCond %{REQUEST_URI} !^/_hostmanager/ 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

当我尝试这样做时,http请求不会像我希望的那样被重定向到https。而是,http页面正常加载。我也尝试过使用具有相同结果的X-Forwarded-Port标头。

我也尝试了以下重写规则

RewriteCond %{SERVER_PORT} 80
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

并且此规则导致重定向循环。因此,似乎apache重写规则没有选择Elastic Load Balancer标头X-Forwarded-Port和X-Forwarded-Proto,但是重定向循环也不是我想要的。

请帮忙。我是AWS,Elastic Beanstalk的新手,并且对Apache规则不太熟悉。我不太确定从这里去哪里。谢谢。


休眠之后,似乎重写规则现在可以检测到X-Forwarded-Proto标头。不能完全确定为什么,但是现在可以使用。
landland

1
互联网似乎无法就此问题达成单一,完整且有效的解决方案。希望您能在我的帖子中得到一些帮助。最后,我不得不跳了圈才想到这个。
ADTC '11

谁能知道我如何更改它以将www重定向到非www RewriteEngine On <If“ -n'%{HTTP:X-Forwarded-Proto}'&&%{HTTP:X-Forwarded-Proto}!='https' “> RewriteRule(。*)https://%{HTTP_HOST}%{REQUEST_URI} [R,L] </ If>
Mahendra Garg

Answers:


177

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

注意:此答案适用于使用Apache的Elastic Beanstalk环境。它可能不适用于基于docker的部署。

您需要做的就是将以下内容添加到项目目录中的一个.config文件中.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>

说明

这在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 config是解决此问题的常规解决方案,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


3
很好的答案,这很完美。我的项目中还没有.ebextensions目录,所以我制作了一个目录,并将您的配置放在任意命名的.conf文件中。我能够在弹性beantalk控制台的设置中禁用常规端口,这似乎很理想。
泰勒(Tyler)2016年

4
这是一个了不起的答案,确实需要在页面顶部。@landland,您应该接受此答案。
gtd

1
出色而干净的答案,为我无缝地工作。我添加R=301了以便发送永久重定向。
LoicAG'9

1
我感到遗憾的是,我只能提出一个支持。巨大的问题是,AWS论坛对此有不正确的答案!
Cfreak '16

2
由于某种原因,这似乎对我不起作用。该ssl_rewrite.conf文件被创建(与验证eb ssh),但没有发生重定向。:S
mb21

16

编辑:虽然我喜欢这个答案,但现在已经很老了AWS提供了新服务(例如Certificate Manager),这些服务使该答案的一部分过时了。此外,将.ebextensions文件夹与Apache一起使用是一种更干净的方式来处理此重定向,如上所述。

如果您在S3上托管网站,则此答案的部分内容可能仍对您有用。


这为我工作:

  1. 使用awsconsole命令将证书上传到AWS 。命令结构为:

    aws iam upload-server-certificate --server-certificate-name CERTIFICATE_NAME --certificate-body "file://PATH_TO_CERTIFICATE.crt" --private-key "file://YOUR_PRIVATE_KEY.pem" --certificate-chain "file://YOUR_CERTIFICATE_CHAIN.ca-bundle" --path /cloudfront/
    
  2. 在您的Elastic Beanstalk应用程序中,转到“配置” ->“网络层” ->“负载平衡”,然后单击齿轮图标

  3. 选择“安全侦听器端口”443。选择协议作为HTTPS。选择CERTIFICATE_NAME步骤2SSL证书ID。保存配置。

  4. 转到控制台。单击EC2实例。单击负载均衡器。单击通过负载均衡器。单击实例,然后向下滚动以查看分配给该负载均衡器的EC2实例。如果EC2实例的名称与您的应用程序URL相同(或近似),请记下负载均衡器的DNS名称。格式应为awseb-e-...

  5. 返回您的控制台。单击CloudFront。单击创建分发。选择一个Web发行版。

  6. 设置发行版。将您的原始域名设置为在步骤5中找到的负载均衡器DNS名称。将查看器协议策略设置为将HTTP重定向到HTTPS。将正向查询字符串设置为Yes。将备用域名(CNAME)设置为要用于您的应用程序的URL。将SSL证书设置为CERTIFICATE_NAME您在步骤2中上传的。创建您的发行版。

  7. 在CloudFront中单击您的分配名称。单击起源,选择您的起源,然后单击编辑。确保您的原始协议策略是“匹配查看器”。回去。点击行为,选择您的来源,然后点击编辑。将Forward Headers更改为Whitelist并添加Host。救。

注意: 我也写了更长的指南


确实做到了这一点,但是它给了我一个“请求无法满足”。仅当我将主机标头列入白名单时,“ CloudFront无法连接到源。” 如果我将转发标头设置为none,则它可以工作,但不会重定向到https,所有http请求都保留为http。有什么想法吗?
弗拉德(Vlad)

@Adam您可以在这里粘贴整个elasticbeanstalk.conf文件吗?还是给我一个链接?
thekosmix 2016年

@thekosmixelasticbeanstalk.conf除非您覆盖上面指南中的设置,否则该文件实际上不应在这里发挥作用。
亚当·林克

但是负载均衡器中的ec2实例(它们的DNS)是短暂的,不是吗?我不确定您是否有太多投票赞成完全有缺陷的解决方案。
themihai

@themihai这实际上是不正确的-解决方案未使用EC2 DNS或IP(短暂的)。您获取的DNS URL对环境是静态的。EC2步骤是获取要在步骤6中使用的DNS URL,在该步骤中,您将环境链接到CloudFront发行版。上面的解决方案可能已经无法使用了,因为它已经使用了一年,但是当我发布它时确实可以使用。
亚当·林克

6

最受支持的版本对我不起作用。<If>指令仅适用于Apache 2.4+,但ElasticBeanstalk的版本为2.2.x。

因此,遵循与上述相同的建议。创建一个名为.ebextensions / https_rewrite.config的文件,其内容如下

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            LoadModule rewrite_module modules/mod_rewrite.so
            RewriteEngine On
            # This will enable the Rewrite capabilities
            RewriteCond %{HTTPS} !=on
            # This checks to make sure the connection is not already HTTPS
            RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

这似乎对我有用。

有关如何将此文件构建到您的WAR文件中,请参见以下答案


1
关于此答案的其他说明:<if>块是2.4中的新增功能,在2.2中不起作用,因此您在这里看不到它。
fourdogit

EB PHP解决方案堆栈现在都使用Apache 2.4+
2.4+

5

使用新的应用程序负载平衡器,您现在可以轻松完成此任务...

确保在设置EB环境时设置了其中之一(我相信仍然默认为经典负载均衡器)。创建环境后就无法更改类型,因此请重新创建它

完成此操作后,转到EC2设置->负载均衡器。单击您为EB环境创建的负载均衡器。您必须确保在执行此任务之前已设置HTTPS侦听器,因此请确保使用SSL证书在HTTPS 443上侦听,并使用80上的HTTP将流量转发到实例。

然后添加一个新的侦听器,该侦听器将侦听HTTP,并添加默认操作“重定向到:”。确保将HTTPS设置为协议,将443设置为端口,“原始主机,路径,查询”作为选项,最后设置301作为HTTP响应代码。

添加此侦听器后,请确保您更新了EC2负载平衡器安全组以接受HTTPS和HTTP连接,您将在侦听器上看到小的警告标志,以提醒您!

克里斯


谢谢,我让它可以为我的www工作。路线,但不是裸域。有什么建议为什么呢?
克里斯

4

编辑:Zags解决方案更为通用和正确。我推荐它而不是我的(特定于python env)

这是我想到的一种干净快捷的解决方案,可以避免入侵wsgi.conf或使用CloudFront

在您的.ebextensions / some_file.config中:

# Redirect HTTP to HTTPS
  "/etc/httpd/conf.d/https_redirect.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      <Directory /opt/python/current/app/>
      RewriteEngine on
      RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
      RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
      </Directory>

我觉得这太简单了,但似乎工作正常。

还要注意,我明确地重定向了HTTP,而不是“ not HTTPS”。


因此,我在一个EBS环境中进行了这项工作。/etc/httpd/conf.d/https_redirect.conf存在,并且重定向到https。问题出在第二种环境中,安装方式完全相同,文件/etc/httpd/conf.d/https_redirect.conf不存在。有任何想法吗?
Nitzan Wilnai '16

@NitzanWilnai/etc/httpd/conf.d/https_redirect.conf不必存在,请参见答案
Anatoly Vasilyev

1
将文件添加到/etc/httpd/conf.d是一个好主意。这帮助我得到的一般解(stackoverflow.com/a/38751749/2800876
牛头犬

4

我正在尝试在2018年使用loadbalancer重定向弹性beantalk。以上答案均不适用于我的环境。我遇到的几个问题:

  1. 我正在尝试投票最多的答案,但是我的tomcat是2.7版。它不支持。

  2. 我正在使用container_commands并复制00_applications设置。AWS只是忽略它。

所以最终我通过阅读以下内容使其工作:https : //docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-proxy.html

这是我的工作:

我重新创建了文件夹结构:

.ebextensions 
 - httpd
  -conf.d
   -ssl.conf

这就是ssl.conf的内容

<VirtualHost *:80>
  RewriteEngine on
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  <Proxy *>
    Order Allow,Deny
    Allow from all
  </Proxy>
  ProxyPass / http://localhost:8080/ retry=0
  ProxyPassReverse / http://localhost:8080/
  ProxyPreserveHost on

  ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>

希望这会有所帮助。


它重定向到https,但表示未找到服务器。我正在使用Spring MVC Web应用程序
ponraj,

添加后,我nginx: [emerg] unknown directive "<VirtualHost" 在EB日志中得到一个。还有其他人看到这种行为吗?
Fabian


3

上面的答案对我都不起作用,但是有些帮助我找出了对我有用的答案。此外,我还找到了以下网址,该网址对http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat有所帮助 -platform.html

我创建了上述网址中提到的文件结构,以更改2个文件httpd.conf 00_application.conf

从您的实例中复制整个httpd.conf并将其放在上面链接中提到的文件夹结构下.ebextention下的代码中。然后只需将以下行添加到项目中的该文件

LoadModule rewrite_module modules/mod_rewrite.so

对00_application.conf进行同样的操作,从您的实例中复制它,并将其放置在您的代码库中httpd / conf.d / elasticbeanstalk / 00_application.conf下.ebextention下。现在,编辑此文件并在VirtualHost之间添加以下内容

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

现在部署您的代码。


2

在弹性beantalk上,您可以仅添加on配置,以便AWS覆盖它们,这将允许您覆盖Web服务器配置并提交自己的配置。

只需在路径下添加以下文件:.ebextensions \ httpd \ conf.d

档案内容:

<VirtualHost *:80>
   LoadModule rewrite_module modules/mod_rewrite.so

   RewriteEngine On
   RewriteCond %{HTTP:X-Forwarded-Proto} !https
   RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker
   RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

   <Proxy *>
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass / http://localhost:8080/ retry=0
   ProxyPassReverse / http://localhost:8080/
   ProxyPreserveHost on

   ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>

“ .ebextensions”是AWS中的标准配置文件夹,其余仅指向您要覆盖的文件和文件夹。如果文件或文件夹不存在,请简单地创建它们。


2

我很难解决这个问题,因此在提出解决方案后,我写了详细的解决方案说明,希望对其他人有所帮助。这特定于Tomcat 8,Apache2和Spring Boot应用程序。AWS实验室github中确实有一些有用的ebextension示例

对我有用的摘要:

  1. 在/src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf中创建文件
  2. 添加重写条件/规则时要小心,以包含“ LoadModule rewrite_module modules / mod_rewrite.so”
  3. 部署到AWS EBS

这是一个Spring Boot应用程序示例


1

我对弹性beantalk(运行Tomcat 8 Java 8的64位Amazon Linux 2016.09 v2.3.1)进行了以下配置。我创建了目录.ebextensions并添加了带有重写条件的.config YAML文件

上述Zagas解决方案(非常复杂)对我不起作用。

  1. 因为“ If”条件未知
  2. 由于Apache 2.2,我的httpd.conf文件中没有mod_rewrite.so

这个解决方案对我来说更有意义,但这也不起作用。什么都没发生,并且我在“ conf.d”目录下看不到文件“ ssl_rewrite.conf”。

第三种尝试的解决方案是在“ .ebextendsion”目录下添加“ run.config”和“ ssl_rewrite.conf”文件。

run_config包含

container_commands:
copy-config:
command: "cp .ebextensions/ssl_rewrite.conf /etc/httpd/conf.d"

ssl_rewrite.conf包含

LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

ssl_rewrite.conf是在“ conf.d”目录下创建的,但是从http重定向到https无效。

对我而言,唯一可行的解​​决方案是在“ /etc/httpd/conf.d/elasticbeanstalk/00_application.conf”中添加以下行

<VirtualHost *:80>
......
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
......
</VirtualHost>

但这是一个临时解决方案,如果更换了计算机,我的https重定向也消失了。


“如果更换了一台机器,我的https重定向就不存在了”,我认为当ELB在新实例中部署该应用程序时,您可以使用Zags回答中所示的相同技巧自动写入文件。基本上,在下提供文件路径,在下提供files:文件内容,content: |并设置适当的模式,所有者和组。然后,ELB将自动为您创建文件。
ADTC '11 / 11/11

我已经使用上述方法(在我的评论中)将该文件部署为应用程序的一部分(而不是直接将其写入当前实例)。我通过SSH检查文件是否存在。但是,尽管我的设置与您的设置非常接近,但它也对我不起作用:运行Tomcat 8 Java 8的64位Amazon Linux 2016.03 v2.1.1但是,该文件最初根本不存在-它是新创建的。我应该/etc/httpd/conf.d/elasticbeanstalk.conf改为编辑吗?
ADTC '11 / 11/11

1

以防万一有人还在挣扎:

经过一段时间的努力,终于,我找到了一个包含所有AWS配置的GitHub(来自AWS团队),并且以下示例适用于Apache 2.2的HTTP> HTTPS重定向。(有关Apache 2.4和Nginx的配置,请参见下面的链接)。

阿帕奇2.2

  1. 在应用程序的根目录中创建一个文件: YOUR_PROJECT_ROOT / .ebextensions / httpd / conf.d / elasticbeanstalk.conf (如果使用IntelliJ / Java,请确保将其添加到最终的.WAR工件中)

  2. 添加以下行以在虚拟主机中启用重定向:

    <VirtualHost *:80>
        LoadModule rewrite_module modules/mod_rewrite.so
        RewriteEngine On
        RewriteCond %{HTTP:X-Forwarded-Proto} !https
        RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    
        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>
    
        ProxyPass / http://localhost:8080/ retry=0
        ProxyPassReverse / http://localhost:8080/
        ProxyPreserveHost on
    
        ErrorLog /var/log/httpd/elasticbeanstalk-error_log
    </VirtualHost>
    

有关Apache 2.4和Nginx的更多示例,请访问以下GitHub存储库:

https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect/java-tomcat

另外,还有许多有用的配置和示例可用。

问候


1

通过环境变量启用HTTPS

我只需要对我们的生产环境实施HTTPS,而对于在Elastic Beanstalk上但不使用负载平衡器(因此无法直接分配证书)的开发和暂存环境,则不需要实施HTTPS。

我使用环境变量USE_HTTPSssl_rewrite.conf当且仅当USE_HTTPS设置为时,我们才复制文件true

.ebextensions / files / ssl_rewrite.conf

RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</If>

.ebextensions / https.config

files:
  "/home/ec2-user/https_setup.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash

      echo "USE_HTTPS env var: ${USE_HTTPS,,}"
      outfile=/etc/httpd/conf.d/ssl_rewrite.conf
      if [ "${USE_HTTPS,,}" == "true" ]; then
        echo "Configure SSL rewrite"
        cp .ebextensions/files/ssl_rewrite.conf $outfile
        chmod 644 $outfile
        chown root:root $outfile
      else
        [ -f $outfile ] && rm $outfile
        echo "Do not use SSL"
        exit 0
      fi

container_commands:
  01_https_setup:
    command: "/home/ec2-user/https_setup.sh"

请注意,如果您进行了更改USE_HTTPS,则需要重新部署应用程序以使更改生效。您还可以根据需要删除文件中的echo命令https.config


0

为什么不简单地将.htaccess文件放在根文件夹中?这样,您可以简单地对其进行测试和调试。并且,如果将其包含在.zip中,它将再次自动部署在所有实例上。

只需使用.htaccess

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

0

请注意,投票最多的答案现在有点老了。保罗的答案实际上是正确的答案。他的答案中提供的链接是由AWS提供的(因此,当在Elastic Beanstalk上运行应用程序时,建议您重写Apache配置以使从HTTP重定向到HTTPS的推荐方法)。

有一件非常重要的事情要注意。如果要部署多个Web应用程序,则无法在其中一个Web应用程序中添加.ebextensions文件夹。您会注意到正在写入或创建您指定的任何配置。如果要在Elastic Beanstalk环境上部署多个Web Apps,则需要阅读AWS Java Tomcat的这篇文章。 在Elastic Beanstalk上部署多个WAR文件

通常,在向其发出eb命令以部署WAR文件之前,您将需要具有以下结构:

MyApplication.zip
├── .ebextensions
├── foo.war
├── bar.war
└── ROOT.war

如果每个WAR文件中都存在.ebextentions文件夹,则您会注意到该文件夹​​将被完全忽略,并且将不执行任何配置更改。

希望这对其他人有帮助。


0

我们已经通过处理在后端解决了它 X-Forwarded-Proto正确。

这是我们的Grails配置,但可以帮助您实现以下想法:

    grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
    grails.plugin.springsecurity.portMapper.httpPort = 80
    grails.plugin.springsecurity.portMapper.httpsPort = 443
    grails.plugin.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto'
    grails.plugin.springsecurity.secureChannel.secureHeaderValue = 'http'
    grails.plugin.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto'
    grails.plugin.springsecurity.secureChannel.insecureHeaderValue = 'https'
    grails.plugin.springsecurity.secureChannel.definition = [
        [pattern: '/**', access: 'REQUIRES_SECURE_CHANNEL']
    ]

0

为了延长另外两个回答这个问题https://stackoverflow.com/a/43026082/8775205https://stackoverflow.com/a/42035023/8775205。对于使用ELB在AWS上部署服务并需要逐步指南的Spr​​ing Boot用户,您可以在项目的src / main / webapp / .ebextensions / httpd / conf.d /下添加一个****。conf文件。 。

src
--main
----java
----resources
----webapps
------.ebextensions
--------httpd
----------confd
------------****.conf

****。conf如下所示。注意,我的测试站点只有一个实例,因此我添加了一个排除它的条件。

<VirtualHost *:80>
   LoadModule rewrite_module modules/mod_rewrite.so

   RewriteEngine On
   RewriteCond %{HTTP:X-Forwarded-Proto} !https
   RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker 
   RewriteCond %{HTTP_HOST} !testexample.com #excludes test site
   RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

   <Proxy *>
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass / http://localhost:8080/ retry=0
   ProxyPassReverse / http://localhost:8080/
   ProxyPreserveHost on

   ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>

此后,请记住在pom.xml中的maven-war-plugin下添加一个“资源”,以选择上述配置。

<plugin>
     <groupId>org.apache.maven.plugins</groupId>  
     <artifactId>maven-war-plugin</artifactId>  
     <configuration>  
         <webResources>
             <resource>  
               <!-- some other resource configured by yourself-->
             </resource> 
             <resource>
                <directory>src/main/webapps/.ebextensions</directory>
                 <targetPath>.ebextensions</targetPath>
                 <filtering>true</filtering>
             </resource> 
         </webResources>  
     </configuration>  
     <version>2.1.1</version>
 </plugin>

最后提交并推送代码,等待AWS Codebuild和Codepipeline从存储库中获取代码并部署到beantalk环境中,或者将项目打包到war文件中并将其上传到AWS beanstalk环境中


0

AWS不接受标题中的非下划线(_),而我们可以使用(-),因此从标题变量中删除下划线,例如:-header_var_val =“ some value”替换为headervarval =“ some value”。这个对我有用。


0

AWS也对此有一些文档

如果您使用的是应用负载平衡器,将文件添加http-to-https.config到您的.ebextensions文件夹,然后添加下面的配置(不要忘了把你的HTTPS证书的ARN):

注意:请确保尚未通过EB控制台在端口443上添加侦听器。如果这样做,请在添加.config文件之前删除侦听器。

Resources:
  AWSEBV2LoadBalancerListener:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      DefaultActions:
        - Type: redirect
          RedirectConfig:
            Protocol: HTTPS
            Port: '443'
            Host: '#{host}'
            Path: '/#{path}'
            Query: '#{query}'
            StatusCode: HTTP_301
      LoadBalancerArn:
        Ref: AWSEBV2LoadBalancer
      Port: 80
      Protocol: HTTP
  AWSEBV2LoadBalancerListenerHTTPS:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      Certificates:
        - CertificateArn: Replace with Certificate ARN
      DefaultActions:
        - Type: forward
          TargetGroupArn:
            Ref: AWSEBV2LoadBalancerTargetGroup
      LoadBalancerArn:
        Ref: AWSEBV2LoadBalancer
      Port: 443
      Protocol: HTTPS 

为此使用LB的优点是您的配置将与您使用的服务器(例如nginx,apache等)无关。



-4

这是一个简单的解决方案

  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]
    
  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 ../wsgi.conf'
    ...
    
  7. 部署代码。

  8. 现在,位于/etc/httd/conf.d/wsgi.conf的wsg.conf部署版本将包含必要的重定向规则。

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

作者日期rickchristianson


2
他的答案的精确副本:stackoverflow.com/questions/6858492/…。停止发布重复的答案!
Paresh Mayani 2014年

可以用相同的答案解决问题;)其垃圾邮件?
gusgard 2014年

3
在负载均衡器后面隐藏一个实例并进行调整无法达到Elastic Beanstalk的目的。当您扩大规模并获得更多实例时会发生什么?对所有人都这样吗?手动吗?
fourdogit

1
@fivedogit,如果您仔细阅读,会发现他没有通过SSH进入实例来进行调整。他仅通过SSH即可读取文件并进行复制。之后,他.ebextensions在部署中使用了通过Elastic Beanstalk本身正确进行调整的方法,因此他并没有违反它的目的。
ADTC '11 / 11/11
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.