Nginx

設置彈性負載均衡器後,我的 https 不再工作。Nginx 錯誤

  • December 27, 2020

我有一個正常實例,當不在負載均衡器後面時可以正常工作。我設置了一個 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;
   }
 }
}

最終從 nginx IRC 頻道的 vandemar 那裡得到了答案。看起來很簡單,但我很難弄清楚。ELB 正在處理 SSL,我已經給了它所有的證書資訊。問題是嘗試在單個實例或配置文件中再次處理它。解決方案是從配置文件中刪除所有 SSL 內容。所以刪除這三行修復了一切:

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

對我來說,我使用 CloudFormation 來設置我的負載均衡器。InstanceProtocol預設為 HTTP,我沒有設置該參數。這是修復:

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

引用自:https://serverfault.com/questions/369072