设置 Elastic Load Balancer 后,我的 https 不再起作用。Nginx 错误

设置 Elastic Load Balancer 后,我的 https 不再起作用。Nginx 错误

我有一个常规实例,当没有负载均衡器时,它可以正常工作。我设置了一个 ELB,将 80 转发到 80,将 443 转发到 443,并设置了粘性会话。之后,当我访问任何 https 页面时,都会收到此错误。

The plain HTTP request was sent to HTTPS port

我在 nginx 配置中处理在某些页面上强制使用 https 的过程。我需要做什么才能使其正常工作?我在下面输入了我的 nginx 配置的准系统版本。

http {

  include               mime.types;
  default_type          application/octet-stream;

  # Directories
  client_body_temp_path tmp/client_body/  2 2;
  fastcgi_temp_path     tmp/fastcgi/;
  proxy_temp_path       tmp/proxy/;
  uwsgi_temp_path       tmp/uwsgi/;

  server {
    listen              443;
    ssl                 on;
    ssl_certificate     ssl.crt;
    ssl_certificate_key ssl.key;

    server_name www.shirtsby.me;
    if ($host ~* ^www\.(.*)) {
        set $host_without_www $1;
        rewrite ^/(.*) $scheme://$host_without_www/$1 permanent;
    }

    location ~ ^/(images|img|thumbs|js|css)/  {
          root /app/public;
    }
    if ($uri ~ ^/(images|img|thumbs|js|css)/) {
        set $ssltoggle 1;
    }
    if ($uri ~ "/nonsecure") {
        set $ssltoggle 1;
    }
    if ($ssltoggle != 1) {
        rewrite ^(.*)$ http://$server_name$1 permanent;
    }

    location / {
      uwsgi_pass  unix:/site/sock/uwsgi.sock;
      include     uwsgi_params;
    }

  }

  server {
    listen      80;
    server_name www.shirtsby.me;
    if ($host ~* ^www\.(.*)) {
        set $host_without_www $1;
        rewrite ^/(.*) $scheme://$host_without_www/$1 permanent;
    }

    if ($uri ~ "/secure") {
        set $ssltoggle 1;
    }
    if ($ssltoggle = 1) {
        rewrite ^(.*)$ https://$server_name$1 permanent;
    }

    location ~ ^/(images|img|thumbs|js|css)/  {
          root /app/public;
    }

    location / {
      uwsgi_pass  unix:/home/ubuntu/site/sock/uwsgi.sock;
      include     uwsgi_params;
    }
  }
}

答案1

最后在 nginx IRC 频道中从 vandemar 那里得到了答案。看起来很简单,但我费了好大劲才搞明白。ELB 正在处理 SSL,我已经给了它所有的证书信息。问题是试图在单个实例上或配置文件中再次处理它。解决方案是从配置文件中删除所有 SSL 内容。因此,删除这三行可以解决所有问题:

ssl                 on;
ssl_certificate     ssl.crt;
ssl_certificate_key ssl.key;

答案2

对我来说,我使用 CloudFormation 设置负载均衡器。InstanceProtocol默认为 HTTP,而我没有设置该参数。这是修复方法:

  ElasticLoadBalancer:
    Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
    Properties:
      Listeners:
        - LoadBalancerPort: '443'
          Protocol: HTTPS
          InstancePort: '443'
          InstanceProtocol: HTTPS

答案3

我遇到了同样的问题。但后来我注意到我的 elb-listener 配置不正确。我设置了负载均衡器协议:https、负载均衡器端口:443、实例端口:443,但忘记将实例协议从 http 更改为 https。

相关内容