ОШИБКА: неверный заголовок 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
Другие вопросы по тегам