автоматичне завантаження при зміні джерела


113

Врешті-решт, я мігрував свою розробку env з runserver на gunicorn / nginx.

Було б зручно копіювати функцію автоматичного завантаження runserver на gunicorn, тому сервер автоматично перезапускається, коли джерело змінюється. Інакше мені доведеться перезапустити сервер вручну kill -HUP.

Будь-який спосіб уникнути ручного перезавантаження?


Errata: у моїй env gunicorn керується / контролюється наглядом, тому я б не дійсно обробляв kill -HUPPID, а використовував натомість supervisorctl. Не думаю, що це сильно зміниться.
Паоло

3
github.com/benoitc/gunicorn/isissue/154 має деякі рішення
KZ

Відповіді:


232

Хоча це старе питання, лише для послідовності - оскільки у версії 19.0 гармати мають --reloadможливість. Тож ніяких сторонніх інструментів більше не потрібно.


5
домовились. Інші відповіді можуть спрацювати, але це, безумовно, найпростіше, і це не обхід. Це саме те, чого хотів ОП.
J-bob

1
Я не вірю, що є варіант перезавантаження, вбудований у гарнікор. Де ти це знайшов? Їх документи кажуть, щоб перезавантажити конфігурацію, надіслати HUP ( killall -HUP procnameбуде добре), щоб почали нових працівників, а старих витончено закрили.
тихо

3
Дякую @Guandalino, я, мабуть, пропустив це. Цікаво зауважити, що вони кажуть: "Цей параметр призначений для розвитку". Це, очевидно, може спрацювати для виробництва в деяких випадках, але також може бути проблематичним для багатьох інших. Так, я бачив нижче, що ви, схоже, незацікавлені у виробництві / розгортанні.
тихо

Як це зробити простим способом для виробничих серверів?
Джуан Ісаза

@juanIsaza ви ніколи не повинні використовувати таку функціональність у виробництві. Якщо ви думаєте, що вам це потрібно - вам потрібно переосмислити свій підхід для розробки або розгортання.
Дмитро Зіолковський

20

Одним із варіантів було б використання --max-запитів, щоб обмежити кожен породжений процес обслуговуванням лише одного запиту шляхом додавання --max-requests 1до параметрів запуску. Кожен щойно породжений процес повинен бачити зміни коду, і в середовищі розробки додатковий час запуску на запит має бути незначним.


1
Приємний, елегантний трюк для dev env. Не можна використовувати в prod ..., але ви, можливо, не хочете автоматичного завантаження в prod, якщо ви не зробите "постійне розгортання". Якщо ви робите, Брайан Helmig в підході краще , навіть якщо це вимагає pipздатного пакета, watchdog.
варильні панелі

2
Для завантаження нового працівника знадобиться ~ 3 секунди, що для мене занадто повільно. (середина 2009 року MBP)
Блез

11

Брайан Гельміг придумав це, і я змінив його для використання, run_gunicornа не для запуску gunicornбезпосередньо, щоб зробити можливість просто вирізати та вставити ці 3 команди в оболонку в кореневій папці проекту django (при цьому активовано ваш virtualenv):

pip install watchdog -U
watchmedo shell-command --patterns="*.py;*.html;*.css;*.js" --recursive --command='echo "${watch_src_path}" && kill -HUP `cat gunicorn.pid`' . &
python manage.py run_gunicorn 127.0.0.1:80 --pid=gunicorn.pid

Просто використовував його на fedora 15 з Django 1.5.4, gunicorn 18.0, сторожовий 0.6, bas 4.2.
варильні панелі

Не забудьте поставити свій IP або FQDN та порт замість 127.0.0.1:80, якщо це потрібно.
варильні панелі

1
@Guandalino, будь-яка удача? У мене це працює вже пару тижнів. Тільки час мені потрібно вручну перезапуск при зміні settings.py, models.py(потрібно міграція), або вихідний код якого - або зовнішнє програми не в моїх watchmedoмоделях.
варильні панелі

Дякуємо за нагадування. Але я не хочу голосувати за успіх інших. Чому це (непотрібно) поспішати? Я порушую якесь правило StackOverflow? Якщо це так, будь ласка, дайте мені знати, як здійснити ремонт.
Паоло

1
Не хвилюйтесь. Очевидно, що не порушувати правило SO, просто уважно / вибагливо / продумано докладати зусиль / пріоритету в оцінці корисних відповідей. Схоже, що Дейв і я взяли милий час, щоб допомогти тобі (багато місяців), тому я почуваю терміновість змусити вас перевірити наші рішення непропорційними - я надто прагну знати, чи є приховані недоліки в тому, як я я налаштував мій сервер, і якщо я повинен перейти на підхід Дейва . Щасливих свят!
варильні панелі

5

Я використовую git push для розгортання у виробництві та налаштування git hooks для запуску сценарію. Перевага такого підходу полягає в тому, що ви також можете одночасно виконати міграцію та встановлення пакунків. https://mikeeverhart.net/2013/01/using-git-to-deploy-code/

mkdir -p /home/git/project_name.git
cd /home/git/project_name.git
git init --bare

Потім створіть сценарій /home/git/project_name.git/hooks/post-receive.

#!/bin/bash
GIT_WORK_TREE=/path/to/project git checkout -f
source /path/to/virtualenv/activate
pip install -r /path/to/project/requirements.txt
python /path/to/project/manage.py migrate
sudo supervisorctl restart project_name

Переконайтеся в цьому chmod u+x post-receiveі додайте користувача до судорів. Дозвольте йому працювати sudo supervisorctlбез пароля. https://www.cyberciti.biz/faq/linux-unix-running-sudo-command-without-a-password/

На своєму локальному сервері / сервері розробки я налаштував, git remoteщо дозволяє мені перейти на виробничий сервер

git remote add production ssh://user_name@production-server/home/git/project_name.git

# initial push
git push production +master:refs/heads/master

# subsequent push
git push production master

Як бонус, ви побачите всі підказки під час виконання сценарію. Тож ви побачите, чи є якась проблема з перезапуском міграції / встановлення пакета / супервізора.


Зауважте, що використовувати shebang, #!/bin/bashяк зазначено вище, замість #!/bin/shякого є post-receiveприклад Git !
curtisp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.