使用 nginx 将 Elastic Beanstalk HTTP 请求重定向到 HTTPS

Posted

技术标签:

【中文标题】使用 nginx 将 Elastic Beanstalk HTTP 请求重定向到 HTTPS【英文标题】:Redirect Elastic Beanstalk HTTP requests to HTTPS with nginx 【发布时间】:2019-01-24 19:15:51 【问题描述】:

我希望在 Elastic Beanstalk 上使用 nginx 作为代理系统从 HTTP 请求重定向到 HTTPS。

我在 Google 上找到了很多建议,但没有人提供帮助,它不会重定向。

这是我当前在.ebexentions 目录中的test.config 文件:

files:
"/etc/nginx/conf.d/proxy.conf" :
    mode: "000644"
    owner: root
    group: root
    content: |
        server
            if ($http_x_forwarded_proto = "http") 
                return 301 https://$host$request_uri;
            
        

我也尝试了无数其他设置,但都没有奏效。

这是我的负载均衡器设置:

我希望你能帮助我。 :)

【问题讨论】:

您的 EB 设置是否带有负载均衡器?您是否查看了这篇 SO 文章中的所有内容? ***.com/questions/24297375/… 【参考方案1】:

一些注意事项:

1 - 运行 Amazon Linux 2 的新 Amazon Elastic Beanstalk 平台版本具有不同的反向代理配置路径:

~/workspace/my-app/
|-- .platform
|   `-- nginx
|      `-- conf.d
|         `-- elasticbeanstalk
|            `-- 00_application.conf
`-- other source files

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html

2 - AWS ELB 运行状况检查器似乎无法检查 HTTPS 端点。 当然,如果您为您的域使用自定义证书,则无法检查他认为的“不受信任的站点”。 https://your-eb-app.eu-west-3.elasticbeanstalk.com 发布时使用此 DNS 别名 https://your-eb-app.your-organization.com 为您的组织注册的证书导致 ELB 健康检查器错误(证书域不匹配)。

3 - 建议的配置将所有位置暴露给 ANY 客户端,该客户端在标准 HTTP 端口 (80) 上显示为“ELB-HealthChecker*”用户代理;不是我们想要的:-)

你可以配置ELB Health Checker来接受HTTP 301状态,但是没有太大用处;一个简单的重定向响应并不意味着我们的 Web 应用程序运行良好 :-)

更安全的解决方案是专用的健康检查端点配置:

location / 
    set $redirect 0;
    if ($http_x_forwarded_proto != "https") 
        set $redirect 1;
    
    if ($redirect = 1) 
        return 301 https://$host$request_uri;
       

    proxy_pass        http://127.0.0.1:5000;
    proxy_http_version  1.1;

    proxy_set_header    Connection         $connection_upgrade;
    proxy_set_header    Upgrade            $http_upgrade;
    proxy_set_header    Host               $host;
    proxy_set_header    X-Real-IP          $remote_addr;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;


location = /health-check.html 
    set $redirect 0;
    if ($http_x_forwarded_proto != "https") 
        set $redirect 1;
    
    if ($http_user_agent ~* "ELB-HealthChecker") 
        set $redirect 0;
    
    if ($redirect = 1) 
        return 301 https://$host$request_uri;
       

    proxy_pass        http://127.0.0.1:5000;
    proxy_http_version  1.1;

    proxy_set_header    Connection         $connection_upgrade;
    proxy_set_header    Upgrade            $http_upgrade;
    proxy_set_header    Host               $host;
    proxy_set_header    X-Real-IP          $remote_addr;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;

【讨论】:

我试过了,但是如果我把 00_application.conf 放在 elasticbeanstalk 里面,它就会被忽略完成。如果我把它提高一级,它会被读取,但它期望一些不同的东西。例如,如果我包含“位置”,我会在 /var/proxy/staging/nginx/conf.d/00_application.conf:1 中得到“位置”指令是不允许的。如果我只包含 server 指令,那么我会在 0.0.0.0:80 上得到冲突的服务器名称“”,被忽略(我想是因为服务器已经在主 nginx 配置中配置)。 您使用的是 Amazon Linux 2 平台吗?这些是我的机器nginx文件配置路径: [root@ip-172-99-99-55 ~]# find / -name 00_application.conf /etc/nginx/conf.d/elasticbeanstalk/00_application.conf /var/app/ current/.platform/nginx/conf.d/elasticbeanstalk/00_application.conf /var/proxy/staging/nginx/conf.d/elasticbeanstalk/00_application.conf【参考方案2】:

我做了什么来实现,我用我的自定义给定 nginx.conf 以及一些位置指令的自定义配置完全覆盖了原始 nginx.conf

.plateform -- nginx -- nginx.conf -- conf.d -- elasticbeanstalk --custom.conf

这是我的 nginx.conf

user  nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    32153;
events 
  worker_connections  1024;

http 
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

  include       conf.d/*.conf;

   map $http_upgrade $connection_upgrade 
    default     "upgrade";
  
  server 
    listen        80 default_server;
    access_log    /var/log/nginx/access.log main;

    client_header_timeout 60;
    client_body_timeout   60;
    keepalive_timeout     60;
    gzip                  off;
    gzip_comp_level       4;
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    # Include the Elastic Beanstalk generated locations
    include conf.d/elasticbeanstalk/*.conf;



以下代码将帮助我安全地覆盖配置

include conf.d/elasticbeanstalk/*.conf;

【讨论】:

您是如何获得原始 nginx 配置的,以便您可以安全地覆盖它?【参考方案3】:

This 是唯一有效的解决方案。

AWS 创建后需要覆盖默认的 nginx 文件。所以必须还有两个文件:

    编写 nginx 文件。 创建一个覆盖默认 nginx 文件的脚本。 在 AWS 创建默认文件后运行脚本。

【讨论】:

【参考方案4】:

当我尝试使用 Nginx 在我的 AWS Elastic Beanstalk Go 环境中将所有 HTTP 流量重定向到 HTTPS 时,我遇到了类似的问题。这是解决方案,我是由 AWS Support 团队提供的:

在应用程序代码根目录的以下目录结构中创建一个文件。

.ebextensions/nginx/conf.d/elasticbeanstalk/00_application.conf

内容

location / 
     set $redirect 0;
     if ($http_x_forwarded_proto != "https") 
       set $redirect 1;
     
     if ($http_user_agent ~* "ELB-HealthChecker") 
       set $redirect 0;
     
     if ($redirect = 1) 
       return 301 https://$host$request_uri;
        

     proxy_pass          http://127.0.0.1:5000;
     proxy_http_version  1.1;

     proxy_set_header    Connection          $connection_upgrade;
     proxy_set_header    Upgrade             $http_upgrade;
     proxy_set_header    Host                $host;
     proxy_set_header    X-Real-IP           $remote_addr;
     proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;

有关 AWS 提供的配置文件的完整列表,您应该查看 this link。

【讨论】:

这个解决方案对我不起作用,成功部署后elasticbeanstalk文件夹只包含两个文件healthd.conf php.conf @AliAbbas PHP 参考位于github.com/awsdocs/elastic-beanstalk-samples/blob/master/… 谢谢它尝试了太多东西,我只需要在 nginx/conf.d/elasticbeanstalk/custom.conf location /blog try_files $uri $uri/ /blog/index.php?$参数; gzip_static 开启; 位置 /blogs 返回 301 $scheme://site.com/blog; 位置 /blogs.html 返回 301 $scheme://site.com/blog; 位置 ~ ^/blogs/(.*) return 301 $scheme://site.com/blog; 但我不确定为什么这个文件夹没有添加任何文件

以上是关于使用 nginx 将 Elastic Beanstalk HTTP 请求重定向到 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Elastic beanstalk:使用 nginx/apache 将子域转发到子文件夹

Amazon Elastic Beanstalk ebextension 将 nginx 配置参数添加到默认配置中

Python3 + Nginx:将 HTTP 流量重定向到 AWS Elastic Beanstalk 上的 HTTPS

非 www 到 www 使用 AWS Elastic Load Balancer 和 Nginx

将 Http 重定向到 Elastic BeansTalk、Tomcat、Nginx 中的 Https

PHP Elastic Beanstalk 环境的自定义 nginx 配置