#python #ssl #flask
Вопрос:
Настройка колбы с uWSGI и Nginx может быть сложной. Я попытался следовать этому учебнику по DigitalOcean, но у меня все еще были проблемы. Даже с помощью сценариев сборки это требует времени, и мне нужно написать инструкции, чтобы следовать им в следующий раз.
Если я не ожидаю большого трафика или приложение является частным, имеет ли смысл запускать его без uWSGI? Фляга может прослушивать порт. Может ли Nginx просто пересылать запросы?
Имеет ли смысл также не использовать Nginx, просто запустив приложение «голая колба» на порту?
Ответ №1:
Когда вы «запускаете Flask», вы фактически запускаете сервер WSGI разработки Werkzeug и передаете свое приложение Flask в качестве вызываемого WSGI.
Сервер разработки не предназначен для использования в рабочей среде. Он не предназначен для того, чтобы быть особенно эффективным, стабильным или безопасным. Он не поддерживает все возможные функции HTTP-сервера.
Замените сервер разработки Werkzeug на готовый к работе сервер WSGI, такой как Gunicorn или uWSGI, при переходе на производство, независимо от того, где будет доступно приложение.
Ответ аналогичен для «должен ли я использовать веб-сервер». На серверах WSGI есть HTTP-серверы, но они не будут так хороши, как выделенный рабочий HTTP-сервер (Nginx, Apache и т. Д.).
Колба документирует, как развертываться различными способами. У многих хостинг-провайдеров также есть документация о развертывании Python или Flask.
Ответ №2:
Сначала создайте приложение:
import flask
app = flask.Flask(__name__)
Затем настройте маршруты, а затем, когда вы хотите запустить приложение:
import gevent.pywsgi
app_server = gevent.pywsgi.WSGIServer((host, port), app)
app_server.serve_forever()
Вызовите этот скрипт для запуска приложения, вместо того, чтобы указывать gunicorn или uWSGI, чтобы запустить его.
Я хотел использовать утилиту Flask для создания веб-приложения, но у меня возникли проблемы с его составлением с другими элементами. В конце концов я обнаружил, что gevent.pywsgi.WSGIServer
это было то, что мне нужно. После вызова app_server.serve_forever()
, позвоните app_server.stop()
, когда нужно выйти из приложения.
В моем развертывании мое приложение прослушивает с localhost:port
помощью Flask и gevent, а затем у меня есть HTTPS-запросы Nginx с обратным проксированием.
Ответ №3:
Вам определенно нужно что-то вроде производственного сервера WSGI, такого как Gunicorn, потому что сервер разработки Flask предназначен для простоты разработки без особых настроек для точной настройки и оптимизации. Например, Gunicorn имеет множество конфигураций в зависимости от варианта использования, который вы пытаетесь решить. Но сервер колбы разработки не обладает этими возможностями. Кроме того, эти серверы разработки демонстрируют свои ограничения, как только вы пытаетесь масштабировать и обрабатывать больше запросов.
Что касается необходимости обратного прокси-сервера, такого как Nginx, это зависит от вашего варианта использования. Если вы развертываете свое приложение за новейшим балансировщиком нагрузки в AWS, таким как балансировщик нагрузки приложений(НЕ классический балансировщик нагрузки), этого самого по себе будет достаточно для большинства случаев использования. Не нужно прилагать усилий для настройки NGINX, если у вас есть такая возможность.
Цель обратного прокси-сервера-обрабатывать медленных клиентов, то есть клиентов, которым требуется время для отправки запроса. Эти обратные балансировщики нагрузки буферизуют запросы до тех пор, пока весь запрос не будет получен от клиентов, и отправляют их асинхронно в Gunicorn. Это значительно повышает производительность вашего приложения.