Подтвердить что ты не робот

Gunicorn + nginx: Сервер через сокет или прокси?

Я видел две стратегии для размещения приложения django с gunicorn и nginx.

Одна стратегия заключается в том, чтобы запускать пушки в сетевом порту. Например (из http://goodcode.io/blog/django-nginx-gunicorn/):

location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 10;
    proxy_read_timeout 10;
    proxy_pass http://localhost:8000/;
}

Другая стратегия - связать gunicorn с UNIX-сокетом при запуске (например, http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/)

upstream hello_app_server {
    server unix:/tmp/gunicorn.sock fail_timeout=0;
}

...

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://hello_app_server;
        break;
    }
}

Мысли о том, какая стратегия превосходит? Какие-либо комментарии относительно надлежащего способа сделать каждый? Я склоняюсь к подходу к сокету из-за накладных расходов, которые, как я полагаю, вводится TCP. Меня больше всего беспокоят различия в заголовках, таймаутах подключения и т.д. Между примерами реализации, которые я видел.

4b9b3361

Ответ 1

Помимо небольших накладных расходов TCP/IP, разница не очень велика. Каждый сокет listen() получает очередь подключения, а accept() просто выдает соединение из этой очереди. В стрельбе каждый рабочий просто выталкивает новое соединение из этой очереди как способное, чтобы оно не изменилось. Разница заключается в производительности (сокеты бывают немного быстрее) и переносимости (порт: IP более гибкий). Сокеты домена Unix дают вам немного лучшую производительность, в то время как сокет, подключенный к localhost, дает вам немного лучшую переносимость, если вы перемещаете серверное приложение на другую ОС, вы можете сделать это, просто изменив IP-адрес с localhost на другое имя хоста.

Ответ 2

Трафик сокетов будет простым выбором, если на вашем компьютере есть и ваш веб-сервер, и сервер приложений (wsgi). Однако вам понадобятся сетевые порты по сетевым соединениям, поскольку сокеты не могут работать по сети, поэтому..

  • Если веб-сервер и сервер приложений находятся на одной машине - GO SOCKET
  • Если веб-сервер и сервер приложений находятся в сети - GO PORTS

Ответ 3

предпочитает сокет-трафик по TCP/IP, поскольку для открытия не требуется дополнительный порт. чем меньше портов открывается, тем более жесткой становится ваша система.

как предлагается здесь, "быть параноидальным" https://hynek.me/talks/python-deployments/

"UNIX файловые сокеты с ограниченными правами - ваши друзья. И вы можете перестать приходить с номерами портов"