Есть ли способ развернуть новый код с помощью Tornado / Python без перезапуска сервера?

#python #tornado

#python #tornado

Вопрос:

Недавно я начал экспериментировать с Python и веб-сервером / фреймворком Tornado для веб-разработки. Ранее я использовал PHP с моим собственным фреймворком в стеке LAMP. С PHP развернуть обновленный код так же просто, как загрузить его на сервер, благодаря способу взаимодействия mod_php и Apache.

Когда я добавляю новый код или обновляю код в Python / Tornado, нужно ли мне перезапускать сервер Tornado? Я мог видеть, что это проблематично, если у вас есть несколько активных пользователей.

(a) Должен ли я перезапускать сервер, или есть другой / лучший способ?

(b) Если да, то как я могу избежать отключения пользователей / получения ошибок / и т.д. Во время перезапуска (что может занять несколько секунд)?

[Одна из возможных идей — использовать парадигму перелистывания страниц с Nginx, указывающую на сервер, запустить новый экземпляр сервера с обновленным кодом, перенаправить Nginx туда и отключить исходный сервер …?]

Ответ №1:

Похоже, лучший метод — использовать Nginx с несколькими экземплярами Tornado, как я упоминал в своем первоначальном вопросе и как упоминает Коул. Nginx может перезагрузить свой конфигурационный файл на лету. Итак, процесс выглядит следующим образом:

  1. Обновить код веб-приложения Python / Tornado
  2. Запустите новый экземпляр приложения на другом порту
  3. Обновите файл конфигурации Nginx, чтобы он указывал на новый экземпляр (сначала протестируйте синтаксис файла конфигурации)
  4. Перезагрузите файл конфигурации Nginx с помощью kill -HUP команды
  5. Остановите старый экземпляр веб-сервера Python / Tornado

Пара полезных ресурсов на Nginx, касающихся горячей замены файла конфигурации:

https://calomel.org/nginx.html (в разделе «Объяснение директив в nginx.conf») http://wiki.nginx.org/CommandLine (в разделе «Загрузка новой конфигурации с использованием сигналов»)

Ответ №2:

Используйте HAProxy или Nginx и прокси для нескольких процессов Tornado, которые затем вы можете перезапускать один за другим. Документы Tornado охватывают Nginx, но он не поддерживает websockets, поэтому, если вы используете их, вам понадобится HAProxy.

Комментарии:

1. Итак, например, если у меня есть обратное проксирование Nginx для четырех экземпляров Tornado, и мне нужно обновить базу кода… Я бы перезагружал каждый экземпляр один за другим. Тогда вы предполагаете, что у пользователя будет 1 шанс из 4 получить ошибку «bad gateway», если Nginx попытается отправить их на сервер, который не работает, или есть способ изменить, на какие серверы указывает Nginx (без перезагрузки Nginx)? Спасибо!

2. Вы можете удалить сервер из файла конфигурации, перезагрузить конфигурацию Nginx, перезапустить ее, затем добавить обратно. Теоретически вы не потеряете ни одного запроса. Редактировать: похоже, вы уже нашли это.

Ответ №3:

Вы могли бы использовать переключатель debug = True с веб-экземпляром tornado.

 T_APP = tornado.web.Application(<URL_MAP>, debug=True)
  

Это отражает изменения обработчика по мере их возникновения.

Ответ №4:

Это то, что вы ищете?

Модуль для автоматического перезапуска сервера при изменении модуля. http://www.tornadoweb.org/en/branch2.4/autoreload.html

Ответ №5:

Если вы просто хотите развернуть новый код с помощью tornado / python во время разработки без перезапуска сервера, вы можете использовать realtimefunc декоратор в этом репозитории GitHub.