AWS-장고로 백엔드 만들기(3) - nginx 연결하기

jiiiii·2021년 10월 29일
2

졸업 작품

목록 보기
3/3
post-thumbnail

다음 단계는 nginx 연결하기!
이 파트 역시 네로님 블로그에서 많은 도움을 얻었습니다. 감사합니다!

이전 단계에서 uwsgi를 설치한 것은 nginx와 같은 웹 서버와 장고를 연결하는 징검다리로서 기능을 하도록 하기 위해 설치한 것이었다. 이제 본격적으로 nginx를 설치해 장고가 서버와 연결될 수 있도록 해야 한다.

우선 nginx란?

nginx는 Igor Sysoev라는 러시아 개발자가 만든 웹 서버 프로그램이다. 굉장히 가볍고 효율적이라는 장점이 있고 Django나 Flask와 같은 파이썬 웹 프레임워크에 주로 쓰인다.

nginx를 설치하기 전까지 Django와 사용자는

사용자 ⇿ uWSGI ⇿ Django

이렇게 통신을 하게 된다. 하지만 일반적으로 사용자의 브라우저는 uWSGI에 직접 요청을 보내지 않고, 이 요청을 대신 받아주는 게 nginx나 apache와 같은 웹서버다. 그래서 nginx를 설치하면 사용자는 Django와

사용자 ⇿ nginx 서버 ⇿ uWSGI ⇿ Django

이렇게 통신을 하게 된다.

nginx와 uwsgi 연결하기

nginx 설치하기

$ sudo apt-get install nginx

이 명령어를 입력해 nginx를 설치해준다. 설치는 매우 간단!

nginx 설정하기

1. 유저 설정

이전 단계에서 배포용 계정인 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를 입력하고 엔터를 치면 저장하고 나올 수 있다.

2. conf 파일 만들어주기

그 뒤 이전에 만들어 두었던 .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
└──

3. project_name.config 수정하기

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을 수정해줄 차례다.

4. project_name.ini 수정하기

[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줄을 입력해준다.

5. uwsgi.service 파일 작성하기

이전 포스트 마지막 부분을 보면 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

6. nginx 설정 파일을 nginx 어플리케이션에 등록하기

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人)

7. 포트 80 열기

이전 글과 똑같이 포트를 추가해 주는데, 지금 기억이 오락가락하는 부분이... 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.

와 비슷한 에러가 뜨면서 배포가 안 된다. 정말 파일 하나 하나 눈 빠지게 보면서 오타를 잡아야 하니... 이런 일을 겪지 않으려면 처음부터 정말 꼼꼼하게 경로 잘 확인하면서 오타 없이 파일을 작성해야 한다. 화이팅

0개의 댓글