2017-04-17 1 views
0

나는 Anpite 플레이 북을 사용하여 만든 Django/Gunicorn/Nginx 웹 사이트를 가지고 있습니다. 현재 새로운 기능을 추가하거나 버그를 수정하고 장고 코드를 다시로드하려고 할 때마다 실행해야하는 작업을 내 플레이 북에서 태그 지정하는 중입니다. 내 목표는 프로덕션 서버를 다운시키지 않고 준비 서버에서 테스트 한 즉시 그러한 변경을 프로덕션으로 보낼 수있게하는 것입니다.500 서버 오류없이 Django 웹 사이트를 다시로드 하시겠습니까?

내 플레이 북은 현재 프로덕션으로 변경 사항을 푸시 할 때마다 전체 웹 사이트 디렉토리를 삭제하고 Pip 가상 환경을 다시 작성하여 남은 "cruft"가 없도록합니다. 문제는 Anabilities 게임을 실행할 때 웹 사이트 디렉토리를 삭제할 시점에 순간 500 서버 오류가 발생한다는 것입니다. 그런 다음 Github에서 코드를 체크 아웃하는 다음 작업이 실행되면 오류가 사라집니다. 분명히, 내가 코드베이스를 다시로드 할 때마다, 어떤 사용자가 작업이 실행되는 순간에 내 웹 사이트를 때리면이 500 오류도 발생합니다. 일단 Gunicorn이 시작되고 장고 코드가 메모리에로드되면 코드를 삭제하고 다시로드하고 서비스 중단없이 Gunicorn을 다시 시작할 수 있다고 생각했습니다. 이 다른 Stackover question은 그럴 것 같습니다. 그러나, 나의 테스트는 달리 지적한다.

클라이언트 브라우저가 장고에 요청을 보내면 장고는 모든 .pyc 파일을 메모리에 다시로드합니까? 이 문제의 원인은 무엇입니까? 이전 코드를 삭제하는 작업을 제거하지 않고 장고 코드를 다시로드 할 때이 일시적인 정전을 방지 할 수있는 방법이 있습니까?

은 여기 내 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

왜 저장소를 삭제 하시겠습니까? 자식은 부실 파일 삭제를 처리해야합니다. 남은 것은 무엇입니까? 부실 pip 패키지? –

+0

새로운 코드베이스에서 시작했는지 확인하려면 최상위 웹 사이트 디렉토리의 모든 것을 삭제하는 것이 가장 좋을 거라는 제 믿음이었습니다. 나는 YouTube에서 발견 한 링컨 루프 (Lincoln Loop)의 "Django Deployments Done Right"라는 조언에 충실하려고 노력했습니다. Git이 새로운 디렉토리를 체크 아웃 할 때 존재하지 않는 모든 파일을 내 디렉토리에서 제거 할 수도 있다고 생각하지 않았습니다. 그러나 아직도, 왜이 문제를 할 것입니까? 어쨌든 모든 것이 기억에 남아 있지 않습니까? Gunicorn을 다시로드 할 때까지 웹 사이트에서 디스크를 보는 이유는 무엇입니까? – William

+0

로드 밸런서에서이를 처리하십시오. – browskie

답변

0

해결 방법 : 이 장고 루트 디렉토리 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 작업을 사용하여 시스템에서 이전 버전을 제거 할 수 있습니다.

더 많은 설명이 필요하면 알려주세요.

관련 문제