У меня есть приложение WSGI Python, работающее через Gunicorn:
CONFIG = {
'bind': "unix:{}".format(os.path.join(RUN_DIR, "brain.sock")),
'preload_app': False,
# supervisord requires that the child process runs in foreground
'daemon': False,
...
}
Он получает HTTP-запросы через файл сокета от Nginx:
server {
...
location / {
proxy_pass http://unix:$root/run/brain.sock:;
...
}
Gunicorn запускается через Supervisord:
[program:myapp]
command = venv/bin/gunicorn -c gunicorn.conf.py myapp.wsgi:application
...
Я думаю о том, как развернуть свое приложение без простоев и ожидания. Каждому исполнителю может потребоваться до 30 секунд для заполнения кеша.
Моя идея развернуть вот так:
Запустите второй Gunicorn с новым кодом, который будет прослушивать другой файл сокета.
Подождите, пока приложение запустится со всеми заполненными кешами.
Переименуйте файл сокета, чтобы он указывал на местоположение, используемое Nginx. Nginx по-прежнему будет отправлять запросы на старый сокет.
Закройте старый Gunicorn со старой версией приложения. Nginx увидит, что сокет закрыт, и снова откроет новый сокет из того же места.
Это сработает?
Я изобретаю велосипед?
То есть Сине-зеленый шаблон развертывания.
Вместо переименования сокетов (шаг 3) у вас может быть две конфигурации nginx (файл сайта или директива серверов с другим именем), синий и зеленый, указывающие на каждый из ваших экземпляров Gunicorn. Затем, когда вы хотите развернуть, просто включите один и отключите другой. в заключение перезагрузка nginx будет корректно обрабатывать все активные соединения.
Вот пример того, что.
Вместо пулемета вы можете взглянуть на uwsgi, который
направлена на разработку полного набора услуг хостинга.
Серверы приложений (для различных языков программирования и протоколов), прокси, менеджеры процессов и мониторы - все реализовано с использованием общего API и единого стиля конфигурации.
Благодаря подключаемой архитектуре его можно расширить для поддержки большего количества платформ и языков.
В настоящее время вы можете писать плагины на C, C ++ и Objective-C.
Часть «WSGI» в названии - дань уважения одноименному стандарту Python, поскольку это был первый разработанный плагин для проекта.
Универсальность, производительность, низкое использование ресурсов и надежность - сильные стороны проекта (и единственные правила, которым следует следовать).
Одна из его функций - выполнение изящные перезагрузки.