logo

Nginx 서브 디렉토리 역방향 프록시 설정

Server Side March 27, 2019

진행하는 프로젝트 중의 하나가 마스터 소스로 돌아갈 계획입니다.

마스터 소스에서 하위에 클라이언트가 붙고 클라이언트는 아래처럼 각자 고유 url 주소를 부여 받습니다.

 

고객1: domain.com/asia/

고객2: domain.com/africa/

 

마스터 소스는 domain.com 의 루트에 종속되어있으므로 실제로 asia 와 africa 의 폴더명은 존재하지 않습니다. 말그대로 클라이언트 구분에만 쓰이는 지시자이죠.

그래서 asia 클라이언트가 domain.com/board/list.php 에 접근한다면 실제로는 domain.com/asia/board/list.php로 접근해야만 asia 클라이언트 만의 게시판 페이지가 보이는 겁니다.

 

원래라면 asia.domain.com 처럼 서브 도메인으로 이런 처리를 진행하지만 현재 진행하고 있는 프로젝트 특수성 상 하위도메인으로 이것을 구분해야 합니다.

 

여튼 이런경우는 nginx 의 rewrite 기능을 사용하기가 좀 애매하고 proxy_pass 기능을 이용해서 루트경로로 호출을 전환해줄 겁니다.

역방향 프록시에 대해서는... 지금 이 글을 쓰는 상황에서도 이해안가는게 있어서 자세하게 설명하긴 뭐하고 출처의 링크에 관련 기술문서와 설명해주신 분들에 대한 정보를 남길게요.

 

우선 위에 경우에 대해서 적용한 제 nginx 설정은 아래와 같습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#sudo vi /etc/nginx/sites-available/default
 
server {
    ...
 
    # sub directory setting
    location ^~ /asia {
        proxy_pass http://localhost/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
 
    ...
 
cs

 

레퍼런스의 경우처럼 마지막에 뎁스 구분자인 슬래시(/)의 표현 위치에 따라 프록시에 전달되는 링크의 차이가 크더군요. 저같은 경우는 /asia로 요청된 건에 대해서 루트로 옮겨야해서 위에 처럼 적용했습니다.

또 더불어 프록시 연결시에는 프록시 서버가 일부 헤더 설정을 덮어씌웁니다. 대표적으로 requested_uri 설정을 많이들 덮어 쓴다고 하더라고요. 그래서 프록시 설정부분에 아래 코드를 더 추가해줍니다.

 

더해서 프록시 연결을 받는 location 에는 아래 코드를 추가해줍니다. 프록시 연결이 장기간 되지않을 경우 타임아웃을 걸어 핸들링을 관리합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#sudo vi /etc/nginx/sites-available/default
 
server {
    ...
 
    # response proxy setting
   location ~ \.php$ {
        ...
 
        proxy_connect_timeout 300;proxy_send_timeout 300;
        proxy_read_timeout 300;
        send_timeout 3000;
    }
 
    ...
 
cs

 

Nginx 어렵다!!