Подробное руководство по развертыванию сервисов Python с помощью Nginx+Gunicorn+Flask+Supervisor!

Python

Хотя в заголовке написано Flask, следующее руководство применимо не только к Flask, но и к другим веб-фреймворкам Python.

Как мы все знаем, Flask — это синхронный фреймворк, при обработке запросов это единый процесс, когда к нему одновременно обращается слишком много людей, сервис Flask блокируется.

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

Поэтому производительность веб-сервера Flask, Django, webpy и других фреймворков очень низкая и может использоваться только в целях тестирования.Для публикации в Интернете вам необходимо выбрать более производительный сервер wsgi. Рекомендуемый метод развертывания здесь: nginx + gunicorn + flask + супервизор.

Значение каждого из этих сервисных представителей следующее:

  • Nginx: высокопроизводительный веб-сервер + балансировка нагрузки;

  • gunicorn: высокопроизводительный сервер WSGI;

  • gevent: библиотека для преобразования синхронного кода Python в асинхронные сопрограммы;

  • Supervisor: Инструмент для мониторинга сервисных процессов;

Вот картинка, чтобы дать вам более интуитивное ощущение

image

Gunicorn

Gunicorn может указать несколько рабочих процессов, и вы можете выбрать один из нескольких режимов работы. По умолчанию используется синхронный режим синхронизации, в дополнение к gevent, tronado, gthread, gaiohttp и т. д.

Здесь рекомендуется Gevent, gevent — это библиотека на основе Greenlet, реализованная с использованием сопрограмм Python, чтобы ваш веб-сервис мог выполнять параллельные функции!

Я уже писал статью о gunicorn, нажмите, чтобы просмотреть подробное руководство по использованию!

Как создать высокопроизводительный веб-сервис?

Nginx

На самом деле Nginx может обрабатывать только статические запросы ресурсов, так что же делать с динамическими запросами. Это требует использования NginxupstreamМодуль пересылает эти запросы, то есть обратный прокси. Nginx в основном используется здесь для балансировки нагрузки и может кэшировать некоторый динамический контент.

установить нгинкс

Команда установки выглядит следующим образом:

sudo apt-get install nginx

После установки nginx мы можем управлять открытием и закрытием nginx с помощью следующих команд.

sudo /etc/init.d/nginx restart // 重启sudo /etc/init.d/nginx start 开启
sudo /etc/init.d/nginx stop 关闭

настроить nginx

Файл конфигурации Nginx находится в /usr/local/nginx/conf/nginx.conf.

server {
    listen     8080; # 监听8080端口,可以自行配置
    server_name localhost; # 配置域名

    # 动态请求转发到 9600 端口(gunicorn):
    location / {
        proxy_pass   http://127.0.0.1:9600;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_read_timeout 300;
       proxy_send_timeout 300;
    }
}

Сохраните после модификации и перезапустите nginx.

Supervisor

установить супервайзер

Команда выглядит следующим образом:

pip install supervisor

Инициализируйте файл конфигурации:

echo_supervisord_conf > supervisor.conf

Измените файл конфигурации и добавьте соответствующую конфигурацию внизу файла конфигурации.

[include] 自己的项目配置  
[program:project]  
directory = /home/jerry/Code/project       ; 程序的启动目录  
command = /home/jerry/.virtualenvs/parsing/bin/gunicorn -w 4 -worker-class gevent -bind 0.0.0.0:9600 app:app  ; 启动命令

numprocs=1           ; number of processes copies to start (def 1)   
autostart = true     ; 在 supervisord 启动的时候也自动启动   
startsecs = 1        ; 启动 1 秒后没有异常退出,就当作已经正常启动了   
autorestart = true   ; 程序异常退出后自动重启   
startretries = 3     ; 启动失败自动重试次数,默认是 3   
user = root          ; 用哪个用户启动   
redirect_stderr = true          ; 把 stderr 重定向到 stdout,默认 false   
stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默认 50MB   
stdout_logfile_backups = 10     ; stdout 日志文件备份数 
stdout_logfile=/home/jerry/Code/project/log/gunicorn.log       ; log 日志
stderr_logfile=/home/jerry/Code/project/log/gunicorn.error     ; 错误日志

Сохраните после редактирования и запустите супервизор. Команда запуска здесь такая же, как и команда, запущенная с помощью gunicorn в командной строке, где -w относится к количеству процессов службы.Подробные команды см. В статье, которую я написал ранее.

основные команды

Запуск супервизора через конфигурационный файл

supervisord -c supervisor.conf 

Посмотреть статус супервайзера

supervisorctl -c supervisor.conf status 

Перезагрузите файл конфигурации, не забывайте перезагружать после каждой модификации

supervisorctl -c supervisor.conf reload

Запустить программный процесс, управляемый указанными/всеми супервайзерами

supervisorctl -c supervisor.conf start [all]|[appname]

Закрыть указанные/все программные процессы, управляемые супервизором

supervisorctl -c supervisor.conf stop [all]|[appname]

на этот раз черезhttp://127.0.0.1:8080Вы можете получить доступ к своему приложению!Если вы хотите узнать, как оно работает, вы можете протестировать его самостоятельно, например, добавив сон в код, или самостоятельно написать скрипт-тест!

Рекомендуемое чтение

Как создать высокопроизводительный веб-сервис?

Статья для понимания взаимосвязи между веб-фреймворком Python и веб-сервером.

Механизм и приложение Flask blueprint

Несколько способов динамического отображения данных диаграммы Pyecharts с помощью Flask