Django: Изящно перезапустить сайты nginx + fastcgi, чтобы отразить изменения кода? - PullRequest
1 голос
/ 08 апреля 2010

Распространенная ситуация: у меня на сервере есть клиент, который может обновить часть кода в своем проекте python. Он может ssh в свою оболочку и извлечь из своего репозитория, и все в порядке - но код хранится в памяти (насколько я знаю), поэтому мне нужно фактически завершить процесс fastcgi и перезапустить его, чтобы изменить код. 1001 *

Я знаю, что могу изящно перезапустить fcgi , но я не хочу делать это вручную. Я хочу, чтобы мой клиент обновил код и в течение 5 минут или что-то еще, чтобы новый код выполнялся в процессе fcgi.

Спасибо

1 Ответ

1 голос
/ 08 апреля 2010

Прежде всего, если для вас важно время безотказной работы, я бы посоветовал клиенту сделать это. Это может быть так же просто, как дать ему команду с именем deploy-code. Используя ваш метод, если в их коде есть ошибка, ваш метод требует 10-минутного оборота (читай: время простоя) для его исправления, при условии, что он его исправит.

Тем не менее, если вы действительно хотите это сделать, вы должны создать демон, который будет искать файлы, измененные в течение последних 5 минут. Если он его обнаружит, он выполнит команду перезагрузки.

Код может выглядеть примерно так:

import os, time
CODE_DIR = '/tmp/foo'

while True:
    if restarted = True:
        restarted = False
        time.sleep(5*60)

    for root, dirs, files in os.walk(CODE_DIR):
        if restarted=True:
            break
        for filename in files:
            if restared=True:
                break
            updated_on = os.path.getmtime(os.path.join(root, filename))
            current_time = time.time()
            if current_time - updated_on <= 6 * 60: # 6 min
                # 6 min could offer false negatives, but that's better
                # than false positives
                restarted = True
                print "We should execute the restart command here."
...