Spec-Zone.ru › Flask 2.1

Серверы WSGI автономного типа

Большинство серверов WSGI также предоставляют HTTP-серверы, поэтому они могут запускать приложение WSGI и делать его доступным извне.

Возможно, всё же будет хорошей идеей запустить сервер за выделенным HTTP-сервером, таким как Apache или Nginx. Обратитесь к разделу Настройка прокси, если возникнут проблемы с этим.

Gunicorn

Gunicorn — сервер WSGI и HTTP для UNIX. Чтобы запустить приложение Flask, сообщите Gunicorn, как импортировать объект приложения Flask.

$ gunicorn -w 4 -b 0.0.0.0:5000 your_project:app

Опция -w 4 использует 4 работника для одновременной обработки 4 запросов. Опция -b 0.0.0.0:5000 обслуживает приложение на всех интерфейсах на порту 5000.

Gunicorn предоставляет множество опций для настройки сервера, либо через файл конфигурации, либо с помощью командной строки. Используйте gunicorn --help или ознакомьтесь с документацией для получения дополнительной информации.

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

$ gunicorn -w 4 -b 0.0.0.0:5000 "myproject:create_app()"

Асинхронная работа с Gevent или Eventlet

Стандартный синхронный рабочий процесс подходит для многих случаев использования. Если вам нужна асинхронная поддержка, Gunicorn предоставляет рабочих процессов, использующих либо gevent, либо eventlet. Это не то же самое, что и async/await Python или спецификация сервера ASGI.

При использовании gevent или eventlet требуется greenlet>=1.0, в противном случае контекстные переменные, такие как request, не будут работать должным образом. При использовании PyPy требуется PyPy>=7.3.7.

Чтобы использовать gevent:

$ gunicorn -k gevent -b 0.0.0.0:5000 your_project:app

Чтобы использовать eventlet:

$ gunicorn -k eventlet -b 0.0.0.0:5000 your_project:app

uWSGI

uWSGI — быстрый сервер приложений, написанный на C. Он очень настраиваемый, что делает его настройку сложнее, чем Gunicorn. Он также предоставляет множество других утилит для создания надёжных веб-приложений. Чтобы запустить приложение Flask, сообщите Gunicorn, как импортировать объект приложения Flask.

$ uwsgi --master -p 4 --http 0.0.0.0:5000 -w your_project:app

Опция -p 4 использует 4 работника для одновременной обработки 4 запросов. Опция --http 0.0.0.0:5000 обслуживает приложение на всех интерфейсах на порту 5000.

uWSGI имеет оптимизированную интеграцию с Nginx и Apache вместо использования стандартного HTTP-прокси. См. настройка uWSGI и Nginx.

Асинхронная работа с Gevent

Стандартный синхронный рабочий процесс подходит для многих случаев использования. Если вам нужна асинхронная поддержка, uWSGI предоставляет рабочих процессов, использующих gevent. Он также поддерживает другие асинхронные режимы, см. документацию для получения дополнительной информации. Это не то же самое, что и async/await Python или спецификация сервера ASGI.

При использовании gevent требуется greenlet>=1.0, в противном случае контекстные переменные, такие как request, не будут работать должным образом. При использовании PyPy требуется PyPy>=7.3.7.

$ uwsgi --master --gevent 100 --http 0.0.0.0:5000 -w your_project:app

Gevent

Предпочтительнее использовать Gunicorn с рабочими процессами Gevent, а не использовать Gevent напрямую. Gunicorn предоставляет гораздо более настраиваемый и проверенный в работе сервер. Обратитесь к разделу о Gunicorn выше.

Gevent позволяет писать асинхронный, основанный на корутинах код, который выглядит как стандартный синхронный Python. Он использует greenlet для переключения задач без написания async/await или использования asyncio.

Он предоставляет сервер WSGI, который может обрабатывать множество подключений одновременно вместо одного на процесс работника.

Eventlet, описанный ниже, является ещё одной библиотекой, которая делает то же самое. Определённые зависимости или другие соображения могут повлиять на выбор между ними.

Для использования gevent для обслуживания вашего приложения, импортируйте его WSGIServer и используйте его для запуска вашего app.

from gevent.pywsgi import WSGIServer
from your_project import app

http_server = WSGIServer(("", 5000), app)
http_server.serve_forever()

Eventlet

Предпочтительнее использовать Gunicorn с рабочими процессами Eventlet, а не использовать Eventlet напрямую. Gunicorn предоставляет гораздо более настраиваемый и проверенный в работе сервер. Обратитесь к разделу о Gunicorn выше.

Eventlet позволяет писать асинхронный, основанный на корутинах код, который выглядит как стандартный синхронный Python. Он использует greenlet для переключения задач без написания async/await или использования asyncio.

Он предоставляет сервер WSGI, который может обрабатывать множество подключений одновременно вместо одного на процесс работника.

Gevent, описанный выше, является ещё одной библиотекой, которая делает то же самое. Определённые зависимости или другие соображения могут повлиять на выбор между ними.

Для использования eventlet для обслуживания вашего приложения, импортируйте его wsgi.server и используйте его для запуска вашего app.

import eventlet
from eventlet import wsgi
from your_project import app

wsgi.server(eventlet.listen(("", 5000), app)

Twisted Web

Twisted Web — веб-сервер, поставляемый с Twisted, зрелой, неблокирующей, управляемой событиями библиотекой сетевого программирования. Twisted Web поставляется со стандартным контейнером WSGI, который можно управлять из командной строки с помощью утилиты twistd.

$ twistd web --wsgi myproject.app

Этот пример запустит приложение Flask под названием app из модуля под названием myproject.

Twisted Web поддерживает множество флагов и опций, и утилита twistd также; см. twistd -h и twistd web -h для получения дополнительной информации. Например, чтобы запустить сервер Twisted Web в фоновом режиме на порту 8080 с приложением из myproject:

$ twistd -n web --port tcp:8080 --wsgi myproject.app

Настройка прокси

Если вы развертываете приложение с помощью одного из этих серверов за HTTP-прокси, вам потребуется переписать несколько заголовков для работы приложения. Две проблемные значения в среде WSGI обычно — REMOTE_ADDR и HTTP_HOST. Вы можете настроить свой httpd для передачи этих заголовков или исправить их в программном обеспечении среднего уровня. Werkzeug поставляет инструмент для исправления некоторых распространённых ситуаций, но вам, возможно, потребуется написать собственный WSGI-средний уровень для конкретных случаев.

Вот простая конфигурация nginx, которая выполняет проксирование к приложению, обслуживаемому на localhost по порту 8000, устанавливая соответствующие заголовки:

server {
    listen 80;

    server_name _;

    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        proxy_pass         http://127.0.0.1:8000/;
        proxy_redirect     off;

        proxy_set_header   Host                 $host;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto    $scheme;
    }
}

Если ваш httpd не предоставляет эти заголовки, наиболее распространённая настройка устанавливает хост из X-Forwarded-Host и удалённый адрес из X-Forwarded-For:

from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)

Доверие к заголовкам

Пожалуйста, помните, что использование такого middleware вне контекста прокси является проблемой безопасности, так как оно будет слепо доверять входящим заголовкам, которые могут быть подделаны вредоносными клиентами.

Если вы хотите переписать заголовки из другого заголовка, вы можете использовать инструмент исправления, подобный этому:

class CustomProxyFix(object):

    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        host = environ.get('HTTP_X_FHOST', '')
        if host:
            environ['HTTP_HOST'] = host
        return self.app(environ, start_response)

app.wsgi_app = CustomProxyFix(app.wsgi_app)

© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.1.x/deploying/wsgi-standalone/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API