NGINX 리버스 프록시 설정하기

NGINX Reverse Proxy의 용도

Proxy는 일반적으로 여러 서버 간에 부하를 분산시키거나, 서로 다른 웹 사이트의 콘텐츠를 원활하게 표시하거나, HTTP 이외의 프로토콜을 통해 애플리케이션 서버에 처리 요청을 전달하는 데 사용됩니다.
NGINX 리버스 프록시의 용도는 로드 밸런싱을 제공하는 것입니다.


Forward Proxy와 Reverse Proxy 의 차이점

Forward Proxy
일반적으로 Proxy 라고 불리며, 클라이언트에서 요청 시 Proxy를 통해 목적지에 요청하고 응답 받는 것을 말합니다. Proxy가 요청자를 대신해서 웹 사이트를 검색하거나 컨텐츠를 받아서 전달해주는 중계자 역할을 합니다.

Reverse Proxy
Load Balancer의 용도로도 사용되며, 클라이언트의 요청을 받아서 내부 서버로 전달해주는 Proxy를 말합니다. 서비스/콘텐츠 제공자인 서버에서 사용되며, 대표적으로 CDN 서비스가 있습니다.

NGINX Reverse Proxy 설정
NGINX는 요청을 프록시 할 때 요청을 지정된 프록시 서버로 보내고 응답을 가져온 다음 클라이언트로 다시 전송합니다.
HTTP 서버(NGINX/APACHE) 또는 비 HTTP 서버(PHP 또는 파이썬과 같이 특정 프레임워크로 개발된 애플리케이션을 특정 프로토콜을 사용하여 실행할 수 있는 서버)에 요청을 프록시할 수 있습니다.
지원되는 프로토콜로는 FastCGI, uwsgi, SCGI, memcached 등이 있습니다.

테스트 서버 정보
Proxy Server : NGINX Reverse Proxy (192.168.10.100:80)
Server 1: Apache Web (192.168.10.101:80)
Server 2: Apache Tomcat (192.168.10.102:8080)

NGINX 설정 추가
nginx.conf 파일에 proxy 관련 설정을 추가합니다. upstream 구문으로 이름을 설정하고 서버 아이피와 포트를 추가 합니다.

sudo vi /etc/nginx/nginx.conf

다음 내용을 추가합니다.

http {
proxy_intercept_errors   on;
proxy_buffers            256 4k;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_connect_timeout 300s;

upstream apache_web {
server 192.168.10.101:80;
}
upstream apache_tomcat {
server 192.168.10.102:8080;
}

apache_web 이나 apache_tomcat 으로 이름을 부여 한것을 볼 수 있는데, 다수의 서버가 있을 경우 아래와 같이 그룹으로 묶을 수 있습니다.

upstream apache_web {
server 192.168.10.101:80;
server 192.168.10.102:80;
server 192.168.10.103:80;
}

웹 서버의 도메인을 example-proxy.com 이라고 가정했을 경우 아래와 같이 설정 파일을 작성하시면 됩니다. example-proxy.conf 파일로 해당 도메인의 /와 /app로 접속 시 위에서 설정한 서버들로 Proxy 해 주는 예제입니다. URL 경로(path)가 / 일 경우 apache_web으로 Proxy 하고 /app로 접속 할 경우 apache_tomcat으로 Proxy 하게 됩니다. 동일한 서비스의 다중 서버를 구성한 뒤 upstream에 추가해주면 로드밸런싱이 적용됩니다.

sudo vi /etc/nginx/conf.d/exampale-proxy.conf
server {
liseten 80;
server_name example-proxy.com;
location / {
proxy_pass http://apache_web/;
}
location /app {
proxy_pass http://apache_tomcat/;
}

 

%d 블로거가 이것을 좋아합니다: