Django
Server

Django 어플리케이션 nginx 연결

- Django 블로그 만들기

Jan. 13, 2023, 9:09 a.m.

 

안녕하세요?

지난 포스트에서는 Django 어플리케이션에 uWSGI 를 연결해보았습니다.

오늘은 웹서버는 nginx를 지난 번 연결해놓은 uWSGI에 연결하도록 하겠습니다.

 

여기서, '웹서버란 무엇이냐? 왜 필요한 것이냐?' 가 궁금하신 분은 

다음 주소로 들어가서 웹 서버의 개념을 확인해보시기 바랍니다. ( 웹서버와 WAS의 기능, 그리고 그 차이)

 

nginx 란?

nginx는 대표적인 웹 서버입니다. 

웹 서버는 간단히 설명하자면 사용자의 요청(request)을 처리하고 반응(response)을 해주는 역할을 하는데,

우리의 Django 프로젝트는 지난 번 포스트에서 설명드린 것과 같이

자체적인 웹 서버를 운영 환경에 맞는 수준으로 지원하지 않기 때문에

nginx와 같은 웹서버를 연결해주어야 합니다.

 

nginx 설치

아래의 명령어로 nginx 를 설치해줍니다.

sudo apt-get install nginx

 

설치가 완료되면 nginx의 설정 파일에서 nginx를 사용하는 유저가 ubuntu(현재 사용하는 기본계정)임을 알려줘야합니다.

아래의 명령어로 vi editor(자세한 vi editor 사용 방법은 todo 참고)로 nginx 설정파일을 열고

sudo vi /etc/nginx/nginx.conf

키보드에서 'i' 키 를 눌러 수정 모드로 바꾼 뒤 첫 줄에 있는

www-data를 ubuntu(기본계정)로 수정해주고,

user ubuntu;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
 
events {
        worker_connections 768;
        # multi_accept on;
}
 
http {
 
        ##
        # Basic Settings
        ##
.... 중략

'esc' 키를 눌러 수정모드는 해제 한 뒤

:wq 라고 입력 후 'enter' 키를 쳐서 vi editor를 저장하고 빠져나옵니다.

 

nginx 관련 설정파일 생성

지난 번 프로젝트 폴더(Test/TestProject) 아래에 생성한 .config 폴더 밑에 nginx 라는 폴더를 만들어주고

Test(프로젝트명).conf 파일을 생성합니다.

그리고 Test.conf 파일에 아래와 같이 작성해줍니다.

server {
    listen 80;
    server_name *.compute.amazonaws.com;
    charset utf-8;
    client_max_body_size 128M;
 
    location / {
        uwsgi_pass  unix:///tmp/Test.sock;
        include     uwsgi_params;
    }
}

- listen: 요청을 받을 포트 번호입니다. 80 포트가 http 기본 포트입니다/

- server_name: 요청을 받을 서버 주소입니다. 

- location / { }: "server_name/" 식의 요청이 들어올 경우, 처리할 내용에 대해서 정의합니다

 

그리고 위에 파일에서 80포트를 기본으로 지정해주었기 때문에,

저희가 기존에는 8000번 포트를 쓰고 있었으므로, 관련된 수정을 해주어야 합니다.

uwsgi 설정파일(Test/TestProject/.config/uwsgi/Test.ini)을 열고 아래와 같이 수정해줍니다.

[uwsgi]
chdir = /home/ubuntu/app/django/Test/TestProject
module = TestProject.wsgi:application
home = /home/ubuntu/app/django/Test/myvenv
 
uid = ubuntu
gid = ubuntu
 
socket = /tmp/Test.sock
chmod-socket = 666
chown-socket = ubuntu:ubuntu
 
enable-threads = true
master = true
vacuum = true
pidfile = /tmp/Test.pid
logto = /var/log/uwsgi/Test/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true

포트번호를 빼서 80번 포트를 사용하도록하고, 소켓정보 관련 내용을 넣어줍니다.

이렇게 하여 uWSGI와 nginx 연결이 되었습니다.

그런데 문제가 하나 있습니다.

nginx는 항상 켜져있어야 한다는 점입니다. 

uwsgi는 지난번에 기다란 명령어를 이용하여 그 때 그 때 켜줬었는데,

uwsgi와 nginx를 연결해야 한다면 uwsgi도 항상 켜져있어야 합니다. 

따라서 이를 위해 아래의 작업을 해줍니다.

 

연결된 uWSGI 백그라운드에서 실행되도록 설정

.config 폴더 밑에 지난번 만들어놨던 uwsgi 폴더가 있는데, 

그 밑에 uwsgi.service 파일을 만들고 아래와 같이 내용을 입력합니다.

[Unit]
Description=uWSGI service
After=syslog.target
 
[Service]
ExecStart=/home/ubuntu/app/django/Test/myvenv/bin/uwsgi -i /home/ubuntu/app/django/Test/TestProject/.config/uwsgi/Test.ini
 
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
 
[Install]
WantedBy=multi-user.target

 

여기서 ExecStart 부분은 지난 포스트에서 ini 파일을 가지고 서버를 올릴 때 썼던 명령어입니다.

다시 말해, 서버를 올리는 명령어를 서비스로 등록하여 백그라운드에서 실행을 하고자 합니다.

이를 위해서는 데몬에 해당 파일을 등록해줘야 하는데,

데몬은 간단히 말하면 백그라운드에서 돌아가는 프로세스로, 자세한 설명은 다음 주소를 참고해주시기 바랍니다.([Linux] 데몬(Daemon)이란? 크론탭(Crontab) 이란?)

 

위에서 생성한 uwsgi.service 파일을 데몬(백그라운드에 실행)에 등록해주기 위해, 이 파일을 아래 명령어를 통하여 /etc/systemd/system/ 에 링크를 걸어줍니다.

sudo ln -f ~/app/django/Test/TestProject/.config/uwsgi/uwsgi.service /etc/systemd/system/uwsgi.service

 

아래 명령어로 데몬을 새로고침 하고,

sudo systemctl daemon-reload

 

uWSGI 서비스를 사용 가능한 상태로 변경하고,

uWSGI 를 리스타트 해줍니다.

> sudo systemctl enable uwsgi
> sudo systemctl restart uwsgi

 

 참고로, 해당 과정에서 오류가 난다면

 uwsgi.service 파일의 ExecStart 부분이 절대경로가 맞는지,

 경로에 오타가 없는지,

 'ExecStart=' 이 부분에 스페이스바가 있다면 지웠는지 확인 바랍니다.   

 

여기까지 잘 되셨다면,

저희의 프로젝트 내의 생성한 nginx 설정 파일을 nginx 어플리케이션에 등록해 주어야 합니다.

cp 명령어를 이용해 등록하는 경로(sites-available)로 파일을 복사해줍니다.

sudo cp -f ~/app/django/Test/TestProject/.config/nginx/Test.conf /etc/nginx/sites-available/Test.conf

 

sites-available에 복사된 설정 파일을 sites-enables폴더 안에서도 링크합니다.

sudo ln -sf /etc/nginx/sites-available/Test.conf /etc/nginx/sites-enabled/Test.conf

 

sites-enable 폴더 내의 default 파일을 삭제해줍니다.

sudo rm /etc/nginx/sites-enabled/default

 

다시 데몬을 새로고침하고,

sudo systemctl daemon-reload

 

nginx와 uWSGI 를 리스타트합니다.

sudo systemctl restart uwsgi nginx

 

저는 여기서 오류가 났는데, 혹시 이 부분에서 오류가 나시는 분들은 

nginx 오류 todo 포스트를 참고하시기 바랍니다.

 

 

 

여기까지 문제가 없었다면, 

저희의 사이트 주소로 들어가면(기존에 포트가 있던 주소 *.amazonaws.com:8000 이 아닌 포트 없는 *.amazonaws.com 으로)

정상적으로 사이트가 조회되면 nginx - uwsgi 로 django 서버 띄우기 끝입니다!!!

 

 

static 파일 오류 해결

다 끝났다고 생각하고

admin 페이지에 들어가보았는데..

admin 페이지가 css 파일을 못찾아서 다시 깨지는 것을 확인하였습니다.

이는 nginx 설정 파일에서 static 경로를 못 찾기 때문인데요,

 

manage.py 파일이 있는 경로에서 아래의 명령어로 static 파일을 다시 collect 해주고,

python manage.py collectstatic

 

.config/nginx/Test.conf 파일에 아래와 같은 부분을 추가해줍니다.

server {
...
location /static/ {
        alias /home/ubuntu/app/django/Test/TestProject/static/;
    }
...
}

 

그리고 아래 명령어로 nginx 재기동을 한 후에 다시 들어가보면

sudo systemctl restart uwsgi nginx

 

admin 페이지가 다시 잘 뜨는 것을 볼 수 있습니다.

Reference

https://nerogarret.tistory.com/48


Project

Comments


Related Posts