Skip to content

3. Nginx for Reverse Proxy


1. Mission

001


  • 로드 밸런싱 테스트를 위해 이전의 아키텍처를 위와 같이 변경한다.
  • 테스트 서버 A와 B는 구글 클라우드에서 각각 생성했다.
  • 테스트 서버 A는 Nginx를 이용하여 프록시 서버 역할을 한다.
  • 테스트 서버 B는 2개의 포트의 Gunicorn을 이용하여 웹 애플리케이션을 담당하는 역할을 한다.


2. Docker

  • 이전에 만들었던 Dockerfile을 이용하며, 8888번과 9999번 포트를 가진 호스트에서 진행한다.
  • 현재 테스트 서버 B의 public IP는 34.64.164.5이다.


1) docker build

docker build -t gunicorn/cuda-11.0 .


3) docker run

  • 8888번 포트


docker run -it --gpus all -p 8888:80 --name gunicorn gunicorn/cuda-11.0 /bin/bash


  • 9999번 포트


docker run -it --gpus all -p 9999:80 --name gunicorn gunicorn/cuda-11.0 /bin/bash


4) Gunicorn 실행

  • 8888번과 9999번 포트에서 모두 실행한다.


$(base) gunicorn


3. Nginx

  • 7001번 포트를 가진 다른 호스트에서 진행한다.
  • 현재 테스트 서버 A의 public IP는 34.64.231.182이다.
  • 로드 밸런싱을 위해 설정만 바꿔줄 것이다.


1) Nginx 설정

  • nginx.conf


sudo vim /etc/nginx/nginx.conf
user www-data;
worker_processes auto; # 동시에 Requests 받을 수 있는 수 = worker_processes * worker_connections
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 4096; # Reverse Proxy이므로 2배 설정
        multi_accept on; # 모든 Connection 허용
        use epoll; # default=select보다 효율적인 방식
}

http {
        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;

        ##
        # Timeout Settings
        ##

        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;

        keepalive_timeout 600; # Connection을 유지하는 시간
        client_body_timeout 600; # Client로부터 request body를 받는 시간
        send_timeout 600; # Client에게 response body를 보내는 시간

        reset_timedout_connection on; # Connection이 끊긴 경우 리셋

        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 TLSv1.3; # 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;
#       }
#}


  • default.conf


sudo vim /etc/nginx/conf.d/default.conf
upstream gunicorns {
        server 34.64.164.5:8888 max_fails=3 fail_timeout=3s;
        server 34.64.164.5:9999 max_fails=3 fail_timeout=3s;
}

server {
        listen 7001;
        server_name localhost;

        location / {
                proxy_pass http://gunicorns;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/html;
        }
}


  • http 블록 안에 upstream 블록을 생성하여 로드 밸런싱이 가능하도록 한다.
  • 위의 코드에서 여러 옵션들은 서버 목적에 맞게 바꿔줘야 하며, 테스트를 진행하면서 바꾸는 것이 좋다.


2) Nginx 실행

sudo service nginx restart

References