Nginx Reverse Proxy Test : Path-Based Routing - 내부 서버에 요청하는 경로 변경

SummerToday·2024년 3월 22일

도커, 서버 기술

목록 보기
27/34
post-thumbnail

내부 서버에 요청하는 경로 변경

서버 구성의 편의상 이유 등으로 클라이언트가 proxy에 /blog/index.html로 요청했을 때, 내부 nginx에서는 자신의 서버 /index.html을 요청한 것처럼 경로를 변경하는 경우가 존재한다.

prpoxy 요청: localhost/blog/index.html
내부 nginx 요청: loclahost/index.html

위 내용과 같이 내부 서버에 요청하는 경로를 변경해주기 위해서는 rewrite 설정을 해줘야한다.


rewrite 옵션

Nginx에서 rewrite 옵션은 클라이언트의 요청을 재작성하거나 리디렉션하는 데 사용된다. 해당 옵션을 사용하여 요청된 URL을 다른 경로로 변경하거나 조작할 수 있다.
따라서 nginx/nginx.conf 파일에서 docker-nginx 설정에서 rewrite 옵션을 추가해준다.


nginx/nginx.conf

// nginx- nginx.conf

server  {
    location /blog/ {
        rewrite ^/blog(.*)$ $1 break;
        proxy_pass         http://docker-nginx;
         proxy_redirect     off;
         proxy_set_header   Host $host;
         proxy_set_header   X-Real-IP $remote_addr;
         proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header   X-Forwarded-Host $server_name;
    } 
}

rewrite 옵션 이해

rewrite regex URL [flag];

  • regex
    요청된 URL을 매칭하기 위한 정규 표현식이다. 요청된 URL의 일부 또는 전체를 매칭할 수 있다.

    nginx에서 채택한 정규 표현식 문법은 PCRE(Perl Compatible Regular Expression) 구문으로, 본래 Perl이라는 언어에서 유래된 것이다.

  • URL
    요청된 URL을 변경하거나 리디렉션할 대상 URL이다. 해당 URL은 내부 경로나 외부 URL이 될 수 있다.

    . : 임의의 한 문자 의미.
    \. : 문자 자체로의 .을 의미

  • flag
    여러개의 loaction이 설정되어 있을 때, 변경된 URl이 다시 다른 location에 매칭될 수 있으므로, 이를 어떻게 처리할 지 결정하는 옵션이다.

    다음 주요 플래그들이 존재한다.

    • last
      해당 플래그는 다른 지시어(예: location)에 일치하지 않으면 현재 rewrite 블록을 빠져나가고 새로운 요청을 처리한다.

    • break
      해당 플래그는 현재 rewrite 블록 내의 다른 지시어를 무시하고 현재 블록에서 빠져나가도록 한다.

    • redirect 또는 permanent
      해당 플래그는 요청을 새로운 URL로 리디렉션하며, redirect는 임시 리디렉션을 수행하고 permanent는 영구적인 리디렉션을 수행한다.

    • if_not_modified
      해당 플래그는 요청이 변경되지 않았을 때만 리디렉션을 수행한다


rewrite ^/blog(.*)$ $1 break;

  • ^
    문자열 시작을 나타낸다.

    ex. localhost/blog/test.html의 경우 loacalhost는 주소이므로 /blog/test.html이 location에 들어오게 된다. 따라서 ^(/blog)는 우선 URL이 /bolg로 시작하는 경로를 의미한다.

  • .
    임의의 한 문자를 의미한다.

  • *
    0회 이상임을 의미한다.

  • $
    문자열의 끝을 의미한다.

    ex. /blog$는 문자열이 /blog로 끝나는 경우에만 일치한다.

  • ^/blog(.*)$
    경로가 /blog로 시작하면서, 그 이후에 어떤 경로든 끝까지를 의미한다.

  • $1
    괄호 부분 (.)을 의미하는 부분이다. 즉, $1은 첫 번째 캡처 그룹에 일치하는 부분을 나타낸다. 예를 들어, 만약 정규 표현식이 (.)로 정의된다면, 이는 전체 문자열을 캡처하는 하나의 캡처 그룹을 나타낸다.

    location /blog/ {
        rewrite ^/blog(.*)$ $1 break;
        proxy_pass         http://docker-nginx;      
        ~ 생략 ~
      } 
    }
  • 따라서 위와 같이 작성 시, 경로에서 /bolg를 뺸 다른 경로만을 http://docker-nginx에 전달하라는 의미이다.

Nginx 참고 설정

에러 페이지 설정

특정 HTTP 에러에 따라 설정한 별도 에러 페이지를 보여주기 위해서 다음과 같이 설정한다.

error_page  403 404 405 406 411 500 501 502 503 504 505 /error.html;
location = /error.html  {
    root /usr/share/nginx/html;
}
  • location = /error.html
    URL이 /error.html일 때만을 의미한다.

  • root /usr/share/nginx/html;
    해당 /usr/share/nginx/html 경로에 있는 html 파일을 표시한다.


캐시 설정

HTTP 응답에 다음과 같이 잘 변하지 않는 ico, cso 등으로 끝나는 파일들은 브라우저 캐시상에서 최대한 보관하라는 명령을 넣을 수 있다.
해당 경우, 웹페이지 로딩 속도는 개선되지만, 해당 파일이 변경될 가능성이 있다면, 업데이트가 안되므로 불변하는 파일만 설정하는 것이 좋다.

location ~* \.(ico|css|js|gif|jpe?g|png)$ {
  expire max;
  add_header Pragma public;
  add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
  • location의 ~*는 이후 나오는 정규 표현식에 대소문자 구별을 안한다는 의미이다.

    location 이후에 ~(틸트)문자가 올 경우, 이후의 표기는 정규 표현식으로 처리한다.

  • jpe?g
    jpe?g에서 ?는 바로 앞의 문자 e가 있을 수도 있고 없을 수도 있다는 것을 의미한다. 이것은 정규 표현식의 메타 문자 중 하나로, 앞의 문자가 0회 또는 1회 나타날 수 있음을 나타낸다.
    따라서 jpeg나 jpg를 의미하게 된다.

  • expire max;
    Expires 헤더를 max 값으로 설정하여 브라우저 캐시에 대한 만료 시간을 최대로 설정한다. 해당 설정을 통해 클라이언트가 정적 파일을 캐시로 저장하고 더 이상 요청하지 않아도 되므로 웹 페이지의 성능을 향상시킬 수 있다.

  • add_header Pragma public;
    Pragma 헤더를 public 값으로 설정하여 프록시 및 캐시 서버에 대한 캐싱을 허용한다.

  • add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    Cache-Control 헤더를 설정하여 캐시 동작을 지정한다. public은 응답이 공개적으로 캐시될 수 있음을, must-revalidate는 캐시 유효성을 검증하도록 요청하는 것을, proxy-revalidate는 프록시 서버도 캐시의 유효성을 검증하도록 하는 것을 나타낸다. 해당 설정들은 캐시가 정확히 동작하고 최신 버전의 파일이 클라이언트에 제공되도록 보장하기 위해서 설정한다.

참고 사이트




해당 글은 다음 강의의 내용을 참고한 글임을 밝힙니다. 자세한 내용은 다음 강의에서 확인해볼 수 있습니다.
인프런, 잔재미 코딩, ⌜풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, flask 배포) [풀스택 Part3]⌟
profile
블로그 이관했습니다.

0개의 댓글