Почему для запуска Flask с Nginx требуется оболочка WSGI?

Итак, из документации Python / Flask они оба рекомендуют не запускать веб-сервер Flask в качестве рабочего веб-сервера, что имеет смысл. У меня вопрос: смогу ли я запустить приложение Flask поверх сервера Nginx? Почему все руководства в Интернете рекомендуют оборачивать Flask вокруг uWSGI, Tornado или какого-либо другого сервера WSGI? Что значит быть WSGI? Разве Flask не совместим с WGSI?

Я особенно заблудился, потому что здесь первый ответ гласит:

Apache и Nginx являются HTTP-серверами. Они могут обслуживать статические файлы, такие как (файлы .jpg и .html), или динамические страницы (например, блог Wordpress или форум, написанный на таком языке, как PHP или Python).

Однако в этом сообщении говорится:

Nginx - это веб-сервер. Он обслуживает статические файлы, но не может выполнять и размещать приложение Python. uWSGI восполняет этот пробел.

Просто кажется неэффективным, чтобы мое приложение обрабатывалось сервером (например, uWSGI), а затем другим сервером (например, Nginx).


person Steven K    schedule 19.11.2014    source источник


Ответы (2)


Nginx - это веб-сервер, который занимается всем, что связано с веб-сервером, а не тем, как запускать программы Python. uWSGI - это сервер приложений, который знает, как использовать WSGI с Python (и теперь на других языках). И Nginx, и uWSGI используют протокол uWSGI, который является эффективным протоколом для сокетов UNIX.

Nginx обрабатывает http-запросы от / ответы к внешнему миру (возможно, балансировка нагрузки, кеширование и т. Д.). Ваше приложение Flask работает с запросами / ответами WSGI. uWSGI знает, как запустить ваше приложение (возможно, с многопроцессорностью и / или многопоточностью) и преодолеть разрыв между HTTP и WSGI.

Существуют и другие HTTP-серверы, помимо Nginx, и другие серверы WSGI, помимо uWSGI, но все они используют один и тот же рабочий процесс: HTTP-сервер переходит к серверу WSGI, который управляет процессом вашего приложения и передает обратно на HTTP-сервер.

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

person davidism    schedule 19.11.2014

Ну, WSGI - это спецификация интерфейса между приложениями Python и веб-серверами. uWSGI - это (проще говоря) реализация этой спецификации, написанная на C / C ++. Вы можете запустить практически любое приложение на «серьезном» веб-сервере (например, nginx), просто указав точку входа:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"]

а затем запустите его так:

uwsgi --http :9090 --wsgi-file file_with_the_code_above.py

Конечно, вы можете вернуть все, что захотите, вместо ["Hello world"]. См. http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html, чтобы узнать больше.

person oopcode    schedule 19.11.2014