如何让Elastic Beanstalk nginx支持的代理服务器从HTTP自动重定向到HTTPS?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让Elastic Beanstalk nginx支持的代理服务器从HTTP自动重定向到HTTPS?相关的知识,希望对你有一定的参考价值。

我有一个Node.js支持的网站,我在Amazon Elastic Beanstalk上运行。

我的Node.js应用程序侦听端口8080,我在我的EB应用程序中使用nginx弹性负载均衡器配置,在端口80和443上侦听HTTP和HTTPS。

但是,我只想接受通过HTTPS发送的应用中的流量。

我可以在应用程序中安装一些东西来解决这个问题,但是我有兴趣让负载均衡器通过HTTPS将所有HTTP请求重定向到我的站点。

答案

经过亚马逊付费支持的几次虚假启动后,他们最终确实通过了。您可以将环境配置为响应端口80和443.然后在主Node.js应用程序文件夹中创建一个名为.ebextensions的文件夹,并在其中放置一个名为00_nginx_https_rw.config的文件,其中包含以下文本:内容:

files:
  "/tmp/45_nginx_https_rw.sh":
    owner: root
    group: root
    mode: "000644"
    content: |
      #! /bin/bash

      CONFIGURED=`grep -c "return 301 https" /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf`

      if [ $CONFIGURED = 0 ]
        then
          sed -i '/listen 8080;/a     if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }
' /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
          logger -t nginx_rw "https rewrite rules added"
          exit 0
        else
          logger -t nginx_rw "https rewrite rules already set"
          exit 0
      fi

container_commands:
  00_appdeploy_rewrite_hook:
    command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/appdeploy/enact
  01_configdeploy_rewrite_hook:
    command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact
  02_rewrite_hook_perms:
    command: chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
  03_rewrite_hook_ownership:
    command: chown root:users /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh

亚马逊的支持团队解释说:这个配置创建了一个部署钩子,它将重写规则添加到/etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf。

(之前他们曾经提供过.config,它将单独的文件复制到/etc/nginx/conf.d中,但是由于某种原因,这些文件要么没有效果,要么更糟糕,似乎覆盖或优先于默认的nginx配置。)

如果您想要撤消此操作,即删除挂钩,则需要删除此ebextension并发出命令以删除它创建的文件。您可以手动执行此操作,也可以通过临时安装的ebextensions命令执行此操作:

/opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh
/opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh

我没有试过这个,但可能这样的东西可以删除它们并撤消这个改变:

container_commands:
  00_undochange:
    command: rm /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh
  01_undochange:
    command: rm /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh

希望这可以在将来帮助别人。

另一答案

接受的答案对我来说不再适用。默认端口是另一个端口。此外,配置文件的位置已更改。我正在使用Puma设置Ruby On Rails应用程序。

我谈到付费支持,我们通过在运行的实例上手动运行命令来解决这个问题。然后我能够找出以下解决方案。只需登录并重新启动nginx即可。

files:
  "/tmp/45_nginx_https_rw.sh":
    owner: root
    group: root
    mode: "000644"
    content: |
      #! /bin/bash

      CONFIGURED=`grep -c "return 301 https" /opt/elasticbeanstalk/support/conf/webapp_healthd.conf`

      if [ $CONFIGURED = 0 ]
        then
          sed -i '/listen 80;/a     if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }
' /opt/elasticbeanstalk/support/conf/webapp_healthd.conf
          logger -t nginx_rw "https rewrite rules added"
          exit 0
        else
          logger -t nginx_rw "https rewrite rules already set"
          exit 0
      fi

container_commands:
  00_appdeploy_rewrite_hook:
    command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/appdeploy/enact
  01_configdeploy_rewrite_hook:
    command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact
  02_rewrite_hook_perms:
    command: chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
  03_rewrite_hook_ownership:
    command: chown root:users /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh

请注意我是如何更改端口号和配置文件的位置的。

另一答案

您可以通过Node.js应用程序处理重定向。

当客户端不安全地连接时,亚马逊发送X-Forwarded-Proto标头等于http

在初始化Express之后,在定义路由以自动将客户端重定向到相应的HTTPS端点之前,应立即插入以下中间件:

// Redirect to HTTPS
app.use(function (req, res, next) {
    // Insecure request?
    if (req.get('x-forwarded-proto') == 'http') {
        // Redirect to https://
        return res.redirect('https://' + req.get('host') + req.url);
    }

    next();
});
另一答案

我能够通过一个稍微简单的解决方案来解决这个问题。

请注意,这是一个弹性beanstalk部署SINGLE实例,而不是负载平衡。

这是我添加的ebextension。

files:
  "/etc/nginx/conf.d/000_my_config.conf":
    mode: "000755"
    owner: root
    owner: root
    content: |
      server {
          listen 8080;
          return 301 https://$host$request_uri;
      }
另一答案

我在AWS Elastic Beanstalk上运行'Ruby2 Puma'环境,可能与上面的配置略有不同。在我的环境中,我需要使用'listen 80'而不是'listen 8080'。

基于elloworld111's answer的sslredirect.config:

files:
  "/etc/nginx/conf.d/000_my_config.conf":
    mode: "000755"
    owner: root
    owner: root
    content: |
      server {
          listen 80;
          return 301 https://$host$request_uri;
      }
另一答案

我正在使用Elastic Beanstalk和Docker,所以采取了一种稍微不同的路径来为我运行,但很大程度上受到了接受的答案的启发。此脚本将所需的配置注入/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf。 (如果有人有更优雅的解决方案,我很乐意看到它)

此脚本还使Beanstalk运行状况检查能够访问我的运行状况检查端点(在我的情况下为api / healthcheck)更好地允许LoadBalancer命中应用程序,而不是终止于Nginx。

files:
  "/tmp/45_nginx_https_rw.sh":
    owner: root
    group: root
    mode: "000755"
    content: |
      #! /bin/bash

      CONFIGURED=`grep -c "return 301 https" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf`

      if [ $CONFIGURED = 0 ]
        then
          sed -i "/access.log;/a         location /api/health-check { proxy_pass http://docker; }" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf
          sed -i "/proxy_add_x_forwarded_for;/a             if ($http_x_forwarded_proto != 'https') { return 301 https://$host$request_uri; }" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf
          logger -t nginx_rw "https rewrite rules added"
          exit 0
        else
          logger -t nginx_rw "https rewrite rules already set"
          exit 0
      fi

container_commands:
  00_run_script:
    command: /tmp/45_nginx_https_rw.sh
另一答案

我能够以不同的方式使用它。我更改了负载均衡器以将端口80流量转发到端口8082,并更改了防火墙规则(实例上的入站,防火墙上的出站)以允许这样做。然后在.ebextensions中添加此文件:

files:
  "/etc/nginx/conf.d/50-atd-hotel-http-redirect.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      server {
        listen   8082;

        return 301 --WHATEVER DESTINATION YOU WANT--;
      }

以上是关于如何让Elastic Beanstalk nginx支持的代理服务器从HTTP自动重定向到HTTPS?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 SSL 与 Rails、AWS Elastic Beanstalk 和 Cloudflare 一起使用

如何让 HTTPS 在网站上运行 - 特别是 AWS 中的 Elastic Beanstalk 网站

如何让Elastic Beanstalk nginx支持的代理服务器从HTTP自动重定向到HTTPS?

如何使用 TFS 2017 部署到 Elastic Beanstalk?

如何让 AWS S3 存储桶中的 Angular 应用程序对 AWS Elastic Beanstalk 中的服务进行 API 调用

如何将 Elastic Beanstalk 获取到服务器编译的资产?