NGINX와 LUA로 Proxy Cache 기능 구현하기

by lizard2019 posted Jan 02, 2025
?

Shortcut

PrevPrev Article

NextNext Article

ESCClose

Larger Font Smaller Font Up Down Go comment Print

NGINX와 Lua를 사용하여 요청이 들어왔을 때 캐시에서 확인하고, 캐시 히트 시 캐시에서 응답을 반환하고, 그렇지 않으면 상위 서버로 요청을 리다이렉트하는 스크립트 및 설정을 작성해 보겠습니다.

1. NGINX 설정

우선, NGINX 설정에서 Lua를 활성화하고, 캐시를 설정하는 방법을 다룹니다. 이 설정에서는 ngx_http_lua_module 모듈을 사용하여 요청을 처리하고, Lua 스크립트를 이용해 캐시 확인 및 리다이렉션을 처리합니다.

nginx.conf 설정 예시 

worker_processes 1;
events {
    worker_connections 1024;
}
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    
    # Lua 모듈 활성화
    lua_shared_dict my_cache 10m;  # 캐시 영역 크기 설정
    lua_package_path '/usr/local/nginx/lua/?.lua;;';  # Lua 모듈 경로 설정
    
    server {
        listen 80;
 
        # 요청 URL에 대한 캐시 확인 및 리다이렉션 처리
        location / {
            set $cache_key $uri;  # 캐시 키 설정 (예: URI로 캐시 결정)
            
            # Lua 코드로 캐시 확인
            access_by_lua_block {
                local cache_key = ngx.var.cache_key
                local cache = ngx.shared.my_cache
 
                -- 캐시에서 데이터 확인
                local cached_data = cache:get(cache_key)
                if cached_data then
                    ngx.say(cached_data)  -- 캐시 히트 시 캐시된 데이터 반환
                    ngx.exit(ngx.HTTP_OK)  -- 응답 종료
                end
            }
 
            # 캐시 미스 시 상위 서버로 요청 리다이렉트
            proxy_pass http://backend_server;
 
            # 캐시된 데이터가 있을 경우 캐시 저장
            header_filter_by_lua_block {
                local cache_key = ngx.var.cache_key
                local cache = ngx.shared.my_cache
 
                -- 상위 서버에서 응답 받은 후 캐시 저장
                local response_body = ngx.arg[1]
                cache:set(cache_key, response_body, 3600)  -- 캐시 저장 (1시간)
            }
        }
    }
}
 
 

2. 캐시 동작 설명

  • 캐시 확인:
    • access_by_lua_block 안에서 캐시된 데이터가 있는지 확인합니다. 만약 캐시에서 데이터를 찾으면, 해당 데이터를 클라이언트에 즉시 반환하고 응답을 종료합니다(ngx.exit(ngx.HTTP_OK)).
  • 캐시 미스:
    • 캐시에서 데이터를 찾지 못하면 proxy_pass 지시어를 사용하여 상위 서버로 요청을 전달합니다. 여기서는 http://backend_server로 요청이 리다이렉트됩니다.
  • 캐시 저장:
    • 응답이 반환된 후, header_filter_by_lua_block에서 응답 데이터를 캐시에 저장합니다. 이 예시에서는 응답 본문을 캐시하고, 1시간 동안 유효하도록 설정했습니다. ngx.shared.my_cache:set으로 캐시 키와 데이터를 저장합니다.

3. 캐시를 위한 Lua 스크립트

위 설정에서 Lua는 캐시와 관련된 로직을 처리합니다. ngx.shared.my_cache는 공유 메모리 영역을 사용하여 캐시 데이터를 저장하고 관리하는 데 사용됩니다.

  • 캐시 키 생성: set $cache_key $uri;에서 URI를 캐시 키로 사용하고 있습니다. 필요에 따라 다른 방식으로 키를 생성할 수 있습니다.
  • 캐시 저장 및 조회: Lua 코드에서는 ngx.shared.my_cache:get()으로 캐시를 조회하고, ngx.shared.my_cache:set()으로 캐시를 저장합니다.

4. 상위 서버 설정

상위 서버(backend_server)에 대한 설정은 기본적으로 NGINX가 리버스 프록시로 처리하는 방식입니다. 이를 위해 proxy_pass 지시어를 사용하여 상위 서버로 요청을 전달합니다. 상위 서버는 실제 데이터를 제공하며, 이 데이터는 캐시에 저장됩니다.

결론

이 NGINX와 Lua 설정은 캐시에서 확인 후, 히트 시 캐시된 데이터를 반환하고, 캐시 미스 시에는 상위 서버로 요청을 리다이렉트하여 데이터를 가져오고 캐시하는 방식으로 작동합니다. 이 방법을 통해 효율적인 캐시 관리와 빠른 응답을 제공할 수 있습니다.

TAG •

Articles

1 2 3 4

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5