Nginx와 uWSGI에 들어가기 앞서 우리는 web client와 Django 사이의 구조에 대해서 알아야한다.
Web client ↔ Web server ↔ WSGI ↔ Django
이와 같은 구조로 되어있는데 화살표의 의미는 요청과 응답이다.
웹서버의 역할을 간단하게 요약하면 다음과 같다.
인터넷에 연결되어 웹에 연결된 다른 기기들이 웹 서버의 데이터를 주고받을 수 있도록 하는 것
이와 같은 역할을 하는 웹 서버 소프트웨어가 바로 Nginx와 Apache이다.
WSGI는 Web Server Gateway Interface의 약자이며 설명은 다음과 같다.
웹 서버 소프트웨어와 파이썬으로 작성된 웹 응용 프로그램 간의 표준 인터페이스
이와 관련된 소프트웨어가 바로 Gunicorn, uWSGI 등이 있다.
uWSGI는 pip로 설치할 수 있다.
pip install uwsgi
설치하면 ini 파일을 생성해줘야하는데 경로는 보통 다음과 같다.
/etc/uwsgi/ sites/
따라서 etc 경로로 이동하여 uwsgi/sites를 생성해주고 sites 안에 uwsgi.ini 파일을 만들어주고 파일 내부 내용은
# uwsgi.ini
[uwsgi]
base = /home/ubuntu/server_dev #server_dev:프로젝트 파일명
home = %(base)/venv #가상환경 경로
chdir = %(base) # 프로젝트 경로
module = server_dev.wsgi:application #프로젝트명.wsgi:application
socket = /tmp/django.sock #나중에 리눅스 소켓을 통한 통신 할 때 사용할 소켓 경로
chmod-socket = 666 #소켓의 파일권한 / 666: 누구나 읽고 쓰고 수정
master = true
enable-threads = true
pidfile = /tmp/django.pid
vaccum = true
logger = file:/tmp/uwsgi.log #log 파일
master : master 프로세스가 데몬 역할을 해줘서 worker 프로세스들이 죽으면 알아서 띄워준다.
enable-threads : 멀티 스레드를 사용할지 말지 결정하는 옵션, 설정해주지 않으면 기본적으로 1개 할당, 2개 이상 사용시 자동으로 True
pidfile : pid를 맨날 ps -ef | grep uwsgi로 찾기 번거로우니 따로 파일로 만들어주는 옵션
vaccum : uwsgi가 종료되고 나면 tmp파일을 지울지 말지 옵션,
설정해두면 uwsgi가 내려갔을때 .sock파일이나 .pid파일들이 지워진다.
설정은 모두 끝났고 실행방법은 다음과 같다.
uwsgi --http :8000 -i /etc/uwsgi/sites/server_dev.ini
지금은 웹 서버를 아직 설치하지 않아서 http를 8000포트로 연결하여 실행
Nginx는 pip에 없기 때문에 apt를 이용하여 설치를 한다.
sudo apt-get install nginx
Nginx는 설치하면 etc 경로에 nginx 폴더가 자동으로 생성된다.
이 nginx폴더에서 중요한 파일은 nginx.conf
# nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
etc/nginx/sites-enabled 경로로 가서 프로젝트명(파일명 상관 없을 수도)으로 파일을 하나 만들어 주고 파일 내부는
upstream django{
server unix:///tmp/django/sock;
}
server {
listen 80;
server_name localhost;
charset utf-8;
client_max_body_size 75M; #adjust to taste
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}
}
upstream - 서버 그룹 정의
server [주소 or 소켓]으로 서버 목록 나열
uwsgi를 소켓으로 띄웠기 때문에 소켓 경로를 적어줌
server - 서버에 대한 상세 정의
listen : 포트 번호
client_max_body_size: 요청이 올라올 때 최대 크기
location: 위치를 잡아준다. uwsgi로 보내기 때문에 uwsgi_pass django, include는 uwsgi_params(자동으로 설치되어있음)
여기서 포트번호를 80으로 설정했는데 etc/nginx/sites-enabled에 있는 default 파일 내부에서의 포트번호도 80으로 되어있어서 변경해야한다.
본인은 8080으로 바꿈
server {
listen 8080 default_server;
listen [::]:8080 default_server;
실행은 uwsgi 켜둔 상태에서 해야한다.
서버 기동
sudo systemctl start nginx
ps -ef | grep nginx (확인)
재시작
sudo service nginx restart
sudo systemctl restart nginx
서버 종료
sudo systemctl stop nginx
만약 서버가 열리지 않는다면 AWS EC2 보안그룹에서 포트를 열어주면 된다.