묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실리콘밸리 엔지니어가 가르치는 파이썬 장고 웹프로그래밍
channels alternative?
강의에서는 공식문서 참고해서 daphne기반의 장고 채팅 앱을 구현했는데, gunicorn, uvucorn 등의 다른 asgi server 를 사용해서 channels를 이용하는데 문제 없을까요? 검색해서 확실한 답변을 찾기가 어려웠습니다.장고 4부터 공식적으로 async기능을 지원해서 channels없이도 websocket을 이용한 비동기로 정보를 주고 받는게 가능한 것으로 알고 있습니다. gunicorn 기반의 웹소켓 어플리케이션을 구현하는 예제를 보면 간단한 정보를 주고 받는 정도는 쉽게 가능 할 것 같지만, 챗 앱에 필요한 기능을 구현하기에는 channels을 사용하는 것에 비교해서 많은 시간을 요하며, channels layer처럼 multi server에 대응해서 chnnels group형태를 구현하기 막막해 보입니다. channels이외에 다른 장고 웹소켓용 유용한 패키지가 있을까요? 특히 cookiecutter-django와 호환 되었으면 좋겠습니다.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
nginx, gunicorn, daphne 기반 배포 관련하여 질문 좀 드릴게요
안녕하세요~현재까지 공개된 강의 내용과 무관한 질문이지만, 도통 문제 해결 방향을 잡지 못하고 있어 글 남겨 봅니다. ><DRF, Channels, React로 만든 앱을 nginx, gunicorn, daphne 기반으로 배포하려는데, 막힌 지점에서 벗어나질 못하고 있습니다 ㅜnginx, gunicorn, daphne 모두 정상적으로 동작하고 있는 것 같은데, nginx 설정 파일에 등록한 127.0.0.1로 접속하면 "사이트에 연결할 수 없음, 127.0.0.1에서 연결을 거부했습니다"라는 화면이 나옵니다.문제 해결을 위해 추가적으로 살펴봐야 부분에 관해 조언을 해주신다면 너무 감사드리겠습니다!한 가지 찝찝한 부분은, react오 django 프로젝트 폴더를 담고 있는 폴더의 경로는 home/kiwitter인데 home/ubuntu/kiwitter/처럼 현재 제 우분투 환경의 사용자를 중간에 추가해야 진행 시 오류가 발생하지 않더라고요. 가상환경 사용과 관련있는 것 같은데, 어쨌든 그래서 경로 입력 시 home/ubuntu/kiwitter/처럼 중간에 사용자명을 추가하는 방식을 사용하고 있는데, 혹시 지금 문제가 이것과 관련이 있을까 싶어 말씀드립니다.배포 시 React와 Django 프로젝트가 정상적으로 동작하는지 각각 따로 확인하는 방법이 있을까요? Django도 지금처럼 http와 웹소켓으로 클라이언트 요청이 들어오는 경우에 각각의 동작 여부를 개별적으로 살펴볼 수 있는 방법이 있나요? 배포 관련 지식이 없는 데다 하나씩 단계적으로 정상 동작 여부를 점검하지도 못하니 배포의 늪에서 벗어나는 게 더 힘드네요,,파이썬 사랑방에는 모든 게시물이 관리자의 승인을 받아야 되나요? 아니면 가령 일정 등급 이상이 되면 승인 없이 게시물을 자유롭게 올릴 수 있나요? 여기서 질문 드린 부분을 처음에는 페북 파이썬 사랑방 그룹에 질문했었는데 관리자의 검토가 필요하다는 안내를 보고 궁금해서 여쭤봅니다. ✔ 프로젝트 폴더 구조(venv) ubuntu@Ubuntu:~/kiwitter$ ├── kiwitter_backend │ ├── chats │ ├── db.sqlite3 │ ├── kiwitter_backend │ ├── kiwitter.sock │ ├── log │ ├── manage.py │ ├── secrets.json │ ├── staticfiles │ ├── tweets │ └── users ├── kiwitter_frontend │ ├── build │ ├── node_modules │ ├── package.json │ ├── package-lock.json │ ├── public │ ├── README.md │ └── src ├── requirements.txt └── venv ├── bin ├── include ├── lib ├── lib64 -> lib └── pyvenv.cfg ✔ nginx, gunicorn, daphne 동작 상태<sudo systemctl status nginx 명령어 출력 결과><ps aux | grep gunicorn의 출력 결과><ps aux | grep daphne의 출력 결과>✔ nginx, gunicorn, daphne 관련 설정 파일</etc/nginx/sites-available/kiwitter>upstream django_server { server unix:/home/ubuntu/kiwitter/kiwitter_backend/kiwitter.sock; # Gunicorn 소켓 파일 위치 } upstream channels_layer { server localhost:6379; # Daphne 서버 주소 및 포트 } server { listen 80; server_name 127.0.0.1; # 실제 도메인 또는 공용 IP 주소로 변경 # React 앱이 위치한 경로 location / { root /home/ubuntu/kiwitter/kiwitter_frontend/build/; try_files $uri $uri/ /index.html; } location = /favicon.ico { access_log off; log_not_found off; } location /static/ { alias /home/ubuntu/kiwitter/kiwitter_backend/staticfiles/; # STATIC_ROOT 경로 } location /media/ { alias /home/ubuntu/kiwitter/kiwitter_backend/media/; # MEDIA_ROOT 경로 } # API 요청을 Django로 프록시 location /api/ { proxy_pass http://django_server; proxy_set_header Host $http_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-Proto $scheme; } # Django admin 페이지 및 기타 Django 경로 location /admin/ { proxy_pass http://django_server; proxy_set_header Host $http_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-Proto $scheme; } # WebSocket 요청 처리를 위한 설정 location /ws/ { proxy_pass http://channels_layer; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }</etc/systemd/system/gunicorn.service>[Unit] Description=gunicorn daemon After=network.target [Service] User=ubuntu Group=www-data WorkingDirectory=/home/ubuntu/kiwitter/kiwitter_backend ExecStart=/home/ubuntu/kiwitter/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/kiwitter/kiwitter_backend/kiwitter.sock kiwitter_backend.wsgi:application [Install] WantedBy=multi-user.target</etc/supervisor/conf.d/channels.conf>[fcgi-program:asgi] socket=tcp://localhost:8000 directory=/home/ubuntu/kiwitter/kiwitter_backend command=/home/ubuntu/kiwitter/venv/bin/daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers kiwitter_backend.asgi:application numprocs=2 process_name=asgi%(process_num)d autostart=true autorestart=true stdout_logfile=/home/ubuntu/kiwitter/kiwitter_backend/log/asgi.log redirect_stderr=true✔ Django settings.py... 생략 ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '').split(',') # .env 관련 부분 -> ALLOWED_HOSTS=127.0.0.1,localhost ... 생략 CSRF_TRUSTED_ORIGINS = [ 'http://127.0.0.1:8000', 'http://127.0.0.1', 'http://localhost:8000', 'http://localhost', ] ... 생략 CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { "hosts": [('127.0.0.1', 6379)], # Redis 서버 주소 }, }, }