Nginx를 이용한 Reverse Proxy 및 캐시 설정
본문 바로가기
DevOps 부트캠프/네트워크

Nginx를 이용한 Reverse Proxy 및 캐시 설정

by liveloper jay 2022. 3. 30.

이번 포스팅에서는 nginx를 이용하여 리버스 프록시 및 캐시 설정을 간단한 예제와 함께 알아보겠습니다.

 

 

Reverse Proxy


💡 Reverse Proxy란?

 Nginx가 클라이언트로부터 전달받은 요청을 애플리케이션 서버에 전달한 뒤, 애플리케이션 서버가 반환한 결과값을 다시 클라이언트에 전달하는 방법입니다.

 

 

프록시 서버에 요청 전달

먼저 Reverse Proxy 설정을 위해 먼저 nginx.conf 파일을 찾은 후 해당 파일에서 편집기를 실행합니다. 
(필자의 경우 Ubuntu 20.04 LTS 환경에서 진행중,  /etc/nginx 경로에 해당 파일이 존재하는 것을 확인하였습니다)

//nginx.conf 위치 찾기
whereis nginx.conf
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx  (이 라인은 명령에 해당하는 결과값입니다.)

// nano 편집기를 이용해 해당 nginx.conf 편집진행
sudo nano /etc/nginx/nginx.conf

 

nginx.conf 내에서 프록시 서버에 요청을 전달하기 위해 http 부분을 찾아 proxy_pass를 통해 Origin Server의 url을 지정해줍니다.

http{
	server {
         listen 10026;
         server_name localhost;


         location / {
		  proxy_pass {Origin_Server_Path};
         }
}

 

 

요청 헤더 전달

 기본적으로 nginx는 요청에서 “Host”,”Connection” 두 헤더 필드를 재정의 하고, 빈 문자열인 헤더 필드를 제거합니다. 여기서 설정을 변경하거나 헤더 필드를 수정하고 싶으면 proxy_set_header 를 사용합니다. 예시는 다음과 같습니다.

http{
	server {
         listen 10026;
         server_name localhost;


         location / {
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_pass {Origin_Server_Path};
         }
}

여 과정까지 마치셨으면 변경사항 적용을 위해 sudo service nginx start 를 통해 nginx를 실행시켜줍니다. 그 후  localhost:10026 으로 접속하면 정상적으로 실행됨을 확인할 수 있습니다.

 

 

 

 

 

Cache 설정


먼저 예제를 확인 후 하나하나 설명을 진행하도록 하겠습니다.

http {
	proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=10g inactive=5s use_temp_path=off;   

	server {
     listen 8000;
     server_name localhost;


     location / {
      proxy_cache mycache;
      proxy_pass <http://3.35.135.185:8080/>;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header myname devops01-kwakjaeyoon;
      proxy_cache_lock_timeout 5s;
      proxy_cache_methods GET HEAD POST;
      proxy_cache_valid  200 401 301 304  5s;
     }
    }

 

1. proxy_cache_path

캐시의 경로와 매개변수를 설정합니다. 해당 경로에 디렉토리가 존재하여야하며, path 뒤에 있는 내용들로 설정을 진행합니다. 세부 내용은 다음과 같습니다.

  • /var/cache/nginx : 캐시의 local disk 디렉토리 입니다.
  • levels : 설정된 경로 아래에 디렉토리의 계층을 설정합니다. 보통 2계층만 설정하여도 충분합니다.
  • key_zone : 캐시 키로 사용될 이름과 크기를 설정합니다.
  • max_size : 캐시 크기의 상한선을 설정합니다(선택사항).
  • inactive : 삭제되지 않고 캐시에 남아있을 수 있는 기간을 지정합니다.
  • use_temp_path=off : 임시 저장영역에 기록되어 있는 파일을 캐시될 동일한 디렉토리에 작성하도록 합니다.

 

2. proxy_cache_lock

여러 클라이언트가 캐시에 최신이아닌 파일을 요청하는 경우, 첫번째 요청만 Origin 서버를 통해 통과할 수 있고 나머지는 대기 후 캐시에서 파일을 가져옵니다.

 

3. proxy_cache_methods

클라이언트 요청 메서드 목록을 지정해줍니다. “GET” 과 “HEAD” 메서드는 default로 지정되어있지만 명시적으로 지정해 주는 것이 좋습니다.

 

4. proxy_cache_valid

valid 뒤에 오는 응답 코드에 대해 캐싱 시간을 설정해 줍니다. 응답코드 대신 any를 작성할 경우 모든 응답 코드에 대한 캐싱시간을 설정해줍니다.

이 외에도 더 많은 캐시 설정에 관련된 지시어들은 맨 아래의 참고자료 링크에서 확인해 주시면 될 것 같습니다.

 

 

 

 

 

설정한 캐시를 확인


위의 캐시 설정을 마치고 난 후, add_header를 통해 헤더를 추가하고 확인할 수 있습니다. nginx.conf 에 다음과 같이 추가해주면 됩니다.

server {
     listen 8000;
     server_name localhost;


     location / {
      ......
      proxy_cache_methods GET HEAD POST;
      proxy_cache_valid  200 401 301 304  5s;
      add_header X-Cache-Status $upstream_cache_status;
      add_header Cache-Control "public";
     }
    }

 

작성을 완료하였으면 저장 후 , sudo service nginx restart 를 통해 nginx를 재시작한 후 다음과 같이 입력해줍니다.

// -I 뒤에는 확인할 주소 입력
curl -I http://localhost:8000

이 명령어를 최초 입력, 2번째 입력, 그로부터 5초후 입력 → 3번에 걸쳐 입력한 후 확인하면 X-cache-status 값이 3번 다 다르게 나온 것을 확인할 수 있습니다.

 

 

X-Cache-Status Value

MISS : 캐시에서 응답을 찾을 수 없어 Origin 서버에서 가져옴.

BYPASSproxy_cache_bypass : 요청이 지시문과 일치하여 Origin 서버에서 응답 가져옴.

EXPIRED : 캐시의 항목이 만료됨, 응답은 Origin 서버의 최신 콘텐츠 포함

STALE : 원본 서버가 제대로 응답하지 않아 콘텐츠가 오래됨.

UPDATING : 이전 요청에 대한 응답으로 업데이트

REVALIDATED : proxy_cache_revalidate 지시문이 활성화되었을때 (on)

HIT : 응답이 캐시에서 직접 가져온 유효하고 새로운 컨텐츠가 포함되어 있음.

 

 

 

 

참고자료 :

https://www.nginx.com/blog/nginx-caching-guide/

https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path

'DevOps 부트캠프 > 네트워크' 카테고리의 다른 글

프록시(proxy)란?_proxy, web cache  (0) 2022.03.14
TCP vs UDP  (0) 2022.03.14
HTTP Method란? _ HTTP 주요 Method  (0) 2022.03.14
RESTful API 란?  (0) 2021.12.10

댓글