다음 단계는 nginx 연결하기!
이 파트 역시 네로님 블로그에서 많은 도움을 얻었습니다. 감사합니다!
이전 단계에서 uwsgi를 설치한 것은 nginx와 같은 웹 서버와 장고를 연결하는 징검다리로서 기능을 하도록 하기 위해 설치한 것이었다. 이제 본격적으로 nginx를 설치해 장고가 서버와 연결될 수 있도록 해야 한다.
nginx는 Igor Sysoev라는 러시아 개발자가 만든 웹 서버 프로그램이다. 굉장히 가볍고 효율적이라는 장점이 있고 Django나 Flask와 같은 파이썬 웹 프레임워크에 주로 쓰인다.
nginx를 설치하기 전까지 Django와 사용자는
사용자 ⇿ uWSGI ⇿ Django
이렇게 통신을 하게 된다. 하지만 일반적으로 사용자의 브라우저는 uWSGI에 직접 요청을 보내지 않고, 이 요청을 대신 받아주는 게 nginx나 apache와 같은 웹서버다. 그래서 nginx를 설치하면 사용자는 Django와
사용자 ⇿ nginx 서버 ⇿ uWSGI ⇿ Django
이렇게 통신을 하게 된다.
$ sudo apt-get install nginx
이 명령어를 입력해 nginx를 설치해준다. 설치는 매우 간단!
이전 단계에서 배포용 계정인 deploy를 만들어 뒀으니 nginx에게 그 계정이 nginx를 사용하는 유저라는 것을 알려주어야 한다. 이건 nginx.conf
파일에서 진행된다.
$ sudo vim /etc/nginx/nginx.conf
를 눌러 conf 파일을 열어서
user deploy; <<< 이 부분 수정
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
....
맨 윗 줄에 디폴트로 www-data로 되어 있는 user을 deploy로 바꿔준다.
혹시 vim 사용법을 모르는 분들을 위해.
vim에 들어가면 처음에 아무것도 써지지 않을텐데, 그 상태에서 i를 누르면 "insert"모드로 바뀌면서 수정이 가능해진다. 수정할 내용을 다 수정한 뒤 esc 버튼을 누르면 처음처럼 수정이 불가능한 상태로 바뀐다. 그 상태에서 ':'를 누르면 밑에 얇은 바가 생기면서 입력 가능한 부분이 생기는데, ':' 뒤에 wq를 입력하고 엔터를 치면 저장하고 나올 수 있다.
그 뒤 이전에 만들어 두었던 .config 디렉토리에 nginx 디렉토리를 새로 만들어 준다. 그리고 해당 디렉토리 안에 project_name.config
파일을 만들어 준다.
$ cd /srv/django_project/.config
$ mkdir nginx
$ vim project_name.conf
그러면 이런 구조가 된다.
├── django_project
│ └── .config
│ ├── nginx <<< 추가
│ │ └── project_name.config <<< 추가
│ └── uwsgi
│ └── project_name.ini
└──
server {
listen 80;
server_name *.compute.amazonaws.com;
charset utf-8;
client_max_body_size 128M;
location / {
uwsgi_pass unix:///tmp/mysite.sock;
include uwsgi_params;
}
}
여기서 listen 포트를 80으로 설정해두었으니 이전에 project_name.ini
파일에서 포트를 8080이라고 설정한 http = :8080
을 수정해줄 차례다.
[uwsgi]
chdir = /srv/django_project/
module = project_name.wsgi:application
home = /home/ubuntu/myvenv/
uid = deploy
gid = deploy
socket = /tmp/project_name.sock <<< 여기서부터
chmod-socket = 666
chown-socket = deploy:deploy <<< 여기까지가 수정됨
enable-threads = true
master = true
vacuum = true
pidfile = /tmp/project_name.pid
logto = /var/log/uwsgi/project_name/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
원래 쓰여있던 http = :8080
대신에 소켓 정보, 소유자, 권한을 서술한 새로운 3줄을 입력해준다.
이전 포스트 마지막 부분을 보면 uwsgi를 키기 위해서는 긴긴 명령어를 입력해 직접 켜주어야 했다는 것을 볼 수 있다. 하지만 nginx와 uwsgi가 연결되려면 uwsgi를 수동으로 켜서는 안 된다. 서버가 계속 켜져 있으려면 uwsgi가 계속 백그라운드에 실행되어 있을 수 있게 설정 파일을 추가로 만들어 주어야 한다.
├── django_project
│ └── .config
│ ├── nginx
│ │ └── project_name.config
│ └── uwsgi
│ ├── project_name.ini
│ └── uwsgi.service <<< 추가
└──
uwsgi 디렉토리 안에 uwsgi.service
파일을 만들어서
[Unit]
Description=uWSGI service
After=syslog.target
[Service]
ExecStart=/home/ubuntu/myvenv/bin/uwsgi -i /srv/django_project/.config/uwsgi/project_name.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
해당 내용을 작성해준다.
[service] 항목 아래에 있는 ExecStart 값은
원래 수동으로 입력해서 uwsgi를 실행시켰던
$ sudo /home/ubuntu/myvenv/bin/uwsgi -i /srv/django_project/.config/uwsgi/project_name.ini
이 부분을 옮겨둔 것이다. 이 명령어를 service로 등록하여 계속 백그라운드에서 실행되도록 하는 것이다.
그 이후 uwsgi.service
파일을 daemon에 등록해준다.
sudo ln -f /srv/django_project/.config/uwsgi/uwsgi.service /etc/systemd/system/uwsgi.service
daemon이란?
daemon이란 리눅스 프로그램이 처음 가동될 때 실행되는 백그라운드 프로세스의 일종이다. 메모리에 상주하면서 사용자의 요청을 기다리면서 대기하고 있다가 요청이 발생하면 해당 요청에 맞게 대응을 한다. 그리고 일반적으로 daemon 프로그램의 명령어는 'd'로 끝난다.
(e.g. 위 명령문의 systemd)
참고 사이트: https://valuefactory.tistory.com/229
그 후 daemon을 reload하고, uwsgi 서비스를 enable 해준 뒤 restart를 해준다.
$ sudo systemctl daemon-reload
$ sudo systemctl enable uwsgi
$ sudo systemctl restart uwsgi
nginx 설정 파일을 등록하려면 cp 명령어를 이용해 sites-available 디렉토리로 project_name.conf
를 복사한다.
$ sudo cp -f /srv/django_project/.config/nginx/project_name.conf /etc/nginx/sites-available/django_project.conf
그리고 복사한 이 파일을 sites-enabled
폴더 안에 링크해주고, sites-enabled
에 원래 있었던 default 파일은 삭제한다.
$ sudo ln -sf /etc/nginx/sites-available/mysite.conf
/etc/nginx/sites-enabled/mysite.conf
$ sudo rm /etc/nginx/sites-enbaled/default
이제 daemon을 다시 reload 해주고 uwsgi와 nginx를 restart해준다.
$ sudo systemctl daemon-reload
$ sudo systemctl restart uwsgi nginx
이건 뭔가 수정 사항이 생길 때마다 해줘야 그 수정 사항이 반영되어 서버에 나타니까 항상 해주기! (처음에 그거 안 해서 변경 사항 반영 안 되는 거 모르고 겁나 삽질한 1人)
이전 글과 똑같이 포트를 추가해 주는데, 지금 기억이 오락가락하는 부분이... Lightsail에는 원래 포트 80이 열려있었던 것 같기도 하고... 내가 만들었던 것 같기도 하다. 열려 있으면 걍 두면 되고, 안 열려 있으면 추가를 한다.
이 부분을 할 때 내가 살짝 돌아버릴 뻔 했는데, nginx를 설정할 때 만드는 저 conf 파일들과 ini 파일에 오타가 정말 하나라도 있으면
Job for uwsgi.service failed because the control process exited with error code.
See "systemctl status uwsgi.service" and "journalctl -xe" for details.
와 비슷한 에러가 뜨면서 배포가 안 된다. 정말 파일 하나 하나 눈 빠지게 보면서 오타를 잡아야 하니... 이런 일을 겪지 않으려면 처음부터 정말 꼼꼼하게 경로 잘 확인하면서 오타 없이 파일을 작성해야 한다. 화이팅