Nginx 웹 서버 포트 별로 Reverse Proxy 설정
Docker Compose에서 Nginx 웹 서버로 Reverse Proxy를 설정한 뒤, 외부에서 접근이 가능한 외부 포트 두 개를 오픈하고 각 포트로 클라이언트 요청이 오면 내부 서버(외부 포트에서 접근 불가)에서 결과를 가져오도록 테스트 진행
도커를 통해 총 3개의 웹 서버 컨테이너를 만들어서 테스트
1) proxy 역할을 하는 nginx 웹 서버를 생성하고, 호스트 PC에서 nginx 웹 서버로 접근 가능한 8080, 8081를 개방
2) 현재 호스트 PC인 EC2 서버 또한 외부에서 접근 가능하도록 1111, 9999 포트를 인바운드 규칙에 추가
3) proxy nginx 웹 서버 컨테이너는 8080, 8081 포트가 열린 상태이며, 외부로부터 요청(1111, 9999 포트에서 들어온 요청)이 들어오면 8080, 8081 포트에서 내부의 또다른 웹서버 컨테이너인 nginx와 apache 서버로 요청을 분산시킨다.
ubuntu@ip-172-31-6-118:~/NGINX_PROXY$ vi docker-compose.yml
version: "3"
services:
nginxproxy:
depends_on:
- nginx
- apache
image: nginx
ports:
- "1111:8080"
- "9999:8081"
restart: always
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
nginx:
image: nginx
restart: always
apache:
image: httpd:2.4.46
restart: always
호스트 PC "./nginx/" 폴더에 nginx.conf 기본 설정 파일을 미리 만들어두었는데, nginx 컨테이너는 nginx.conf 파일이 "/etc/nginx/nginx.conf"에 위치해 있기 때문에 volumes 옵션으로 호스트 경로의 nginx 설정 파일을 컨테이너 내 경로로 연결시켜준다.
4) nginx.conf 설정 파일 작성
- 기본 nginx.conf 설정에 upstream 설정과 server 설정을 추가
- defalut.conf 설정과 겹치지 않도록 기본 nginx.conf에서 다음 항목은 삭제
- include/etc/nginx/conf.d/*.conf;
# nginx.conf 내용 중 일부
upstream docker-my-nginx {
server nginx:80;
}
upstream docker-my-apache {
server apache:80;
}
server {
listen 8080;
location / {
proxy_pass http://docker-my-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-my-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;
}
}
proxy역할을 하는 nginx 웹서버 8080, 8081 포트로 요청이 들어오게 되면 nginx.conf의 server 옵션에서 서버 별로 처리할 포트를 지정하고, proxy_pass을 통해 요청을 처리할 서버 이름을 만든다. upstream 옵션은 proxy_pass에서 만든 서버 이름을 넘겨 받아 내부 서버 주소(도커에서는 컨테이너 이름):포트로 웹 서버의 요청을 분산시키게 된다. nginx와 apache 컨테이너는 내부 컨테이너(여기서는 nginx 프록시 컨테이너)에서 접속이 가능하도록 각각 80번 포트를 열어두었다.
nginx upstream이란 무엇일까?
upstream 서버는 다른 말로 Origin 서버라고도 부른다. proxy_pass를 통해 nginx 웹서버가 받은 요청들을 여러 대의 애플리케이션 서버로 넘겨주는 역할을 한다.
upstream proxy_pass에서 만든 이름 {
ip_hash;
server 서버ip:10001;
server 서버ip:10002;
}
ip_hash 옵션은 ip를 기준으로 요청을 분배한다.
만약 A라는 ip가 서버ip:10001에 접속했으면 이후에도 서버ip:10001에 계속 접속하게 되며,
한번 접속한 ip는 계속 같은 서버를 사용한다.
# least_conn
upstream proxy_pass에서 만든 이름 {
least_conn;
server 서버ip:10001;
server 서버ip:10002;
}
least_conn 옵션은 가중치를 고려하면서 연결된 접속자가 가장 적은 서버로 요청을 분배한다.
# least_time
upstream proxy_pass에서 만든 이름 {
least_time;
server 서버ip:10001;
server 서버ip:10002;
}
least_time 옵션은 연결된 접속자가 가장 적으면서 평균 응답시간이 가장 적은 쪽으로 요청을 분배한다.
5) docker-compose up -d 실행
3개의 컨테이너가 무사히 설치되어 실행되고 있음을 확인할 수 있다.
6) 퍼블릭 IP:1111, 퍼블릭 IP:9999 접속해보면 접속 포트 별로 다른 서버에서 요청을 처리한다.