▶로컬 서버
cmd/terminal 어디서든 로컬 서버 실행하는 커멘드를 입력할 수 있다.
이번에 오랜만에 서버를 열어보면서 vsc나 pycharm이 없는 pc로 서버를 열어야 하는 상황이라,
cmd창을 이용해서 로컬 서버를 열었다.
사실, terminal에서 커멘드를 입력해서 하는 거랑 큰 차이가 없었다.
서버를 열 때 폴더 위치는 manage.py가 있는 위치가 기본이다.
cd {manage.py 파일 위치 폴더}
mamage.py가 있는 폴더로 이동을 먼저 해주어야 한다.
이후,
python manage.py runserver localhost:{port}
python manage.py runserver 127.0.0.1:{port}
python manage.py runserver 0.0.0.0:{port}
runserver를 할 때, localhost나 127.0.0.1로 실행하면 로컬에서만 접근 가능하다.
외부에서도 접근 가능하도록 하려면 ip를 0.0.0.0으로 옵션을 설정하고 커멘드를 입력해야 한다.
runserver를 이용해서 서버를 여는 경우에는 보안에 취약한 경우가 있어서,
0.0.0.0을 이용해 외부 접근을 허용하려면 특정 IP 혹은 도메인을 지정하는 것이 좋다.
settings.py 파일에 가면 ALLOWED_HOSTS를 직접 설정할 수 있다.
기본은 '*'로 설정되어 있다.
모든 IP 혹은 도메인에 허용한다는 의미이므로, 적절히 설정해주어야 한다.
ALLOWED_HOSTS = ['*']
runserver를 하면 ' Starting development server at ~~'라는 문구가 뜨는 것을 확인할 수 있다.
그러면 http://localhost:{port}/ 혹은 해당 IP를 입력해서 접속하면 접근 가능하다.
이때 urls.py파일을 확인해보아야 한다.
/ 이후에 경로를 직접 지정해주어야 하는데,
urlpatterns = [
path('admin/', admin.site.urls),
path('home/', views.home), # /home 경로 추가
]
이런 경우에는 path에 ''가 없기에 http://localhost:{port}/ 이렇게 접속하면 정상적으로 되지 않는다.
'http://localhost:{port}/admin/' 혹은 'http://localhost:{port}/home/' 이런 식으로 접속해야 한다.
▶웹 서버
Django의 기본 runserver는 개발용 서버라 외부에서 직접 접속하기 어렵다.
실제 운영 환경에서는 웹서버(Gunicorn, Nginx, Apache 등)를 사용해야 한다.
아래 방법 중 하나를 선택해서 배포하면 된다.
✔️ 1. Gunicorn + Nginx 사용 (권장)
1️⃣ Gunicorn 설치 및 실행
Gunicorn은 Django를 위한 WSGI 서버이다.
운영 환경에서는 runserver 대신 Gunicorn을 사용해야 해.
pip install gunicorn
2️⃣ Gunicorn으로 Django 실행
gunicorn --bind 0.0.0.0:{port} myproject.wsgi:application
- 여기서 myproject는 settings.py가 있는 Django 프로젝트 이름이다.
- 실행 후 http://{서버 IP}:{port}/로 접속 가능하다.
서버가 종료되지 않도록 --daemon 옵션 추가
gunicorn --daemon --bind 0.0.0.0:{port} myproject.wsgi:application
2️⃣ Nginx 설정 (Gunicorn과 연동)
sudo apt install nginx # Ubuntu
sudo systemctl start nginx # Nginx 시작
✔ Nginx 설정 파일 (/etc/nginx/sites-available/django)
server {
listen 80;
server_name {ip}; # 서버 IP 또는 도메인
location / {
proxy_pass http://127.0.0.1:{port};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
alias /path/to/your/static/;
}
}
✔ 설정 적용
sudo ln -s /etc/nginx/sites-available/django /etc/nginx/sites-enabled/
sudo systemctl restart nginx
이제 Gunicorn 실행 후, Nginx를 통해 80 포트로 접속 가능하다!
✔️ 2. Django + Apache 또는 Nginx 설정
Django는 자체적으로 웹서버 기능이 없기 때문에, 운영 환경에서는 Apache 또는 Nginx를 사용해야 한다.
1️⃣ Nginx 설치 및 설정
1. Nginx 설치 (Windows라면 winginx 사용 가능)
2. Nginx 설정 파일 수정 (nginx.conf)
server {
listen {port};
server_name localhost;
location / {
proxy_pass http://127.0.0.1:{port}; # Django 서버 포트와 맞추기
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3. Nginx 실행
sudo systemctl restart nginx # 리눅스
nginx -s reload # 윈도우(winginx 사용 시)
✔️ 3. Windows IIS 웹서버 사용 (윈도우 전용)
- Windows라면 'IIS(Internet Information Services)'를 사용할 수도 있다.
- IIS에 Django를 연동하려면 WSGI 모듈과 FastCGI 설정이 필요하다.
- 보통 IIS보다는 Gunicorn + Nginx 조합을 추천한다!
✔️ 4. uWSGI + Nginx/Apache (고급 설정)
uWSGI를 사용하면 Apache, Nginx와 연동 가능하다.
설정이 더 복잡하지만, 성능 튜닝이 용이하다.
1️⃣ uWSGI 설치 및 실행
pip install uwsgi
uwsgi --socket 0.0.0.0:{port} --module myproject.wsgi
2️⃣ Nginx 설정 (uWSGI와 연동)
server {
listen 80;
server_name {ip};
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:{port};
}
location /static/ {
alias /path/to/your/static/;
}
}
✔ Nginx 재시작
sudo systemctl restart nginx
✔️ 결론
- Django runserver는 개발용이라 외부 접속 불가!
- Gunicorn을 사용해 gunicorn --bind 0.0.0.0:9292 myproject.wsgi:application 실행하면 외부 접속 가능.
- 운영 환경에서는 Gunicorn + Nginx 조합이 안정적.
- Windows라면 IIS 또는 Nginx를 설정할 수도 있음.
방식 | 설명 |
Gunicorn + Nginx | 추천! Gunicorn(WSGI 서버)으로 Django 실행 + Nginx가 프록시 역할 |
uWSGI + Nginx/Apache | uWSGI(WSGI 서버) + Nginx 또는 Apache와 연동 |
개발 환경 : runserver 사용 가능
운영 환경: Gunicorn + Nginx 추천
고성능/Apache 필요: uWSGI + Apache/Nginx 사용 가능
✔️ 운영 환경에서는 runserver를 절대 사용하지 말고, Gunicorn 또는 uWSGI로 배포해야 해야 한다.
개발환경만 사용해 보았고, 운영환경은 아직 제대로 해보지 않았다.
회사에서는 Apache와 Nginx를 이용해서 서버가 구현되어 있고, 실제로도 Nginx를 매일같이 stop, start 등을 한다.
하지만 혼자 프로젝트할 때는 사용해 본 적이 없고 Nginx에 대해서 제대로 아는 것도 없다.
runserver만을 이용해서 해보았고, 이번에 한번 chatGPT와 함께 공부하면서 대충 정리해 보았다.
나중에 기회가 되면 이를 참조해서 진행해 보기 위해서 정리 겸 블로그를 작성하였다.
'Back-End' 카테고리의 다른 글
[DRF] Django REST Framework란? (0) | 2023.07.20 |
---|---|
[Django] 마이그레이션 초기화 (0) | 2023.07.18 |
[Django] 모델(Model), 커스텀 모델 (1) | 2023.05.07 |
[Django] MTV 디자인 패턴 (Model, Template, View) (0) | 2023.05.06 |
[Django] URLs와 Views (App 생성/등록하기) (2) | 2023.05.02 |