我使用自定义域在 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 初期推出的,当时他们不确定如何使用它。