본문 바로가기
  • 포르쉐타고싶다
인포테인먼트 - development/웹 서버

[nginx] 포트포워딩, 그리고 리버스 프록시(Port Forwarding, and Reverse Proxy)

by 지오ㄴl 2020. 3. 28.

1. 배경

 

포트포워딩은 nginx의 가장 기본적인 기능이다.

한 웹서버 안에서는 한 가지의 서버만 존재하지는 않는다. 

api서버와 웹 페이지 서버도 있을 수 있고, 랜딩페이지 서버도 같이 있을 수 있고.. 관리자 페이지 서버 등등

여러개의 서버가 같은 웹서버에 같이 있을 수 있다.

그리고 이 서버들은 각각 다른 포트를 갖고있다.(localhost:3000, localhost:3001, ...)

 

웹 서버는 어떻게 같은 도메인을 요청했을 때 이를 알아채고

적절한 서버를 선택하여 보내줄 수 있는 것일까

 

바로 nginx의 포트포워딩(port forwarding)기능 덕분이다. 

 

2. 개념

 

Port Forwarding : 포트 인도

즉, 서버에 들어온 요청을 다시 내부의 특정 포트로 보내주는 것이다. (특정 포트 = 특정 서버)

 

그래도 웹서버가 클라이언트의 마음을 텔레파시(?)로 읽고

로컬 포트를 정해주지는 못하지 않는가(그런 ai가 있나..)

 

그러니까 적어도 웹서버가 요청에 대한 적절한 로컬 포트를 정하기 위한

약속이 필요한 것이다.

 

그 약속은 크게 두 가지로 정할 수 있다.

1) URI 머리(도메인 호스트)로 구별하기로 약속한다

2) URI 꼬리(location)로 구별하기로 약속한다.

 

3. 사용 방법

 

1) 도메인 호스팅으로 구별한다. - 'server_name'

 

입력 URI의 '머리'로 구별한다.

 

- 웹서버에 도메인(test.com)을 구입해서 적용하면

그 도메인을 여러가지로 호스팅(api.test.com)할 수 있다.

 

같은 Public IP로 웹서버에 들어간다 해도

'어떻게 들어가냐'에 따라 포트를 나누는 것이다.

 

예를 들어 

123.45.67.89의 IP를 가진 웹서버가 있다고 하자

해당 IP에 대해

test.com 라는 도메인을 등록한다고 할 때

api.test.com 라는 레코드(호스트)를 추가했다고 하자.

 

이제 test.com, api.test.com 을 다이렉팅하면 둘 다

웹서버의 default로 설정되어있는 서버로 포팅된다.

 

이제 api.test.com을 default 서버가 아닌 웹서버 내에서 새로운 서버(localhost:3003)로 포팅해보자

 

/etc/nginx/sites-enabled
//혹은
/etc/nginx/sites-available(symlink 필요)

에 새로운 프록시를 설정하는데

다음을 추가한다.

 

server {
    listen 80;
    server_name api.test.com	// 이 웹서버에 어떤 방식으로 들어왔는지 확인
    
    location / {
    	proxy_pass http://127.0.0.1:3003;
    }
}

 

위의 server_name으로 어떻게 (호스팅해서)들어왔는지를 확인하여

nginx의 default서버로 로컬 포팅하는 'test.com'과 달리

 

default서버가 아닌 localhost:3003 에 존재하는 서버로 보내주게 된다

 

2) URI로 구별한다. - 'location'

 

이번엔 입 URI의 '꼬리'를 본다.

즉, test.com과 test.com/admin이 같은 웹서버 내 전혀다른 서버로 다이렉팅되는 것이다.

 

위의 가정과 똑같이

이번엔 웹서버 안에 

1. default 서버

2. admin 서버(localhost:3009)

가 있다고 해보자.

 

포트포워딩이 안되어있는 상태에서는

test.com/admin을 다이렉팅하면, default 서버에 /admin이 라우팅되지 않은 이상

not found 에러가 날 것이다.

 

그렇다면 test.com/admin 을 웹서버 내에서 새로운 서버(localhost:3003)로 포팅해보자

방법은 쉽다.

location의 옆에 꼬리를 이름을 정해주는 것이다.

server {
    listen 80;
    
    location /other/ {
    	proxy_pass http://127.0.0.1:3003/;
    }
}

 

이렇게 URI의 꼬리만 바꾸어 서로 다른 서버를 요청할 수 있는것이다.

반응형

댓글