โหลดอัตโนมัติ gunicorn เมื่อเปลี่ยนแหล่งที่มา


113

ในที่สุดฉันก็ย้าย env การพัฒนาของฉันจากรันเนอร์เวอร์ไปยัง gunicorn / nginx

สะดวกในการจำลองคุณลักษณะการโหลดอัตโนมัติของรันเนอร์ไปยัง gunicorn ดังนั้นเซิร์ฟเวอร์จะรีสตาร์ทโดยอัตโนมัติเมื่อมีการเปลี่ยนแปลงแหล่งที่มา มิฉะนั้นฉันต้องรีสตาร์ทเซิร์ฟเวอร์ด้วยตนเองด้วยkill -HUP.

วิธีใดในการหลีกเลี่ยงการรีสตาร์ทด้วยตนเอง?


Errata: ใน env gunicorn ของฉันได้รับการจัดการ / ตรวจสอบโดยหัวหน้างานดังนั้นฉันจะไม่kill -HUPใช้ PID ในกระบวนการ แต่ใช้ Supervisorctl แทน อย่าคิดว่าสิ่งนี้จะเปลี่ยนแปลงไปมากนัก
Paolo

3
github.com/benoitc/gunicorn/issues/154มีวิธีแก้ปัญหาบางอย่าง
KZ

คำตอบ:


232

แม้ว่านี่จะเป็นคำถามเก่า แต่เพื่อความสอดคล้อง - เนื่องจากเวอร์ชัน 19.0 gunicorn มี--reloadตัวเลือก จึงไม่จำเป็นต้องใช้เครื่องมือของบุคคลที่สามอีกต่อไป


5
ตกลง คำตอบอื่น ๆ อาจใช้งานได้ แต่นี่เป็นวิธีที่ง่ายที่สุดและไม่ใช่วิธีแก้ปัญหา มันเป็นสิ่งที่ OP ต้องการ
J-bob

1
ฉันไม่เชื่อว่ามีตัวเลือก - โหลดซ้ำใน gunicorn คุณพบสิ่งนี้ที่ไหน เอกสารของพวกเขาบอกว่าให้โหลดการกำหนดค่าใหม่ส่ง HUP ( killall -HUP procnameจะทำงานได้ดี) เพื่อให้คนงานใหม่เริ่มต้นและคนเก่าปิดตัวลงอย่างสง่างาม
เบา ๆ

3
ขอบคุณ @Guandalino ฉันต้องพลาดแน่ ๆ ที่น่าสนใจคือพวกเขาพูดว่า "การตั้งค่านี้มีไว้สำหรับการพัฒนา" เห็นได้ชัดว่าสิ่งนี้จะใช้ได้กับการผลิตในบางกรณี แต่อาจเป็นปัญหาสำหรับคนอื่น ๆ อีกมากมาย ใช่ฉันเห็นด้านล่างว่าคุณดูเหมือนไม่สนใจในการผลิต / ปรับใช้
เบา ๆ

จะทำอย่างไรในวิธีง่ายๆสำหรับเซิร์ฟเวอร์การผลิต?
juan Isaza

@juanIsaza คุณไม่ควรใช้ฟังก์ชันดังกล่าวในการผลิต หากคุณคิดว่าต้องการ - คุณต้องทบทวนแนวทางใหม่สำหรับการพัฒนาหรือการปรับใช้
Dmitry Ziolkovskiy

20

ทางเลือกหนึ่งคือการใช้--max-requestเพื่อ จำกัด แต่ละกระบวนการที่สร้างขึ้นเพื่อให้บริการเพียงหนึ่งคำขอโดยเพิ่ม--max-requests 1ตัวเลือกการเริ่มต้น ทุกกระบวนการที่สร้างใหม่ควรเห็นการเปลี่ยนแปลงโค้ดของคุณและในสภาพแวดล้อมการพัฒนาเวลาเริ่มต้นเพิ่มเติมต่อคำขอควรมีค่าเล็กน้อย


1
เคล็ดลับที่ดีและสง่างามสำหรับ dev env ไม่สามารถใช้กับ prod ... แต่คุณอาจไม่ต้องการให้ autoreload ใน prod ต่อไปเว้นแต่คุณจะ "ใช้งานแบบต่อเนื่อง" หากคุณทำเช่นนั้นแนวทางของ Bryan Helmigจะดีกว่าแม้ว่าจะต้องใช้pipแพ็คเกจที่สามารถทำได้watchdogก็ตาม
เตาปรุงอาหาร

2
จะใช้เวลาประมาณ 3 วินาทีในการบูตคนงานใหม่ซึ่งช้าเกินไปสำหรับฉัน (กลางปี ​​2552 MBP)
Blaise

11

Bryan Helmigมาพร้อมกับสิ่งนี้และฉันได้แก้ไขเพื่อใช้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, watchdog 0.6, bash 4.2
เตาไฟฟ้า

อย่าลืมใส่ IP หรือ FQDN และพอร์ตของ127.0.0.1:80คุณหากจำเป็น
เตาอบ

1
@Guandalino โชคดีไหม? มันทำงานได้ดีสำหรับฉันมาสองสามสัปดาห์แล้ว เวลาเท่านั้นที่ฉันต้องการที่จะเริ่มต้นใหม่ด้วยตนเองคือเมื่อฉันเปลี่ยนsettings.py, models.py(การโยกย้ายที่จำเป็น) หรือรหัสที่มาของบางแอปภายนอกไม่ได้อยู่ในของฉันwatchmedoรูปแบบ
เตา

ขอบคุณสำหรับการแจ้งเตือน แต่ฉันไม่ต้องการโหวตให้คนอื่นประสบความสำเร็จ ทำไมสิ่งนี้ (ไม่จำเป็น) รีบร้อน? ฉันละเมิดกฎ StackOverflow หรือไม่ ถ้าเป็นเช่นนั้นโปรดแจ้งให้เราทราบวิธีแก้ไข
เปาโล

1
ไม่ต้องห่วง. แน่นอนว่าจะไม่ละเมิดกฎ SO เพียงแค่มีน้ำใจ / เรียกร้อง / มีความคิดที่จะใช้ความพยายาม / ลำดับความสำคัญในการประเมินคำตอบที่เป็นประโยชน์ ดูเหมือนว่า Dave และฉันใช้เวลาอันแสนหวานในการช่วยเหลือคุณ (หลายเดือน) ดังนั้นความรู้สึกเร่งด่วนในการให้คุณตรวจสอบวิธีแก้ปัญหาของเราไม่ได้สัดส่วน - ฉันอยากรู้มากว่ามีข้อบกพร่องที่ซ่อนอยู่ในแบบที่ฉันทำหรือไม่ 'ได้รับการกำหนดค่าเซิร์ฟเวอร์ของฉันและถ้าฉันควรเปลี่ยนไปใช้วิธีการของเดฟ สุขสันต์วันหยุด!
เตา

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และเพิ่มผู้ใช้ใน sudoers อนุญาตให้ทำงาน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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.