Nginx
設置彈性負載均衡器後,我的 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; } } }
最終從 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