ОШИБКА: неверный заголовок HTTP_HOST: '/webapps/../gunicorn.sock'
После того, как я развернул свое приложение Django прошлой ночью, я получил тонны странных писем со словами:
ERROR: Invalid HTTP_HOST header: '/webapps/example_com/run/gunicorn.sock
Я уверен, что это как-то связано со следующей конфигурацией nginx:
upstream example_app_server {
server unix:/webapps/example_com/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name example.com;
client_max_body_size 4G;
access_log /webapps/example_com/logs/nginx-access.log;
error_log /webapps/example_com/logs/nginx-error.log;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://example_app_server;
break;
}
}
}
3 ответа
Я нашел ответ на свой вопрос в отчете об ошибке в Django.
proxy_set_header Host $http_host;
должен быть заменен на:
proxy_set_header Host $host;
чтобы nginx передавал правильные заголовки с того момента, чтобы вместо сокета gunicorn запрашиваемая страница была в оповещениях django.
Этот человек объясняет немного больше, что происходит на основе того же поста. Вот его / ее объяснение:
... когда запрос сделан на сервер, а HTTP-хост пуст, nginx устанавливает HTTP-хост на носок с оружием.
Я могу сгенерировать эту ошибку, используя curl:
curl -H "HOST:" MY_DOMAIN_NAME -0 -v
Это отправляет запрос без HTTP-хоста. -0 заставляет curl использовать HTTP версию 1.0. Если вы не установите это, запрос будет использовать HTTP версию 1.1, что приведет к немедленному отклонению запроса и не вызовет ошибку.
Решение состоит в том, чтобы заменить $http_host на $host (как указано в Stackru). Если HTTP-хост отсутствует, $host принимает значение директивы server_name. Это допустимое доменное имя, и именно его следует использовать.
Добавьте это в свой файл settings.py:
from django.http.request import HttpRequest
HttpRequest.get_host = HttpRequest._get_raw_host