도커(Docker)

Nginx 웹 서버 포트 별로 Reverse Proxy 설정

Bentist 2022. 2. 4. 13:01

Docker Compose에서 Nginx 웹 서버로 Reverse Proxy를 설정한 뒤, 외부에서 접근이 가능한 외부 포트 두 개를 오픈하고 각 포트로 클라이언트 요청이 오면 내부 서버(외부 포트에서 접근 불가)에서 결과를 가져오도록 테스트 진행

 

도커를 통해 총 3개의 웹 서버 컨테이너를 만들어서 테스트


1) proxy 역할을 하는 nginx 웹 서버를 생성하고, 호스트 PC에서 nginx 웹 서버로 접근 가능한 8080, 8081를 개방
2) 현재 호스트 PCEC2 서버 또한 외부에서 접근 가능하도록 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 접속해보면 접속 포트 별로 다른 서버에서 요청을 처리한다.