개발자의 하루

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;
  }
}
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;
  }
}

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

톺아보기

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;
  }
}

다른 서버로 보낼때

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

server {
  location /emoji/ {
    #...
    proxy_set_header	Host other.server; # 두 서버에서는 other.server을 host로 인식.
  }
}

etc

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

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

참고