이 글은 2년 이상 지난 이야기에요. 읽으실때 참고!
Nginx 서브 디렉토리 역방향 프록시 설정

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

마스터 소스에서 하위에 클라이언트가 붙고 클라이언트는 아래처럼 각자 고유 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 어렵다!!

 

D.2019-03-27 V.404