允许EC2从端口443收听来自负载均衡器

时间:2018-04-06 19:16:05

标签: python ssl flask elastic-beanstalk wsgi

如何配置.ebextensions以便EB负载均衡器终止https,然后将未加密的请求转发到我的EC2实例。 EC2实例读取请求。

我的负载均衡器接受2个端口的请求。 80和443. 443有一个上传的证书,我购买了#34; AWS Route 53"并通过了“AWS证书管理器”#34; (需要打开443端口)。

enter image description here

(上面隐藏了*** ssl证书)

此外,我的安全组允许https超过443.

问题是我不知道如何编写.ebextensions/...config以允许接受从负载均衡器传递的443以上的未加密请求。

我发现了这个(亚马逊文档): https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/https-singleinstance-python.html 和(堆栈溢出): Flask on Elastic Beanstalk with SSL gives 403 Forbidden

但我认为这些都会在负载均衡器转发加密请求时给出示例。

我在下面试过但是没有成功:

#https.config
Resources:
  sslSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupName: {Ref : AWSEBSecurityGroup}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      CidrIp: 0.0.0.0/0

我希望负载均衡器进行解密,然后将未加密的请求转发到我的应用使用的端口。

在我的应用中:

# wsgi.py
from app import application

if __name__ == "__main__":
    application.run(host='0.0.0.0', port=443)

目前http运作良好且速度很快,但https只是超时。

我是开发人员,但我对sysops几乎一无所知。

我一直试图调试这一天超过一天,所以任何帮助都会非常感激。

更新

根据Configure apache to listen on port other than 80,我尝试更改:

    {li> Listen 80Listen 443 中的/etc/httpd/conf/httpd.conf {li> <VirtualHost *:80><VirtualHost *:443> 中的/etc/httpd/conf.d/wsgi.conf
  • 然后运行sudo /sbin/service httpd restart

3 个答案:

答案 0 :(得分:1)

检查一下。

AWS - SSL/https on load balancer

你真的应该考虑不使用内置的烧瓶网络服务器,仅用于开发。试试uwsgi或gunicorn

答案 1 :(得分:0)

我建议只设置Apache监听端口80并更改负载均衡器,将InstancePort设置为80,两个传入端口均为80&amp; 443。

LB终止SSL的一个好处是您不必担心处理上游服务器上的多个端口。

您可以使用X-Forwarded-Proto标头(负载均衡器提供)以确定请求最初是通过HTTP还是HTTPS进行的,这样您就可以相应地构建链接/网址等。

修改

基于该标题处理URL创建的另一种方法是强制使用https流量,你可以使用下面的内容,虽然我是一个nginx用户而不是Apache,所以你的里程可能会有所不同,因为下面的配置可能是完全是垃圾。

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

答案 2 :(得分:0)

我能够通过从负载均衡器将两个端口转发为我的EC2实例来解决。

注意实例端口为80,实例协议为HTTP

以前我无法为第二个指定80因为我将协议保留为HTTPS

enter image description here