Web-Network

[mac] Nginx Tomcat 연동 - nginx 스프링 내장 톰캣 리다이렉트 방법 (Proxy Server)

민돌v 2022. 7. 24. 00:43

 

 

요거 다음으로 도커로 nginx 랑 스프링부트 띄우는건 요글을 봐주세영

https://thalals.tistory.com/343

 


mac 로컬환경에서 진행했습니다.

 

 

✨ Nginx 를 aws 앞에 web server 로 두고, 리버스 프록시 서버로 사용해보자 ! ! 

 

 

1. nginx 요청을 spring boot 로 리다이렉트!!

현재 이전 게시물 까지 진행해서, mac 로컬 환경에서, nginx 는 8090 포트로 변경해놓은 상태고 jar 파일도 백그라운드에서 실행시킨 상태

 

 

 

 

📌 이제 이걸, nginx 8090 포트로 접속하면, spring 내장 톰캣이 띄어놓은, 8080 포트로 리다이렉트 시키고자 한다.

( 그냥 리다이렉트 시키는게 리버스 프록시를 두는 의미가 있는건가,,?)

  • 의문을 가졌는데, Nginx 자체에서 리버스 프록시 기능을 해서 로드밸런싱 기능을 해주고
  • 앞에 프록시 서버가 요청을 전부 받음으로써, 내부 was 를 클라이언트한테 숨길 수 도있고 이렇게 단순하게 리다이렉트로의 의미만을 가지는 건 아닌것같다.

 


 

2. Nginx 리다이렉트 포트 설정 변경

  • nginx 설정을 바꿈으로 써 nginx 로 들어오는 요청을 spring boot 포트와 연결해 보장

📌 nginx 설정 변경 방법

  • vi /nginx 경로/nginx.conf
  • ex) vi /usr/local/etc/nginx/ nginx.conf
server {
        listen       8090;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

	... 생략
    }

 

 

➡️ 여기서 location 설정 부분에, proxy_pass 옵션을 추가해주어야 한다고 합니다.

server {
        listen       8090;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            
            // ----- 여기 추가 ----------//
            proxy_pass http://localhost:8080;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
        }

	... 생략
    }

 

proxy_pass http://localhost:8080
  • Nginx에게 모든 요청 ( server_name:: listen 형식의 모든 요청 ) 을 /app 위치에 http://127.0.0.1:8080으로 프록시 서버로 전달하도록 지시합니다.

 


 

Nginx 프록시 서버 설정 옵션

이렇게 하면, Nginx 서버가 Reverse Proxy 역할을 하게되는데 SpringBoot 서버에선 요청한 클라이언트의 IP 주소를 Nginx 서버의 IP 로 인식하게 됩니다.

 

띠라서 다음과 같은 설정을 해줘야한다.

  • Real-IP -> 실제 접속 IP
  • Forwarded-For -> 프록시 서버가 여러개일때의 주소
  • Host -> 요청 필수 값

 

그러면,, !! 8090 포트로 접속해도, nginx 가 아닌, 내장톰캣으로 요청되고 응답이 왔따!

포스트맨 요청도 야무지게 잘 받는다

 

 


 

참고용 Nginx 프록시 템플릿

 

 

 

일반 Nginx 역방향 프록시 옵션

요즘은 HTTPS를 통한 컨텐츠 제공이 표준이 되었습니다. 이 섹션에서는 권장되는 Nginx 프록시 매개 변수 및 헤더를 포함하여 HTTPS Nginx 역방향 프록시 구성의 예를 제공합니다.

  location/ {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version  1.1;
    proxy_cache_bypass  $http_upgrade;

    proxy_set_header Upgrade           $http_upgrade;
    proxy_set_header Connection        "upgrade";
    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-Proto $scheme;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Port  $server_port;
  }
  • proxy_http_version 1.1 - 프록시를 위한 HTTP 프로토콜 버전을 정의합니다. 기본적으로 1.0으로 설정됩니다. 웹 소켓 및 활성 연결을 유지하려면 버전 1.1을 사용해야 합니다.
  • proxy_cache_bypass $http_upgrade - 캐시에서 응답을 가져오지 않을 조건을 설정합니다.
  • Upgrade $http_upgrade 및 Connection "upgrade" - 응용프로그램이 웹 소켓을 사용하는 경우 헤더 필드가 필요합니다.
  • Host $host - 다음 우선 순위의 $host 변수에는 요청 라인의 호스트 이름 또는 호스트 요청 헤더 필드의 호스트 이름 또는 요청과 일치하는 서버 이름이 포함됩니다.
  • X-Real-IP $remote_addr - 실제 방문자 원격 IP 주소를 프록시 서버로 전달합니다.
  • X-Forwarded-$proxy_add_x_forwarded_for - 클라이언트가 프록시 처리한 모든 서버의 IP 주소를 포함하는 목록입니다.
  • X-Forwarded-Proto $scheme - HTTPS 서버 블록 내에서 사용할 경우 프록시 서버의 각 HTTP 응답이 HTTPS로 다시 작성됩니다.
  • X-Forwarded-Host $host - 클라이언트가 요청한 원래 호스트를 정의합니다.
  • X-Forwarded-Port $server_port - 클라이언트가 요청한 원래 포트를 정의합니다.

 

기존 SSL/TLS 인증서가 없는 경우 certbot을 사용하여 Ubuntu 18.04, CentOS 7 또는 Debian 서버에서 무료 SSL 암호화 인증서를 얻습니다.

 

 

 


*참고

https://jjeongil.tistory.com/1490