Безопасен ли сервер в комплекте с Flask для использования в производстве?

Безопасен ли сервер в комплекте с Flask для развертывания в производственной среде? Если нет, что мне использовать для развертывания Flask в производстве?


person ensnare    schedule 04.09.2012    source источник
comment
Этот ответ дает более широкий контекст этой проблемы, и объясняет, почему нельзя использовать сервер в комплекте с Flask.   -  person Basj    schedule 11.04.2018


Ответы (3)


Нет. Связанный сервер является сервером разработки. Он не разработан с учетом производственной среды.

  • По умолчанию он не будет обрабатывать более одного запроса за раз.
  • Если вы оставляете режим отладки включенным и появляется всплывающая ошибка, она открывает оболочку, которая позволяет выполнять произвольный код на вашем сервере (подумайте os.system('rm -rf /')).
  • Сервер разработки плохо масштабируется.

Flask использует сервер разработки Werkzeug, и в документации говорится то же самое:

Сервер разработки не предназначен для использования в производственных системах. Он был разработан специально для целей разработки и плохо работает при высокой нагрузке. Настройки развертывания см. на страницах Application Deployment.

Рекомендуемый подход — использовать рабочий сервер WSGI для запуска вашего Flask. заявление. В документации есть целый раздел, посвященный развертыванию: Параметры развертывания.

Развернуть ваше приложение так же просто, как установить сервер WSGI, такой как uWSGI или gunicorn, и запустить его вместо сервера разработки Flask:

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app

Если вы обслуживаете какие-либо статические ресурсы, такие как изображения или видео, нуждаетесь в низкоуровневом кэшировании или имеете более высокие требования к параллелизму, рекомендуется использовать веб-сервер, например nginx и пусть он обрабатывает все ваши запросы.

В дрянной форме ASCII:

                +----------+
                | Client 2 |
                +----------+
                      |
                      V 
+----------+      +-------+      +----------+
| Client 1 |----->| nginx |<-----| Client 3 |
+----------+      +-------+      +----------+
                      ^
                      |
                      V
           /--------------------\
           | useful nginx stuff |
           | like asset serving |
           | and rate limiting  |
           \--------------------/
                      |
                      V
               +-------------+
               | WSGI server |
               +-------------+

Чтобы фактически запустить серверный процесс WSGI, вы можете использовать Supervisor. Он автоматически перезапускает сервер, если он по какой-то причине выходит из строя, ведет журналы и работает как демон, поэтому ваша служба запускается при загрузке сервера.

person Blender    schedule 04.09.2012
comment
Я использую supervisor + gunicorn + nginx. Это действительно легко настроить и поддерживать. - person Anton Egorov; 14.10.2013
comment
Он не будет обрабатывать более одного запроса за раз — неправда, см. аргументы потоков и процессов: werkzeug.pocoo.org/docs/0.11/serving - person HaveAGuess; 13.01.2016
comment
если появляется ошибка, она открывает оболочку, которая позволяет выполнять произвольный код на вашем сервере - разве это не режим debug=True? - person HaveAGuess; 13.01.2016
comment
@HaveAGuess: исправлено. Однако по умолчанию сервер не будет многопоточным. Эти аргументы нигде не упоминаются в документах Flask, поэтому вам нужно посмотреть документацию Werkzeug, которая, я думаю, требует больше работы, чем большинство людей. - person Blender; 14.01.2016
comment
@HaveAGuess: Из развертывания flask doc: встроенный сервер Flask не подходит для производства, так как он плохо масштабируется и по умолчанию обслуживает только один запрос за раз. - person mvarge; 29.06.2016
comment
@mvarge согласился, но мы масштабировали его до нескольких процессов без проблем для обработки нескольких запросов для внутреннего производственного приложения. Теперь мы используем Apache для внешней экспозиции. - person HaveAGuess; 07.07.2016
comment
@Blender Извините за беспокойство. Я пишу пост о Werkzeug, и у меня есть несколько глупых вопросов. Является ли сервер, предоставляемый Werkzeug, похожим на Gunicorn по функциональности? Могу ли я назвать это сервером WSGI? - person Grey Li; 27.09.2017
comment
@GreyLi: Да, оба сервера WSGI. Вот почему вы можете заменить сервер разработки на рабочий сервер без каких-либо изменений кода. - person Blender; 27.09.2017
comment
1) По умолчанию он не будет обрабатывать более одного запроса за раз => можно изменить с помощью опции threaded. 2) Если вы оставляете режим отладки включенным и появляется всплывающая ошибка, он открывает оболочку, которая позволяет выполнять произвольный код => это можно легко отключить с помощью нескольких строк кода. 3) Сервер разработки плохо масштабируется. =› тест (если у кого-то есть) было бы интересно добавить конкретные факты, чтобы помочь людям понять, почему связанный сервер действительно так плох. Я доверяю вам, но все, кажется, повторяют это без источника. - person Basj; 11.04.2018
comment
@Basj: я бы считал людей, которые написали сервер разработки, каноническим источником. Рекомендации по развертыванию общего назначения пытаются решить распространенный вариант использования, который представляет собой развертывание общедоступной веб-службы. Можете ли вы обойтись без использования сервера разработки для веб-сервиса с низким трафиком? Конечно, но зачем тратить усилия на то, чтобы превратить сервер разработки в почти рабочий сервер, когда pip install uwsgi && uwsgi --http :8000 -w yourapp:app работает так же хорошо и фактически адаптирован для этого варианта использования? - person Blender; 11.04.2018
comment
Ссылка @Haveaguess для меня недоступна, но варианты обслуживания WSGi см. здесь: werkzeug.palletsprojects .com/en/1.0.x/serving. Другой альтернативой использованию сервера разработки является запуск приложения Flask как службы с systemd, nginx proxy и gunicorn: edmondchuc.com/ - person SeanQuinn781; 06.09.2020

В принципе, нет. Встроенный сервер разработки небезопасен для развертывания в производственной среде.

Встроенный сервер разработки предназначен именно для этого. Для использования в рабочей среде вы должны выполнить один из шагов, подробно описанных здесь.

К ним относятся различные серверы, реализующие спецификацию WSGI, такие как Apache/mod_wsgi или один из этих автономных серверов wsgi. http://flask.pocoo.org/docs/deploying/wsgi-standalone/

Также есть uWSGI и FastCGI доступны параметры

person olly_uk    schedule 04.09.2012
comment
Можно ли получить обновление 2014 года для этого ответа? По сути, ответ «нет» неоднозначен, так как +ensnare задает два вопроса. - person root-11; 13.04.2014
comment
обновленный ответ, чтобы устранить двусмысленность. остальная часть ответа по-прежнему кажется совершенно действительной. ссылки по-прежнему указывают на последние документы фляги. - person olly_uk; 14.04.2014

Хотя легкий и простой в использовании, встроенный сервер Flask не подходит для производства, поскольку он плохо масштабируется и по умолчанию обслуживает только один запрос за раз. http://flask.pocoo.org/docs/0.12/deploying/

person MasterEffect117    schedule 17.08.2017