В мире Python сушествуют 2 наиболее известных сервера приложений: uWSGI и Gunicorn. Последный это форк рубишного Unicorn на pure python. uWSGI написан на C и казалось бы должен быть супербыстрым, но не всегда. Gunicorn может быть запущен в связке с Gevent, и в этом случае он будет сравним со скоростью работы uWSGI, а в некоторых случаях быстрее. Gevent это библиотека, позволяющая реализовывать “зеленые” потоки. Это такие очень легкие потоки, которые не управляются операционной системой. Проще говоря вы можете писать асинхронные приложения используя синхронный API. Можно провести аналогию с сопрограммами, которые можно остановить во время выполнения, а потом запустить снова (продолжить ее выполнение). Попробуем развернуть обычное Flask веб-приложение на связке nginx + gunicorn + gevent. Поставим Flask
pip install flask
В файле hello.py создадим минимальное Flask приложение:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
Создадим скрипт gevent_run.py для запуска Flask через gevent:
from gevent.wsgi import WSGIServer
from hello import app
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()
Поставим gevent
sudo apt-get install libevent-dev
pip install gevent
Теперь запустим наше приложение через gevent
python gevent_run.py
Установим связку с gunicorn
pip install gunicorn
И запустим
python hello:app -k gevent
Запускать gunicorn вручную не всегда удобно, и тем более следить чтобы он был запущен в системе. Поэтому делать это будем через Supervisor
pip install supervisor
Пример конфиг файла для Supervisor можно взять тут
gunicorn \
-b :8091 -w 1 -k gevent \
--worker-connections=2000 \
--backlog=1000 -p gunicorn.pid \
--log-level=critical hello:app