상현
개발 덕후

Nginx 하위 endpoint 다른 서버, 경로 보내기

( 업데이트: )

들어가기전에

개인적으로 필요한 API를 만들어서 사용한다 api.nas.hyeon.pro로 구성되어있는데 처음에는 메타크롤러의 api만 연결하여 사용했다. 하지만 API들을 여러개 만들게 되면서 어떻게 관리해야할까 고민했다. URL을 더 만들어서 연결하기에는 URL관리측면에서 매번 서버랑 연결해야하는 귀찮이즘이있었다. 그래서 end-point를 여러개로 나눠서 구성해야겠다 생각했다

여러개의 end-point 어떻게 연결하지?

어떻게 구성할까 고민하다가 K8Snginx-ingress가 생각났다. 그래서 nginx의 하위 엔드포인트를 컨테이너로 연결하기로 생각하였다.

그러면 어떻게 하위 경로를 다른 서버, 경로로 보낼까?

연결 방법

api.nas.hyeon.pro/seo엔드포인트는 localhost:8080으로 보내고 api.nas.hyeon.pro/emojilocalhost:8081으로 보낸다 설정하려면

server {
  location /seo/ {
    rewrite ^/seo(/.*)1 break;
    proxy_pass		http://127.0.0.1:8080;
    proxy_set_header	Host $host;
    proxy_set_header	X-Real-IP $remote_addr;
    proxy_set_header	X-Proxy-From api.nas.hyeon.pro;
    proxy_redirect	off;
  }
}Code language: JavaScript (javascript)
server {
  location /emoji/ {
    rewrite ^/emoji(/.*)1 break;
    proxy_pass		http://127.0.0.1:32772;
    proxy_set_header	Host $host;
    proxy_set_header	X-Real-IP $remote_addr;
    proxy_set_header	X-Proxy-From api.nas.hyeon.pro;
    proxy_redirect	off;
  }
}Code language: JavaScript (javascript)

이렇게 설정하면 별개의 로컬호스트 내부의 포트로 연결된다.

톺아보기

server {
  location /emoji/ {
    rewrite ^/emoji(/.*)1 break;
    proxy_pass		http://127.0.0.1:32772;      # 프록시로 전달해야할 URL, IP
    proxy_set_header	Host $host;                  # 호스트 설정
    proxy_set_header	X-Real-IP $remote_addr;      # 실제 접속자의 IP를 X-Real-IP 헤더에 입혀서 전송
    proxy_set_header	X-Proxy-From api.nas.hyeon.pro;   # 어디에서 왔는지 전송, 프록시가 여러대이고 어디서 왔는지 인식해야 한다면 추가
    proxy_redirect	off;
  }
}Code language: PHP (php)

다른 서버로 보낼때

위처럼 다른서버 IP나 URL로 보내면 nginx 기본 페이지가 출력되는 것이다. 왜? 그런가 살펴보니 api.nas.hyeon.pro라는 request 원래 서버의 호스트가 아니라서 그런것이었다. 그래서 Host를 변경해서 별개로 넣어주면 됩니다.

server {
  location /emoji/ {
    #...
    proxy_set_header	Host other.server; # 두 서버에서는 other.server을 host로 인식.
  }
}Code language: PHP (php)

etc

만약 두 서버간의 사양이 달라서 처리양이 다르면 weight를 통해서 설정이 가능

upstream other {
    server api.nas.hyeon.pro:80 weight=1;
    server api.nas.hyeon2.pro:80 weight=3;
}

참고