在 AWS ELB 上强制使用 HTTPS

在 AWS ELB 上强制使用 HTTPS

我使用自定义域在 AWS ELB 上托管了一个基于 Java 的小型 JAR 打包 Web 应用程序。我上传了一个 ZIP 文件,如下所示:

myapp.zip
* myapp.jar

我已经使用 AWS CM 配置了证书,并且能够通过http://www.example.com以及访问我的应用程序https://www.example.com

现在我需要力量HTTPS总是. 我完全不知道该怎么做。

我看到了很多类似“配置你的 nginx”的答案:

https://stackoverflow.com/questions/24603620/redirecting-ec2-elb-from-http-to-https https://aws.amazon.com/de/premiumsupport/knowledge-center/redirect-http-https-elb/ http://www.emind.co/how-to/how-to-force-https-behind-aws-elb/

其他答案与此方向一致。

虽然我可以理解重写规则的想法,例如:

if ($http_x_forwarded_proto = 'http') {
    return 301 https://www.example.com$request_uri;
}

我缺少的是如何实际添加这个 AWS ELB nginx。

我最后尝试的是将其添加.ebextensions\nginx\conf.d\my.conf到我的 ZIP 存档中:

myapp.zip
* myapp.jar
* .ebextensions
  * nginx
    * conf.d
      * my.conf

内容:

if ($http_x_forwarded_proto = 'http') {
    return 301 https://www.example.com$request_uri;
}

这给了我以下错误:

2016/12/24 12:08:27 [emerg] 22709#0: "if" directive is not allowed here in /var/elasticbeanstalk/staging/nginx/conf.d/myconf:1

我猜的语法my.conf不对。我原本希望my.conf扩展 AWS ELB nginx 配置,但显然没有。我真的不想在我的 中拥有完整的 nginx 配置.ebextensions。我甚至不知道在哪里可以找到它。

答案1

我终于搞明白了。\.ebextensions\nginx\conf.d\elasticbeanstalk\*.conf例如,我必须将我的配置放入\.ebextensions\nginx\conf.d\elasticbeanstalk\force-https.conf

内容如下:

if ($http_x_forwarded_proto = 'http') {
    return 301 https://www.example.com$request_uri;
}

这将自动包含在 AWS ELB 配置文件中:

# Elastic Beanstalk Nginx Configuration File
...
http {
    ...
    server {
        ...
        # Include the Elastic Beanstalk generated locations
        include conf.d/elasticbeanstalk/*.conf;
    }
}

因此无需复制/覆盖整个nginx.conf

答案2

我想提出一个更好的解决方案,供将来参考。Amazon ELB v1 使用 nginx 作为 Docker 容器前的反向代理。您必须对其进行破解,以便在 AWS 实例启动时对其进行重写,就像您的解决方案一样。但是,使用 v2,您可以放弃这一点,只需使用您正在运行的自己的 nginx 即可。使用 v2 做几乎所有事情都更加方便,v1 是在 EBS 初期推出的,当时他们不确定如何使用它。

相关内容