2017-01-27 6 views
0

У меня есть сайт, настроенный таким образом: nginx в качестве прокси-сервера, прокси-сервер запрашивает tu экземпляр gunicorn, обслуживающий сайт Django через сокет UNIX.Почему nginx принимает запросы с заголовком узла, который не совпадает с именем сервера?

Это моя конфигурация Nginx:

server { 
    listen 80; 
    server_name api.mysite.com; 

    location /static/ { 
     alias /webapps/mysite/static/; 
     autoindex off; 
    } 

    location/{ 
     include proxy_params; 
     proxy_pass http://unix:/webapps/mysite/mysite.sock; 
    } 

}

Это мое понимание того, что Nginx, при получении запроса, соответствует заголовку Host против параметра server_name блока сервера и, если он соответствует , он служит ему. Однако nginx пытается подавать (передавая запрос на мой сервер Django) с заголовком Host, отличным от api.mysite.com. Django имеет параметр с именем ALLOWED_HOSTS (в моем случае установлен в ['api.mysite.com']), который выполняет дополнительную проверку заголовка Host и вызывает ошибку, если заголовок запроса Host не соответствует, что не должно произойти, поскольку nginx предположительно уже фильтрует это. Дело в том, что я вижу ошибки, вызванные Джанго которые выглядят следующим образом:

  • Неправильный заголовок HTTP_HOST: «/webapps/mysite/mysite.sock:». Предоставленное доменное имя недействительно согласно RFC 1034/1035.
  • Недопустимый заголовок HTTP_HOST: 'testp1.piwo.pila.pl'. Вам может потребоваться добавить 'testp1.piwo.pila.pl' в ALLOWED_HOSTS.
  • Недопустимый заголовок HTTP_HOST: 'xxx.xxx.xxx.xxx'(Настоящий IP-адрес моего сервера). Вам может потребоваться добавить «xxx.xxx.xxx.xxx» в ALLOWED_HOSTS.

Пара вещей:

  • Я знаю, что запросы идут через Nginx, потому что они появляются в журналах Nginx, и было бы невозможно в любом случае непосредственно на сервер gunicorn ударил, потому что я проксировании через сокет UNIX, а не через HTTP.
  • Я знаю, что эти запросы исходят от бота, ищущего бесплатные прокси-серверы, но мне это не очень нравится. То, что меня действительно заинтриговало, - это запрос с заголовком Host, установленным в путь в локальной файловой системе моего UNIX-гнезда gunicorn/nignx.

Любые подсказки?

+0

У вас есть сайт по умолчанию для nginx? Раньше у меня была проблема, когда хозяин не соответствовал ни одному из имен сервера, который он обслуживал первым, найденным в алфавитном порядке. – cdvv7788

+1

http://nginx.org/en/docs/http/request_processing.html –

+0

@ cdvv7788 У меня нет сервера по умолчанию, поэтому я думаю, что это, вероятно, так. Я собираюсь проверить этот день. – sanfilippopablo

ответ

0

Оказывается, если nginx не встретит соответствующий серверный блок, он отправит запрос на первый серверный блок. Таким образом, решение было установить серверный блок по умолчанию, который отбрасывает каждый запрос следующим образом:

server { 
    listen 80 default_server; 
    return 444; 
}