11-1. Proxy 서버
Proxy Server
- 클라이언트가 자신을 통해, 다른 네트워크 서비스에 접속하게 해줄 수 있는 서버를 의미함
Forward Proxy
- 클라이언트가 외부 인터넷에 직접 접근하는 것이 아니라, Proxy Server에 요청을 하면, Proxy Server가 외부 인터넷에 대신 접속하여 결과를 받은 후, 클라이언트에 전달하는 서버.
- 중국이 자국내 사용자의 외부 인터넷 접속을 관리하는 것이 거대한 Forward Proxy 서버가 있어서 가능하다고 함.
Reverse Proxy
- 클라이언트가 Reverse Proxy에 요청하면 적절한 내부 서버에 접속하여 결과를 클라이언트에 전달한다.
- 보안상의 이점이 있다. (예를들어 내부에 DB가 있는경우, 클라이언트로부터의 직접적인 접속을 차단할 수 있다)
- 요청 트래픽을 관리할 수 있는 로드 밸런싱에도 유익하다.
- 즉 Forward와 Reverse의 차이는 유저가 외부 인터넷에 접속하느냐, 아니면 내부 서비스/서버에 접속하느냐의 차이라고 볼 수 있겠다.
- 실제로 서비스에서 Reverse Proxy를 사용하는 경우가 많다.
- nginx로 HTTPS를 구현할때도 이 Reverse Proxy 기능을 사용해야 한다는 것을 추측할 수 있다.
11-2. nginx로 Reverse Proxy 구현해보기 ~ ports로 구분
nginx reverse proxy ~ ports
- nginx로 reverse proxy를 구현하는 방법에는 두가지가 있다.
- 포트로 구분하는 방법
- 그리고 경로(path)로 구분하는 방법이 있다.
- 우선 포트로 먼저 해보자
- 서버에 포트를 두개 오픈한 후, 각 포트 접속시 두 내부 서버들 중 알맞은 서버에게 요청하여 결과를 가져오도록 구성하면 된다.
- 내부 서버는 nginx서버와 apache서버 두가지로 구성하도록 해보자.
docker-compose.yml
version: "3"
services:
nginxproxy:
image: nginx:1.18.0
ports:
- "8080:8080"
- "8081:8081"
restart: always
volumes:
- "/nginx/nginx.conf:/etc/nginx/nginx.conf"
nginx:
depends_on:
- nginxproxy
image: nginx:1.18.0
restart: always
apache:
depends_on:
- nginxproxy
image: httpd:2.24.46
restart: always
nginx/nginx.conf
- 기본
nginx.conf 설정에 upstream 설정과 server 설정 추가.
default.conf 설정과 겹치지 않도록 기본 nginx.conf 에서 다음 항목은 삭제
include /etc/nginx/conf.d/*.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;
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;
**upstream** **docker-nginx** { # 여기 docker-nginx의 경우 그냥 지은 이름. 아무거나 해도 됨.
server **nginx**:80; # 위 yaml 파일에서 컨테이너 이름과 동일한 이름
}
**upstream** **docker-apache** {
server **apache**:80;
}
**server** {
listen 8080;
location / {# 여기가 proxy 부분. 8080포트로 들어오는 요청은 docker-nginx로 전달
proxy_pass http://**docker-nginx**;
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;
proxy_set_header X-Forwarded-Host $server_name;
}
}
**server** {
listen 8081;
location / {
proxy_pass http://**docker-apache**;
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;
proxy_set_header X-Forwarded-Host $server_name;
}
}
}