Назад | Перейти на главную страницу

Изящная перезагрузка веб-приложения

У меня есть приложение 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 секунд для заполнения кеша.

Моя идея развернуть вот так:

  1. Запустите второй Gunicorn с новым кодом, который будет прослушивать другой файл сокета.

  2. Подождите, пока приложение запустится со всеми заполненными кешами.

  3. Переименуйте файл сокета, чтобы он указывал на местоположение, используемое Nginx. Nginx по-прежнему будет отправлять запросы на старый сокет.

  4. Закройте старый Gunicorn со старой версией приложения. Nginx увидит, что сокет закрыт, и снова откроет новый сокет из того же места.

Это сработает?

Я изобретаю велосипед?

То есть Сине-зеленый шаблон развертывания.

Вместо переименования сокетов (шаг 3) у вас может быть две конфигурации nginx (файл сайта или директива серверов с другим именем), синий и зеленый, указывающие на каждый из ваших экземпляров Gunicorn. Затем, когда вы хотите развернуть, просто включите один и отключите другой. в заключение перезагрузка nginx будет корректно обрабатывать все активные соединения.

Вот пример того, что.

Вместо пулемета вы можете взглянуть на uwsgi, который

направлена ​​на разработку полного набора услуг хостинга.

Серверы приложений (для различных языков программирования и протоколов), прокси, менеджеры процессов и мониторы - все реализовано с использованием общего API и единого стиля конфигурации.

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

В настоящее время вы можете писать плагины на C, C ++ и Objective-C.

Часть «WSGI» в названии - дань уважения одноименному стандарту Python, поскольку это был первый разработанный плагин для проекта.

Универсальность, производительность, низкое использование ресурсов и надежность - сильные стороны проекта (и единственные правила, которым следует следовать).

Одна из его функций - выполнение изящные перезагрузки.