Intro
์ฒ์์๋ ๋จ์ํ ํ๋์ ์๋ฒ๋ฅผ ๊ฐ์ง๊ณ ์ฌ๋ฌ ๊ฐ์ ์น ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์ถ์ด ์์ํ์๋ค. ๊ทธ๋ฌ๋ ๊ณต๋ถ๋ฅผ ํ๋ฉด ํ ์๋ก Reverse Proxy ์๋ฒ๋ ์๊ฐ๋ณด๋ค ๋ค์ํ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์๊ณ Docker๋ฅผ ์ด์ฉํ๋ฉด์ ์ฌ๋ฌ ์ํ์ฐฉ์ค๋ฅผ ๊ฒช์๊ธฐ์ ๊ธ๋ก ๊ธฐ๋กํด๋ณธ๋ค..
What is Proxy Server??

ํ๋ก์ ์๋ฒ๋ ๊ทธ๋ฆผ์ฒ๋ผ ์ฌ์ฉ์์ ์๋ฒ์์ ์ค๊ณ์ธ ์ญํ ์ ํด์ค๋ค
ํ๋ก์๋ ํฌ๊ฒ Forward Proxy์ Reverse Proxy๋ก ๋๋๋ค
Forward Proxy
Forward Proxy๋ ์ธํฐ๋ท์ ์ฐ๊ฒฐํ๊ธฐ ์ ์ ํ๋ก์ ์๋ฒํํ ์์ฒญ์ ํ๊ณ ํ๋ก์ ์๋ฒ๊ฐ ์ค์ ์๋ฒ๋ก ์์ฒญ์ ํ ํ ํด๋ผ์ด์ธํธ์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํด์ค๋ค.
์ฝ๊ฒ ๋งํด์ ํ๋ก์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ๋์ ์๋ฒ๋ก ์์ฒญ์ ํ๋ ๊ฒ์ด๋ค ! ๋ง์ฝ์ ์ฐ๋ฆฌ๊ฐ ๊ณต์ ๊ธฐ์ ์ฐ๊ฒฐ๋ ์ปดํจํฐ๋ก naver.com์ ์ฐ๊ฒฐํ๋ฉด naver.com์ ์ง์ ์์ฒญํ ๊ฒ์ ์ฐ๋ฆฌ ์ง ์ปดํจํฐ๊ฐ ์๋๋ผ ๊ณต์ ๊ธฐ(proxy)๊ฐ ์์ฒญ์ ํ ๊ฒ์ด๋ค.

Forward Proxy์ ์ฅ์
1. ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ํ๋ก์ ์๋ฒ๊ฐ ๋์ ์์ฒญํด์ฃผ๊ธฐ ๋๋ฌธ์ ์์ ์ IP๋ฅผ ์จ๊ธธ ์ ์๋ค.
2. ์์ฃผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํด์ ๋คํธ์ํฌ ์ฑ๋ฅ ํฅ์์ด ๊ฐ๋ฅํ๋ค.
๊ทธ ์ธ ๋ณด์ ๋ฑ๋ฑ..
Reverse Proxy
Reverse Proxy๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ด๋ถ ์๋ฒ์ ์ ๊ทผ ์, Proxy ์๋ฒ๋ฅผ ๋จผ์ ๊ฑฐ์น ํ์ ๋ด๋ถ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ด๋ค.

Reverse Proxy์ ์ฅ์
1. Forward์๋ ๋ฐ๋๋ก ํด๋ผ์ด์ธํธ๋ ์ค์ ๋ด๋ถ๋ง์ ์๋ ์๋ฒ์ IP๋ฅผ ์จ๊ธธ ์ ์๋ค
2. ํ๋์ IP, ์๋ฒ๋ฅผ ๊ฐ์ง๊ณ ์๋ธ๋๋ฉ์ธ์ ์ด์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์น ์๋น์ค๋ฅผ ์ด์ํ ์ ์๋ค. (๋ด๊ฐ ์ด๊ฑฐ ํ๋ ค๊ณ ์ฉ๊ณ ์์ ํ๋ค.)
3. ๋ก๋๋ฐธ๋ฐ์ฑ์ ํตํด ์์ฒญ์ ๋ถ๋ฐฐํ ์ ์๋ค.
How to use Nginx Reverse Proxy with Docker?
Docker ๊ฐ๋ ๋ง ์๊ณ ์ค์ ๋ก ์จ๋ณด์ง ๋ชปํด์ ์ด๋ฒ์ ํ ๋ฒ ์จ ๋ณด์ ํ๋ ๋ง์์ผ๋ก docker๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ ์ธํ ์ ํด๋ณด์๋ค. ์ค์ ์๋น์ค๋ ์ด๋ฌํ ๊ตฌ์กฐ์ด๋ค.

Nginx Reverse Proxy ์๋ฒ๋ฅผ ์ด์ฉํ์ฌ nginx ์๋ฒ ๋๊ฐ์ node api ์๋ฒ๋ฅผ ์ฐ๊ฒฐํ ๊ฒ์ด๋ค.
ํ์ผ ๊ตฌ์กฐ๋ ์ด๋ฌํฉ๋๋ค.
- workspace
ใด dev
ใด source
ใด nginx.conf
ใด main
ใด source
ใด nginx.conf
ใด study_apiServer
ใด ์์คํ์ผ
ใด Dockerfile
ใด .dockerignore
ใด proxy
ใด nginx.conf
ใด docker-compose.yml
docker-compose.yml
version: "3"
services:
nginx-proxy:
container_name: nginx-proxy
depends_on:
- main
- dev
- express
image: nginx:latest
ports:
- "80:80"
- "433:433"
volumes:
- ./proxy/nginx.conf:/etc/nginx/nginx.conf
restart: always
main:
container_name: main
image: nginx:latest
expose:
- "8080"
volumes:
- ./main/nginx.conf:/etc/nginx/nginx.conf
- /root/workspace/main/source:/usr/share/nginx/html
restart: always
dev:
container_name: dev
image: nginx:latest
expose:
- "8081"
volumes:
- ./dev/nginx.conf:/etc/nginx/nginx.conf
- /root/workspace/dev/source:/usr/share/nginx/html
restart: always
express:
build:
context: ./study_apiServer
container_name: express
expose:
- "8082"
volumes:
- ./study_apiServer:/source
- /study_apiServer/node_modules
restart: "unless-stopped"
nginx-proxy: Reverse Proxy ์ญํ ์ ์ปจํ ์ด๋์ด๋ฉฐ host์ 80,443 ํฌํธ๋ฅผ ๋ฐ์ธ๋ฉํ์ต๋๋ค. depends_on์ผ๋ก main, dev, express๊ฐ ์คํ๋ ํ ์ ์ผ ๋ง์ง๋ง์ ์ปจํ ์ด๋๊ฐ ์คํ๋๊ฒ ํ์ต๋๋ค. volumes์ผ๋ก host์
./proxy/nginx.conf์ /etc/nginx/nginx.conf ํ์ผ์ ๊ณต์ ํ๊ณ ์์ต๋๋ค.
main: static ํ๋ฉด์ ๋ณด์ฌ์ค nginx ์๋ฒ์ ๋๋ค. expose๋ก ๋์ปค ๋ด๋ถ์์ 8080 ํฌํธ๋ฅผ openํ๊ณ ์์ต๋๋ค. host์
./main/nginx.conf, /root/workspace/main/source๋ฅผ ๊ฐ๊ฐ /etc/nginx/nginx.conf, /usr/share/nginx/html๊ณผ ๊ณต์ ํ๊ณ ์์ต๋๋ค.
dev: main๊ณผ ๊ฐ์ผ๋ฉฐ 8081 ํฌํธ๋ฅผ openํ๊ณ ์์ต๋๋ค
express: node๋ก ๋์๋ api ์๋ฒ์ด๋ฉฐ host์ ./study_apiServer ๊ณผ /source ๋ฅผ ๊ณต์ ํ๊ณ ์์ต๋๋ค. build์์ context ์์น์ ์๋ dockerfile์์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ํ ์ฌ์ฉํฉ๋๋ค.
Reverse Proxy ์๋ฒ ์ญํ ์ ํ Nginx์ nginx.conf
# proxy/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
server_name jungin.me;
location / {
proxy_pass http://main:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server{
server_name dev.jungin.me;
location / {
proxy_pass http://dev:8081;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
server_name studyapi.jungin.me;
location / {
proxy_pass http://express:8082;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
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;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ๋ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
server {
server_name jungin.me;
location / {
proxy_pass http://main:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server_name , jungin.me๋ก ์์ฒญ์ด ์ค๋ฉด proxy_pass http://main:8080์ผ๋ก ๊ฐ๊ฒ ๋๋ ๊ฒ์ ๋๋ค. nginx ์น์๋ฒ์ nginx.conf ์ ๋ณด๋ฉด
worker_processes 1;
events {
worker_connections 1024;
}
http{
server {
listen 8080;
server_name jungin.me;
root /usr/share/nginx/html;
index index.html;
error_log /var/log/nginx/api_error.log;
access_log /var/log/nginx/api_access.log;
}
}
8080 ํฌํธ๋ฅผ listen์ ํ๊ณ ์์ผ๋ฉฐ root ๋๋ ํฐ๋ฆฌ๋ก /usr/share/nginx/html๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
api ์๋ฒ๋ dockerfile์ ์ด์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ 8082 ํฌํธ๋ฅผ ์คํํ์์ต๋๋ค.
dockerfile์ ์ด๋ฌํฉ๋๋ค
FROM node:12
WORKDIR /study_apiServer
COPY . .
RUN npm install
CMD node ./bin/www
.dockerignore์ node_modules์ image๋ฅผ ๋ง๋ค ๋ ๋ฌด์ํ๋๋ก ์ค์ ํ ๊ฒ์ ๋๋ค. gitignore๊ณผ ์ฌ์ฉ๋ฒ์ด ๊ฐ์ต๋๋ค.
node_moudles/
Do it !
์ด์ ์ค์ ์ ๋ค ํ์ผ๋ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ด ์๋ค.
docker-compose up -d
๋จผ์ nginx ์น์๋ฒ๋ถํฐ ํ์ธํด๋ด ์๋ค


์ด์ api ์๋ฒ๊ฐ ์ ๋๋์ง ํ์ธํ๊ธฐ ์ํด postman์ ~~

์์ฒญ์ ๋ง๊ฒ ์ ์ค๋ค์ !! ~
๋๊ธ