Nginx & uWSGI

KDOY·2022년 1월 27일
0
post-thumbnail

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 보안그룹에서 포트를 열어주면 된다.

profile
공부한 것을 스스로 되짚어 보기 위한 블로그

0개의 댓글