Что такое Gunicorn и Nginx в двух словах
При размещении веб-приложения Python на продакшене вы не сможете обойтись без использования сервера WSGI и веб-сервера.
Gunicorn и Nginx - это самые надежные и популярные варианты таких приложений. Почему они используются в связке?
Nginx и Gunicorn работают вместе
Nginx принимает все запросы из Интернета. Он может обрабатывать их очень быстро и обычно настраивается так, чтобы пропускать только те запросы, которые действительно должны поступить в ваше веб-приложение. Остальные он блокирует.
Gunicorn переводит запросы, полученные от Nginx, в формат, который может обрабатывать ваше веб-приложение, и обеспечивает выполнение кода при необходимости.
Они составляют отличную команду! Каждый может сделать что-то, что другой не может. Давайте посмотрим на их сильные стороны подробно, и как они дополняют друг друга.
Nginx
Nginx - это веб-сервер, а если точнее то это HTTP-сервер и IMAP/POP3 прокси-сервер для UNIX-подобных платформ (FreeBSD и GNU/Linux). Он оптимизирован для всех вещей, которые должен делать веб-сервер. Для балансировки нагрузки, защита от DDoS-атак, работает как обратный прокси-сервер.
Под обратным проксированием обычно понимается процесс, в котором сервер, получающий запрос от клиента, не обрабатывает его полностью самостоятельно, а частично или целиком отправляет этот запрос для обработки другим (upstream) серверам. То есть, не перенаправляет клиента, а самостоятельно отправляет запрос и возвращает полученный ответ обратно клиенту.
Вот несколько вещей, в которых он делает свою работу очень хорошо:
- Маршрутизация доменного имени (решает, куда должны отправляться запросы, или в случае ответа об ошибке)
- Обслуживание статических файлов
- Высокая скорость обработки множества запросов, поступающих одновременно
- Общение с медленными клиентами
- Направление запросов, которые должны быть динамическими в Gunicorn
- Работа по SSL (здесь происходит https)
- Экономия вычислительных ресурсов (процессор и память) по сравнению с кодом Python
- И многое другое, если вы настроите это (балансировка нагрузки, кэширование и т. Д.)
Вещи, которые Nginx не может сделать:
- Запуск веб-приложений Python
- Перевести запросы в WSGI
Gunicorn
Как только Nginx решит, что конкретный запрос должен быть передан в Gunicorn (согласно правилам, по которым он был настроен), в работу вступает Gunicorn.
Gunicorn действительно хорош в том, что он делает! Он высоко оптимизирован и имеет множество удобных функций. В основном, его работа состоит из:
- Запуск пула рабочих процессов / потоков (выполнение вашего кода!)
- Переводит запросы, поступающие от Nginx, для совместимости с WSGI
- Переведит ответы WSGI вашего приложения в правильные ответы HTTP
- На самом деле вызывает код Python, когда приходит запрос
- Gunicorn может общаться с различными веб-серверами
Что Gunicorn не может сделать для вас:
- Не может работать с фронтендом
- Не может поддерживать работу по SSL (без обработки https)
- Не может обеспечить работу полноценного веб-сервера, как например Nginx
Gunicorn - только один из многих серверов WSGI. Вашему приложению не важно, какой веб сервер вы используете. Но Gunicorn - отличный выбор!