我有一个Django/Gunicorn/Nginx网站,我使用Ansible playbook构建。我目前正在为我的剧本中的这些任务添加标签,这些任务需要在添加新功能或修复错误并希望重新加载我的Django代码时运行。我的目标是一旦在测试服务器上测试了这些更改,就可以将这些更改推送到生产环境,而无需关闭生产服务器。重新加载Django网站没有500服务器错误?
我的剧本目前已设置好,无论何时我想将更改推送到制作时,它都会删除整个网站目录并重建Pip虚拟环境,以便没有残留的“残余”。问题是,当我运行Ansible手册时,在它删除网站目录时,出现瞬间500服务器错误。然后,一旦检测到Github代码的下一个任务运行,错误就会消失。显然,无论何时我重新加载我的代码库,如果有任何用户在任务运行的时候点击我的网站,他们也会得到这个500错误。我一直在想,一旦Gunicorn启动并且我的Django代码被加载到内存中,我可以删除并重新加载我的代码并重新启动Gunicorn,而不会中断服务。这其他Stackover question似乎应该是这样。但是,我的测试表明否则。
当客户端浏览器向Django发送请求时,Django是否将所有.pyc文件重新加载到内存中?这是什么原因造成这个问题?有没有什么办法来防止这种暂时中断,当我重新加载我的Django代码而不删除删除旧代码的任务?
下面是我Ansible剧本节选:
- name: configure web server
hosts: webservers
gather_facts: True
tasks:
# This task causes momentary 500 server error
- name: delete any existing project repo
file: >
path={{ repo_path }}
state=absent
tags: reload
- name: check out {{ repo_version }} of Github repo
git: >
repo={{ repo_url }}
version={{ repo_version }}
dest={{ repo_path }}
accept_hostkey=yes
register: checkout
until: checkout|success
retries: 5
delay: 10
become: true
become_user: "{{ me }}"
tags: reload
# ... more tasks
- name: install python packages into virtual environment
pip: >
requirements={{ repo_path }}/requirements/{{ server_tier }}.txt
state=present
virtualenv={{ venvs_path }}/{{ commit_hash }}
tags: reload
# ... more tasks
- name: reload gunicorn
command: pkill -HUP gunicorn
become: true
become_user: root
tags: reload
为什么要删除存储库? Git应该处理删除陈旧的文件。剩下的是什么?陈旧的点子包? –
我相信,最好是删除顶级网站目录中的所有内容,以确保我从新的代码库开始。我试图坚持在YouTube上发布林肯循环讲座“Django Deployments Done Right”给出的建议。我并没有停下来考虑Git可能会从我的目录中删除所有在检出新目录时不存在的文件。但是,为什么要这么做呢?无论如何,这不是记忆中的一切吗?为什么网站一直在查看磁盘,直到我重新加载Gunicorn? – William
在负载平衡器处理此操作。 – browskie