django - channels 배치 (supervisor + daphne + nginx)

3000 단어
프로젝트 에 채 팅 방 기능 이 필요 하기 때문에 websocket 통신 이 필요 합 니 다. 사용 channels 모듈 을 선 택 했 습 니 다. 주로 channels 배치 설정 과 구덩이 가 기록 되 어 있 습 니 다. 원래 프로젝트 는 nginx + uwsgi 를 통 해 배 치 된 것 입 니 다. 여 기 는 변경 되 지 않 았 습 니 다. Nginx 를 통 해 특정한 요청 경 로 를 daphne 에 대리 할 뿐 입 니 다. 배치 전 쌍 django설정 의 일부 수정 은 공식 문 서 를 직접 참고 할 수 있 습 니 다. 이것 은 비교적 간단 하고 문제 가 없습니다.
supervisor + daphne
첫 번 째: 이것 은 제 가 처음에 인터넷 에서 설정 을 찾 은 것 입 니 다. 많은 글 들 이 대체적으로 비슷 합 니 다.
[program:asgi]
directory=/your/path/project-name    #      
command=daphne -b localhost -p 8001 --proxy-headers project-name.asgi:application    #     
autostart=true
autorestart=true
stdout_logfile=/tmp/asgi.log
redirect_stderr=true

주의해 야 할 것 은 프로젝트 가 가상 환경 에서 실행 되 고 슈퍼 visor 가 주 환경 에 설치 되 어 있다 면 daphne 절대 경 로 를 사용 해 야 합 니 다. 이 설정 은 사용 가능 하지만 하나의 프로 세 스 만 실행 할 수 있 는 문제 가 있 습 니 다. 여러 프로 세 스 (추가 numprocs=n 를 열 면 포트 가 차지 하 는 오 류 를 보고 할 수 있 습 니 다.
두 번 째 는 공식 설정 입 니 다. 문서 에서 제공 하 는 설정 은 다 중 프로 세 스 이지 만 작은 문제 가 있 습 니 다. 먼저 제 설정 을 붙 입 니 다.
[fcgi-program:asgi]
socket=tcp://localhost:8001
directory=/my/app/path
#      
command=daphne --fd 0 --access-log - --proxy-headers mysite.asgi:application
###########
numprocs=4
process_name=asgi%(process_num)d
autostart=true
autorestart=true
stdout_logfile=/your/log/asgi.log
redirect_stderr=true

메모: fcgi - program 은 프 록 시 를 만 들 었 습 니 다. 현재 네트워크 요청 의 전달 은 nginx - > 슈퍼 visor - > daphne - > backend - app 입 니 다. 그래서 여기 daphne 에 연 결 된 유 닉 스 - socket 이나 파일 설명 자 는 모두 슈퍼 visor 와 통신 하 는 것 입 니 다. 이것 은 위의 첫 번 째 설정 과 다 릅 니 다.
나 는 -u xxx/xxx.sock 의 설정 항목 을 지 웠 습 니 다. 이 항목 은 필요 하지 않 기 때 문 입 니 다. 명령 행 에서 daphne 의 도움말 을 보 았 습 니 다. 이 두 가지 옵션 이 있 습 니 다. --fd FILE_DESCRIPTOR 옵션 은 파일 설명자 에 연결 되 고 host / port 와 유 닉 스 - socket 에 대한 연결 을 바 꿉 니 다.
메모: 슈퍼 visor: fcgi - program 문서 에 따 르 면 fcgi - program 에 배 치 된 프로그램 은 파일 설명자 0 을 통 해 슈퍼 visor 와 만 통신 할 수 있 습 니 다. 따라서 유 닉 스 - socket 만 사용 하면 유효 하지 않 습 니 다.
nginx
nginx 설정 기본 참조 channels 문서:
upstream channels-backend {
    server localhost:8001;
}
...
server {
    ...
    location /ws/ {
        proxy_pass http://channels-backend;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
    }
    ...
}

(나 는 사실 문서 에 언급 된 try files 의 용법 을 이해 하지 못 했다 - -!)
내 가 만난 작은 문제 중 하 나 는 처음에 슈퍼 바 이 저 설정 에서 127.0.0.1 을 사용 한 다음 에 nginx 에서 localhost 를 사 용 했 는데 연결 이 되 지 않 는 다 는 것 을 알 게 되 었 다. 그 제야 처음으로 그 두 사람 이 차이 가 있다 는 것 을 깨 달 았 다. localhost 의 전송 은 네트워크 카드 나 방화벽 의 제한 을 받 지 않 기 때문에 로 컬 프로그램 간 통신 용 localhost 을 권장 했다.

좋은 웹페이지 즐겨찾기