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 설정은 아래와 같습니다.
#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;
}
...
Copy
레퍼런스의 경우처럼 마지막에 뎁스 구분자인 슬래시(/)의 표현 위치에 따라 프록시에 전달되는 링크의 차이가 크더군요. 저같은 경우는 /asia로 요청된 건에 대해서 루트로 옮겨야해서 위에 처럼 적용했습니다.
또 더불어 프록시 연결시에는 프록시 서버가 일부 헤더 설정을 덮어씌웁니다. 대표적으로 requested_uri 설정을 많이들 덮어 쓴다고 하더라고요. 그래서 프록시 설정부분에 아래 코드를 더 추가해줍니다.
더해서 프록시 연결을 받는 location 에는 아래 코드를 추가해줍니다. 프록시 연결이 장기간 되지않을 경우 타임아웃을 걸어 핸들링을 관리합니다.
#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;
}
...
Copy
Nginx 어렵다!!