Ошибка Nginx 400 - клиент отправил обычный HTTP-запрос на HTTPS-порт при чтении заголовков клиентского запроса
Недавно я добавил SSL-сертификат на свой сайт с помощью Let's Encrypt и заметил, что когда я пытаюсь зайти на свой сайт, используя HTTP или HTTPS, сайт загружается правильно большую часть времени, но иногда он возвращает ошибку 400: Bad Request. Обновление страницы после этого обычно возвращает меня на рабочий HTTPS сайт, но мне трудно понять, почему эта ошибка возникает только иногда.
Текущий сайт использует Django, Gunicorn, Nginx и AWS EC2 с балансировщиком нагрузки, а SSL-сертификат предназначен для экземпляра EC2, если это имеет значение.
nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log info;
##
# Gzip Settings
##
gzip on;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Файл .conf с поддержкой сайтов
server {
listen 80;
server_name = "";
return 444;
}
server {
listen 80;
server_name sitename;
return 301 https://$host$request_uri;
}
server {
listen 443 default ssl;
server_name sitename;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /opt/code/shop;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
ssl_certificate /etc/letsencrypt/live/sitename/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/sitename/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $server_name;
Вывод примера журнала ошибок Nginx error.log
2022/12/06 17:41:22 [info] 1996220#1996220: *1047 client sent plain HTTP request to HTTPS port while reading client request headers, client: ip, server: sitename, request: "GET / HTTP/1.1", host: "sitename"
2022/12/06 17:59:42 [info] 1996220#1996220: *1929 client sent invalid method while reading client request line, client: ip, server: sitename, request: "KtIX\YNY"