static하게 만들기 using nginx

2023, Sep 09    

요구사항

  • static한 이미지이지만 API를 통해서 매번 호출해야만하는 케이스에 대한 성능 개선
    • 정적인 파일로 되어있지만, 이미지를 클라이언트에 전달하려면 서버를 매번 호출해야하고
    • 해당 요청이 반복적으로 일어날것이 예상되는 상황
    • 이미지 크기가 큰 경우, 조회할 때마다 딜레이가 발생하는 문제

작업 내용

nginx Reverse Proxy Cache 사용

  • 기존 구조대로라면, 앱에서 spring boot 서버로 바로 이미지를 가져와야해서 네트워크 부담이 예상되는 구간이였습니다.
  • 웹 서버를 통해서 요청이 가기전에 필요에 따라서 요청 내용을 변경하거나 캐싱을 해서 성능을 향상 시킬 수 있습니다
  • nginx를 통해 응답을 캐싱해서 서버에 대한 부하를 줄이고 응답시간을 단축시킬 수 있습니다.
  • proxy_cache, proxy_set_header 등과 같은 지시어를 사용하여 프록시 동작을 세밀하게 제어할 수 있습니다.
location /static/depot/ {
  access_log  logs/faq.error.log main;
  proxy_set_header X-Authority "ADMIN";
  proxy_set_header X-User "system";
  proxy_pass http://x.x.x.x:8081$uri;
}

Forward Proxy or Reverse Proxy

Forward Proxy

  • 클라이언트가 외부 서버 또는 리소스에 접근하기 위해 중간에 위치한 프록시 서버를 사용하는 것
  • 클라이언트가 요청을 프록시 서버로 보내고, 프록시 서버는 클라이언트 대신 요청을 외부 서버로 전달하고 응답을 받아 클라이언트로 전달한다.
  • Forward proxy는 주로 클라이언트의 익명성을 보호하거나 내부 네트워크에서 외부 리소스에 접근할 때 사용
  • 주로 resolver로 DNS 서버를 지정하게 된다.

Reverse Proxy

  • 웹 서버 뒷단에 위치하며, 클라이언트 요청을 받아 웹 서버로 전달하고, 웹 서버에서 받은 응답을 캐시에 저장하여 이후 요청에 사용하는 역할을 한다.
  • 이는 웹 서버의 성능을 향상시키고 트래픽을 줄이는데 사용된다. Reverse proxy cache는 서버 측에서 동작하며 클라이언트 측에 대한 중개 역할을 하지 않는다.
  • Reverse proxy cache를 구현하려면 Nginx를 reverse proxy로 설정하고, 웹 서버의 응답을 캐시로 저장하도록 구성해야 한다.
  • 밑에 설정 예시를 보면, 디스크에 저장한다는 것을 알수 있다.

      http {
    
      # 캐시 경로와 캐시 옵션을 설정
      proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
    
      server {
          ...
    
          location / {
              # 캐시 설정
              proxy_cache my_cache;
              proxy_cache_valid 200 304 1h;  # 200 OK 및 304 Not Modified 응답을 1시간 동안 유지
              proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
                
              proxy_pass http://backend_server;
          }
            
          location /clear_cache {
              # 캐시를 비우는 엔드포인트를 설정
              proxy_cache_purge my_cache "$uri$is_args$args";
          }
    
          location /status {
              # 캐시 상태를 모니터링할 수 있는 엔드포인트
              proxy_cache_bypass $http_cache_control;
              add_header X-Cache-Status $upstream_cache_status;
          }
      }
    
      upstream backend_server {
          server 127.0.0.1:8080;
      }
    }
    
    

주의할 점

  • 경우에 따라서는 expires 설정을 추가하는 것이 좋습니다.
  • 404의 경우도 캐싱될 수 있기 때문에 주의!

reference

https://jojoldu.tistory.com/60