미해결
파이썬/장고 웹서비스 개발 완벽 가이드 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 서버 주소
},
},
}