[DEV] 기록

[Nginx] Nginx Reverse Proxy 정리

구데타마 2022. 5. 17. 01:58

개요

고객사의 요청사항으로 인해 File IO 관련 프로세스는 별도의 파일 인스턴스를 띄운 뒤 해당 인스턴스에서 진행하게 되었습니다.

이에 따라 Nginx 프록시 서버를 두 WAS 앞에 배치하여 파일 관련 api는 파일 인스턴스에서 처리하고 나머지 api는 다른 WAS에서 처리하도록 Nginx 역방향 프록시를 적용했습니다.

앞으로 이런 설정을 자주 적용할 것 같아 간단하게 Nginx Reverse Proxy에 대해 정리해보고 설정 방법을 간단히 공유하겠습니다.

 

 

1. Nginx Reverse Proxy란?

Nginx Reverse Proxy는 클라이언트에서 서버가 제공하는 서비스 접근 시 Proxy 서버를 먼저 거쳐서 서버로 들어오는 방식입니다.

Nginx 역방향 프록시를 적용함으로써 얻을 수 있는 이점은 아래와 같습니다.

  • Load Balancing: Nginx는 클라이언트의 요청을 프록시 서버에 분산하기 위해 로드 밸런싱 수행, 이에 따라 성능, 확장성 및 신뢰성 향상 가능
  • Caching: 프록시 서버의 응답에서 수신한 콘텐츠를 캐싱하고 해당 콘텐츠를 사용하여 매번 동일한 콘텐츠를 프록시 서버에 연결할 필요 없이 클라이언트에 응답하기 때문에 페이지 로드 시간을 단축할 수 있음 (미리 렌더링 된 버전의 페이지를 캐싱)
  • SSL Termination: Nginx는 클라이언트와의 연결에 대한 SSL 끝점 역할, 수신 SSL 연결을 처리 및 해독하여 프록시 서버의 응답 암호화
  • DDOS 공격 완화: 수신 요청과 단일 IP 주소 당 연결 수를 일반 사용자에게 일반적인 값으로 제한하여 엑세스를 제한할 수 있고 클라이언트의 위치와 "User-Agent" 및 "Referer" 기반으로 액세스 차단 및 제한 가능

 

https://www.cloudqubes.com/hands-on/linux/setting-up-an-nginx-reverse-proxy-for-openstack/

 

2. Nginx, Tomcat 설치 및 Nginx 설정

현재 CentOS 7 EPC 내 Tomcat 폴더에 WAR 파일을 추가하는 방식으로 배포하고 있기 때문에 Nginx와 Tomcat을 설치하고 연동을 진행해야 합니다.

해당 내용은 아래 링크에 잘 정리가 되어있습니다.

 

https://shine-yeolmae.tistory.com/28

 

CentOS7 + Nginx + Tomcat 설치 및 연동

Nginx 설치 0. Nginx의 장점 Apache와 달리 구성 시스템이 없어 빠른 속도 Request 에 대해 Event-Driven 방식으로 동작 정적 파일에 대해 Apache 요청의 2배량을 제공 2019년 4월 기준 Apache 사용량 추월 A. yum..

shine-yeolmae.tistory.com

 

Nginx가 설치 후 /etc/nginx 경로nginx.conf 파일을 vim으로 열어보면 아래와 같은 코드가 존재합니다.

 

# Load modular configuration files from the /etc/nginx/conf.d directory.
 # See http://nginx.org/en/docs/ngx_core_module.html#include
 # for more information.
 include /etc/nginx/conf.d/*.conf;

 

해당 줄은 /etc/nginx/conf.d 폴더 내 .conf 파일들을 포함한다는 뜻인데 해당 경로 내 default.conf 파일의 내용을 다 지우고 reverse proxy 설정을 작성해주면 됩니다.

개요에서도 말했다시피 저는 /file/**로 시작하는 api에 대해서는 file 인스턴스로 나머지 api에 대해서는 다른 WAS에서 처리하도록 설정했습니다.

이와 같은 설정은 아래와 같이 진행해주시면 됩니다.

 

server {
    client_max_body_size 500M;
    listen [포트번호];
    server_name [서버 ip 혹은 domain명];
    
    location ^~ /file {
    	proxy_pass [파일 인스턴스 ip:port];
        proxy_http_version 1.1;
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    
    location / {
        proxy_pass [다른 인스턴스 ip:port];
        proxy_redirect [다르 인스턴스 ip] [다른 인스턴스 ip:port]
        proxy_http_version 1.1;
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

 

  • client_max_body_size를 통해 파일 업로드 크기 제한 변경
  • proxy_redirect 설정을 통해 포트 번호 없이 ip만 입력하더라도 정상적으로 웹사이트가 뜰 수 있도록 설정
  • listen과 server_name 설정을 통해 웹서버의 ip 및 port 설정
  • /file/** api에 대해서는 파일 인스턴스로 포워딩해주도록 proxy_pass 설정
  • / 즉, 나머지 api에 대해서는 다른 WAS로 포워딩해주도록 proxy_pass 설정
  • 디폴트 HTTP 프로토콜 버전이 1.0이므로 proxy_http_version 1.1을 통해 1.1로 설정
  • HOST $host: 클라이언트가 요청한 호스트 정의
  • X-REAL-IP $remot_addr: 실제 방문자 원격 IP 주소를 proxy 주소로 전달
  • X-Forwarded-For $proxy_add_x_forwarded_for: 클라이언트가 프록시 처리한 모든 서버의 IP 주소를 포함하는 목록

 

설정을 변경한 후에는 아래와 같이 nginx 재기동을 해야 설정이 적용됩니다.

 

/etc/init.d/nginx restart

 

* SSL 설정은 아래 링크 참고

https://docs.nginx.com/nginx/admin-guide/security-controls/securing-http-traffic-upstream/

 

Securing HTTP Traffic to Upstream Servers | NGINX Plus

Securing HTTP Traffic to Upstream Servers Secure HTTP traffic between NGINX or NGINX Plus and upstream servers, using SSL/TLS encryption. This article explains how to encrypt HTTP traffic between NGINX and a upstream group or a proxied server. Prerequisite

docs.nginx.com

 

3. 세션 관련 Tomcat 설정

파일 인스턴스에 api를 호출할 때 파일 업로드/다운로드 권한이 있는지 확인을 해야 합니다.

제일 좋은 방법은 redis를 통해 두 WAS 간 세션 클러스터링을 진행하는 방법이지만 redis 서버 증설 예산을 할당해줄지 모르기 때문에 다른 방법으로 권한 체크를 해야 합니다.

세션 클러스터링이 안되어있기 때문에 두 WAS 모두 로그인 정보를 쿠키에 JSESSIONID로 저장하게 될 경우 정보가 덮어씌워져 로그인 페이지로 리다이렉트 되는 상황이 발생합니다.

이에 따라 저는 파일 인스턴스의 context.xml 내 sessionCookieName을 아래와 같이 변경하여 위 문제를 해결했습니다.

 

<?xml version="1.0", encoding="UTF-8"?>
<Context sessionCookieName="FS_JSESSIONID">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
</Context>

 

이렇게 설정하면 파일 api 호출 후 로그인 페이지로 리다이렉트 되는 문제는 해결되지만 파일 인스턴스 내에서 권한 체크를 할 수 없는 문제점이 여전히 존재합니다.

이를 위해 파일 api를 호출하기 전에 파일 인스턴스가 아닌 WAS에 api를 호출하여 JWT 토큰을 받아 쿠키에 넣어주고 파일 서버 필터단에서 JWT를 꺼내 권한 체크를 하는 방식으로 진행하고 있습니다.

 

4. 비고

  • Forward Proxy: 내부망 PC 혹은 서버들이 인터넷을 접속할 때 먼저 Proxy 서버를 거쳐서 인터넷에 연결되는 방식
  • Load Balancer: 부하 분산 집합에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할

 

출처

https://jjeongil.tistory.com/1490

 

Linux : Nginx Reverse Proxy 설정 방법, 예제, 명령어

역방향 프록시는 클라이언트 요청을 가져와서 하나 이상의 프록시 서버에 요청을 보내고 응답을 가져오고 서버의 응답을 클라이언트에 전달하는 서비스입니다. 성능과 확장성 때문에 NGINX는 HTT

jjeongil.tistory.com

https://medium.com/sjk5766/nginx-reverse-proxy-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-e11e18fcf843

 

Nginx Reverse Proxy 사용하기

호주로 해외여행을 간다고 생각해보자. 중국을 경유하여 가는 비행기 티켓을 구매했다. Proxy랑 엮어보면 인천공항은 출발지, 중국은 Proxy가 되며 호주가 실제 목적지가 된다. Proxy 서버란, 중계

medium.com

 

반응형