2017-04-17 89 views
0

我有一个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 
+0

为什么要删除存储库? Git应该处理删除陈旧的文件。剩下的是什么?陈旧的点子包? –

+0

我相信,最好是删除顶级网站目录中的所有内容,以确保我从新的代码库开始。我试图坚持在YouTube上发布林肯循环讲座“Django Deployments Done Right”给出的建议。我并没有停下来考虑Git可能会从我的目录中删除所有在检出新目录时不存在的文件。但是,为什么要这么做呢?无论如何,这不是记忆中的一切吗?为什么网站一直在查看磁盘,直到我重新加载Gunicorn? – William

+0

在负载平衡器处理此操作。 – browskie

回答

0

解决方案:让你的Django根目录下的SYMB链接。

让我详细解释我的解决方案。确保您的代码根目录是提供流量的实际版本代码的符号链接。在部署期间,您的可靠脚本将基本上创建一个新的虚拟环境,并安装这些需求。并将代码拖到新名称中应该有当前时间戳的目录中。你可以做任何你需要做的事情来做好准备,为交通提供服务。然后在最后一步中,您只需将django根目录链接指向新位置即可。

/home/ubuntu/project/current -> /home/ubuntu/project/releases/145678/ 
/home/ubuntu/project/releases/123456/ 
/home/ubuntu/project/releases/134567/ 
/home/ubuntu/project/releases/145678/ 

在上述目录结构中,您可以将当前指向其中一个版本。通过每个新部署,您都可以创建一个新版本,然后将当前指向新版本目录。

之后,您可以重新启动您的gunicorn以刷新新代码库中的设置。

您可以通过cron作业从机器中删除旧版本。

让我知道你是否需要更多的澄清。

相关问题