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 |