nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    # 이거 nginx 이미지에 있는 기본 conf line인데 conf volume하려면 주석해야함
    # include /etc/nginx/conf.d/*.conf;

    #load balancer
    upstream test_server {
        server host.docker.internal:10010;
        server host.docker.internal:10011;
    }

    server {
        listen 80;
        server_name  localhost;

        location / {
            proxy_pass http://test_server;
        }
    }
}

load balancer 아래 라인을 제외하고는 현시점 latest nginx 이미지에 기본으로 있는 conf 라인들이다.

include /etc/nginx/conf.d/*.conf; 이 부분 주석안하면 conf volume 넣어도 conf.d 폴더 안의 default.conf 가 적용된다.

윈도우에 nginx 받으면 conf.d 폴더가 없어서(docker image에는 conf.d 폴더 있음) 윈도우에서 잘 동작하는데 왜 docker에서 volume한 conf대로 동작하지 않을까 삽질했다.

 

nginx server listen port로 들어가면 location proxy_pass의 upstream으로 로드 밸런싱 시켜준다.

로드 밸런싱 방법의 default는 라운드 로빈이다.

docker-compose.yml

services:
    nginx:
        image: nginx
        ports:
            - '80:80'
        volumes:
            - ./nginx.conf:/etc/nginx/nginx.conf
        environment:
            - NGINX_PORT=80

    server1:
        image: node:lts-alpine3.16
        ports:
            - '10010:8000'
        volumes:
            - ./server1:/server1
        command:
            - /bin/sh
            - -c
            - |
                cd server1
                npm i
                node server1.js

    server2:
        image: node:lts-alpine3.16
        ports:
            - '10011:8000'
        volumes:
            - ./server1:/server1
        command:
            - /bin/sh
            - -c
            - |
                cd server1
                npm i
                node server1.js

 

nginx.conf (web-socket)

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # include /etc/nginx/conf.d/*.conf;

    # 웹소켓 관련 부분
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    
    #load balancer
    upstream websocket {
        server host.docker.internal:10010;
        server host.docker.internal:10011;
    }

    server {
        listen 80;
		
        # 웹소켓 관련 부분
        location / {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Host $host;
        }
    }
}

웹 소켓도 로드 밸런싱이 가능하다.

docker-compose.yml (web-socket)

services:
    nginx:
        image: nginx
        ports:
            - '80:80'
        volumes:
            - ./nginx.conf:/etc/nginx/nginx.conf
        environment:
            - NGINX_PORT=80

    server1:
        image: azul/zulu-openjdk-alpine:17-jre-latest
        ports:
            - '10010:8080'
        volumes:
            - ./server2:/server2
        command:
            - /bin/sh
            - -c
            - |
                cd server2
                nohup java -jar message_websocket-1.0-SNAPSHOT.jar 

    server2:
        image: azul/zulu-openjdk-alpine:17-jre-latest
        ports:
            - '10011:8080'
        volumes:
            - ./server2:/server2
        command:
            - /bin/sh
            - -c
            - |
                cd server2
                nohup java -jar message_websocket-1.0-SNAPSHOT.jar

재연결하면 server1과 server2를 왔다갔다 분산되는 걸 볼 수 있다.

'DevOps > Nginx' 카테고리의 다른 글

headers-more-nginx-module docker image  (0) 2024.12.21
nginx reverse proxy로 CORS 해결하기  (0) 2024.12.03