📤

003 웹 서버, Nginx 사용하기

 

웹 서버란?

웹 서버란 HTTP를 통해 웹 브라우저에서 요청하는 HTML 문서나 Object(이미지 파일 등)을 전송해주는 서비스 프로그램을 말합니다.
 
웹 서버도 여러 종류가 있어 웹 서버마다 차이가 존재하겠지만 대체로 다음과 같은 기능들을 제공합니다.
  • 인증
  • 정적 콘텐츠 관리
  • HTTPS 지원
  • 콘텐츠 압축
  • 가상 호스팅
  • 대용량 파일 지원
  • 대역폭 스로틀링
 
아파치, Microsoft의 IIS, Nginx 등 여러 웹 서버가 있지만 여기서는 Nginx를 사용해보도록 하겠습니다.
 

Nginx 설치

AWS EC2 인스턴스에 접속한 후 설치 전 추가 설정을 해줍시다.
일반적으로 Ubuntu 소프트웨어센터에서 다운로드 받을 수 있는 각종 패키지들은 최신 버전이 아닙니다.
 
따라서 PPA(Personal package Archive)를 통해 최신버전을 다운로드할 수 있습니다.
# PPA 추가를 위한 필요 패키지 sudo apt-get install software-properties-common # nginx 안정화 최신버전 PPA 추가 sudo add-apt-repository ppa:nginx/stable
 
이제 Nginx를 설치해봅시다.
sudo apt-get install nginx
 
설치 후에는 버전을 확인하여 제대로 설치되었나 확인해줍시다.
nginx -v
 

Nginx 설정

Nginx를 설치하며 자동으로 생긴 nginx.conf 파일을 열어 유저 정보를 수정해줍시다.
nginx.conf 는 Nginx 관련 설정 파일입니다. 3번째 줄에 www-data 를 유저의 이름으로 바꿔줍니다.
# /etc/nginx/nginx.conf user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf;
 
저는 Ubuntu이므로 다음과 같이 바꿔주었습니다.
user ubuntu
 
다음으로 로컬 환경으로 넘어와서 다음과 같이 만들어줍시다.
# project/config/nginx/mysite.conf 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 : 어느 포트로 들어오는 요청을 받을지 지정해줍니다.
  • location : Nginx로 들어오는 요청을 mysite.sock 이라는 파일을 통해 uWSGI로 넘겨줍니다.
 
다시 EC2 서버로 접속하여 추가적인 설정을 진행합시다.
로컬에서 방금 만든 mysite.conf 를 /etc/nginx/sites-available/ 에 복사해줍니다.
sudo cp -f /home/ubuntu/BackEnd/Django/project/config/nginx/mysite.conf /etc/nginx/sites-available/mysite.conf
sites-available 폴더는 가상 서버 환경들에 대한 설정 파일들이 위치하는 부분입니다. 가상 서버를 사용하거나 사용하지 않던 간에 그에 대한 설정 파일들이 위치하는 곳입니다.
 
이제 sites-available 는 다음과 같습니다.
sites-available ├── default └── mysite.conf
 
sites-available 로 이동한 설정 파일을 sites-enabled 에 링크해줍니다.
sudo ln -sf /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/
sites-enabled는 sites-available에 있는 가상 서버 파일들중에서 실행시키고 싶은 파일을 symlink로 연결한 폴더입니다. 실제로 이 폴더에 위치한 가상서버 환경 파일들을 읽어서 서버를 세팅합니다.
 
그 후 불필요한 파일은 삭제해줍시다.
sudo rm /etc/nginx/sites-enabled/default
 
이로서 Nginx의 설정은 완료했습니다.
 

uWSGI 설정

Nginx를 설치하고 설정을 완료했으니 기존의 uWSGI가 Nginx와 연결되도록 설정을 해주겠습니다. Nginx는 백그라운드에서 실행이 되고 uWSGI는 서버에 접속하여 직접 실행을 해줘야합니다.
 
이를 위해 다시 로컬로 넘어가서 아래 내용과 같이 파일을 생성합시다.
# project/config/wsgi/wsgi.service [Unit]Description=uWSGI service After=syslog.target [Service]ExecStart=/home/ubuntu/myvenv/bin/uwsgi -i /home/ubuntu/BackEnd/Django/project/config/wsgi/wsgi.ini Restart=always KillSignal=SIGQUIT Type=notify StandardError=syslog NotifyAccess=all [Install]WantedBy=multi-user.target
uWSGI 를 설치한 경로와 저번 포스팅에서 작성하였던 ini 파일의 경로를 지정해줍니다.
 
다시 EC2 서버로 넘어와서 생성한 wsgi.service 파일을 /etc/systemd/system/ 에 링크해줍니다.
sudo ln -f /home/ubuntu/BackEnd/Django/project/config/wsgi/uwsgi.service /etc/systemd/system/uwsgi.service
systemd 는 일부 리눅스 배포판에서 유닉스 시스템 V나 BSD init 시스템 대신 사용자 공간을 부트스트래핑하고 최종적으로 모든 프로세스들을 관리하는 init 시스템입니다. 
systemd 라는 이름 뒤에 추가된 d는 유닉스에서의 데몬(daemon)을 나타냅니다.
 
이로서 uWSGI를 백그라운드에서 실행시킬 수 있습니다. 데몬을 리로드하고 uWSGI 데몬을 활성화해줍시다.
sudo systemctl daemon-reload sudo systemctl enable uwsgi
 
이제 Nginx 와 uWSGI는 백그라운드에서 동작하는 걸 확인할 수 있습니다.
sudo systemctl | grep nginx // nginx.service loaded active running A high performance web server and a reverse proxy server
 

Socket 통신

웹 서버인 Nginx와 uWSGI 사이의 통신을 매개 HTTP 요청을 사용할 수도 있지만 서버 안쪽에서의 통신이기 때문에 socket 방식이 overhead가 적어서 더 효율적입니다.
 
따라서 이를 위한 설정을 해주도록 하겠습니다. 다시 로컬로 넘어와 wsgi.ini 파일을 수정해줍시다. 11~13줄에 HTTP와 포트번호를 지정하는 방식에서 socket 설정으로 바뀌었습니다.
 
chown-socket 에는 유저의 이름을 기재해줍니다.
# project/config/wsgi/wsgi.ini [uwsgi]chdir = /home/ubuntu/BackEnd/Django/project module = config.wsgi.debug:application home = /home/ubuntu/myvenv uid = ubuntu gid = ubuntu socket = /tmp/mysite.sock chmod-socket = 666 chown-socket = ubuntu:ubuntu enable-threads = true master = true vacuum = true pidfile = /tmp/mysite.pid logto = /var/log/uwsgi/@(exec://date +%%Y-%%m-%%d).log log-reopen = true
 
이제 데몬을 reload하고 Nginx와 uWSGI를 restart해줍니다.
sudo systemctl daemon-reload sudo systemctl restart nginx uwsgi
 
Nginx는 /var/log/nginx/error.log 에서 에러 로그를 확인할 수 있습니다.