logo

English

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

by lizard2019 posted Jan 02, 2025
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

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 •

List of Articles
No. Subject Author Date Views
» NGINX와 LUA로 Proxy Cache 기능 구현하기 lizard2019 2025.01.02 252
73 MS, 국내 공공 클라우드 시장 뚫었다…해외 빅테크 첫 인증 획득 lizard2019 2024.12.03 190
72 '애플천하' 프리미엄폰 시장… 밀려나는 갤럭시 lizard2019 2024.12.03 173
71 Apple, M4 Pro 및 M4 Max 칩 공개 file lizard2019 2024.10.31 289
70 iOS 18 is compatible devices 1 digipine 2024.09.06 416
69 2023년 기준 PC 운영체제 점유율 현황 file digipine 2024.08.05 520
68 프로그래밍 언어 순위 2024 file digipine 2024.06.21 363
67 Cubism Live2D Demo Windows D3D9 file lizard2019 2023.01.11 723
66 애플, 서드파티 앱마켓 진출 허용하나 lizard2019 2022.12.18 558
65 삼성전자 갤럭시 S22 발표, S펜을 탑재한 첫 S시리즈 file digipine 2022.02.10 645
64 서드파티 애플 뮤직 앱 Soor, 맞춤형 Magic Mix 음악 리스트 file digipine 2022.02.04 896
63 딥마인드, 인간 개발자와 유사한 수준의 AI ‘알파코드’ 개발 file digipine 2022.02.03 741
62 CM6206 High Integrated USB Audio I/O Controller Windows Driver and PDF file digipine 2022.02.02 6625
61 트위터에서 다크모드 설정 방법 file digipine 2022.01.20 518
60 쿠버네티스, 도커 지원 중단 file digipine 2021.10.20 834
59 도커(Docker)와 쿠버네티스(Kubernetes)란 무엇인가? digipine 2021.10.20 478
58 마이크로소프트, 차세대 운영체제 윈도우 11 공개 file digipine 2021.06.29 496
57 영화의 매트릭스의 네오의 컴퓨터 화면 프로그램 digipine 2021.02.04 1550
56 iOS 14.3 업데이트 릴리즈 file digipine 2020.12.16 540
55 애플 드디어 ARM 기반의 맥 출시 예정, 11월 10일 digipine 2020.11.09 814
Board Pagination Prev 1 2 3 ... 4 Next
/ 4