nginx, flower, Django, proxy_pass и отклонение недопустимых хостов

#django #amazon-web-services #nginx #uwsgi #flower

#django #amazon-web-services #nginx #uwsgi #flower

Вопрос:

У меня есть сервер на AWS, на котором работает nginx / uWSGI / Django, с RabbitMQ, flower и Celery.

Проблема: используйте nginx для прокси для flower без открытия нового порта, а также отклоняйте неправильно сформированные запросы, которые могут вызвать недопустимые ошибки заголовка HTTP_HOST в Django.

Я могу сделать либо, но не оба, потому что у меня нет большого опыта работы с nginx.

Я использую flower 0.9.4, поскольку мне известно об ошибке в 0.9.5.

В следующих файлах конфигурации, если я закомментирую строку «reject_hosts.conf», flower работает, но я перестаю отклонять хосты, как и должен. Если я оставлю это, веб-браузер по истечении времени выполнит запрос URL-адреса /flower.

Вот соответствующие файлы конфигурации:

nginx-app.conf

 # the upstream component nginx needs to connect to
upstream django {
    server unix:/home/app.sock; # uwsgi socket
}

include redirect_ssl.conf; #301 SSL redirects

# actual webserver. Note that https is handled by AWS so no listen on 443
server {
    # default_server indicates that this server block is the block to use if no others match server_name
    listen      8080 default_server;
    listen      [::]:8080 default_server;
    charset     utf-8;

    # max upload size
    client_max_body_size 3M;   # adjust to taste
    include django_aliases.conf; # media and static directories

    include reject_hosts.conf; # return 444 if wrong HOSTs header
    include flower.conf; # proxy flower

    include django_root.conf; # django upstream
}
  

redirect_ssl.conf

 ## 301 redirect for HTTPS
server {
     listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}
  

flower.conf — это РАБОТАЕТ, если параметр reject_hosts не включен. Я перепробовал около тысячи вариантов этого, чтобы получить тот, который правильно работает со всеми файлами в Flower.

 location /flower/ {
    rewrite ^/flower/(.*)$ /$1 break;
    proxy_pass http://localhost:5555;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;
}
  

reject_hosts.conf

 if ($host !~* ^(127.0.0.1|localhost|mydomain.com|myotherdomain.com|my.subdomain.com)$ ) {
    return 444;
}

  

django_aliases.conf

 # Django media
location /media  {
    alias media;  # Media files, actual location removed for paranoia
}

location /static {
    alias static; # Static files, actual location removed for paranoia
}
  

django_root.conf

 location / {
    uwsgi_pass  django;
    include     uwsgi_params; # location removed for paranoia
    uwsgi_read_timeout 600;
    uwsgi_send_timeout 600;
    uwsgi_connect_timeout 60;
    uwsgi_ignore_client_abort on;
}

  

Наконец, Flower запускается супервизором следующим образом:

 command = python3 -m celery -A myproj flower --url_prefix=flower --port=5555
  

Комментарии:

1. С другой стороны, есть ли какой-нибудь способ просматривать запросы nginx настолько подробно, чтобы я мог видеть, какие $host отклоняются и т. Д. когда я пытаюсь перейти к flower?

Ответ №1:

Вы можете попробовать отфильтровать HTTP-запросы через блоки сервера (как предложено в руководстве по nginx):

 server {
    listen 80;
    listen [::]:80;
    server_name 127.0.0.1 localhost mydomain.com myotherdomain.com my.subdomain.com;
    return 301 https://$host$request_uri;
}
server {
    # handle invalid requests with his one
    listen 80 default_server;
    listen [::]:80 default_server;
    return 444;
}
server {
    listen      8080;
    listen      [::]:8080;
    server_name 127.0.0.1 localhost mydomain.com myotherdomain.com my.subdomain.com;
    ... # rest of the configuration
}
server {
    # handle invalid requests with his one
    listen      8080 default_server;
    listen      [::]:8080 default_server;
    return 444;
}
  

Таким образом, вам вообще не понадобится reject_hosts.conf файл.

Комментарии:

1. Спасибо. Это кажется очень очевидным в ретроспективе.

Ответ №2:

Я не знаю, заметили вы или нет. Вы просто обрабатываете действительный запрос и не прослушиваете недопустимый запрос.

Просто добавьте этот атрибут в контекст сервера nginx:

server_name example.com mysite.example.com

и аналогично вы должны внести запись об этих хостах в django settings.py досье. Обычно я делаю эту запись с '*' помощью so, чтобы мне не нужно было беспокоиться о том, какое имя proxy_pass хоста задано в nginx или на каком хосте запрашивает мой сельдерей и т. Д. Поэтому Просто добавьте строку ниже строки в settings.py

ALLOWED_HOSTS=['*']