여러 서버간에 공유되는 Nginx 캐시


9

요청을 처리하기 위해 PHP-FPM과 함께 FastCGI를 사용하는 Nginx를 갖춘 REST-ish API 서버 8 대가 있습니다. 우리는 현재 Nginx의 FastCGI 캐싱을 사용하고 있습니다 (와 같은 지시문 fastcgi_cache_path). 이는 API 응답이 캐시되지만 각 서버마다 별도의 캐시가 있음을 의미합니다.

8 개의 서버 모두에서 캐시 스토리지를 공유하는 좋은 방법이 있습니까?

Redis를 공유 스토리지로 사용하는 것을 고려했지만 사용 가능한 모듈에는 애플리케이션 변경이 필요한 것 같습니다. 경우에 따라 제어 외부에서 (HTTP를 통해 외부 API로) 응답을 캐시하려고 할 수 있습니다. 이상적으로, FastCGI 및 HTTP 응답의 Nginx 내장 캐싱을 대체 할 수있는 대체품을 사용할 수 있습니다.


왜 프론트 엔드 레이어 (Nginx)가 아니라 백엔드 레이어 (PHP 애플리케이션)에서 캐싱을 수행하지 않습니까?
Max Kochubey

@ hangover 휠을 다시 발명 할 이유가 없습니다. Nginx 캐시는 잘 작동합니다. 응용 프로그램을 통해 요청을 실행하는 오버 헤드를 피할 수 있다면 상황을 훌륭하고 빠르게 유지할 수 있습니다. Nginx는 5 밀리 초 이내에 캐시 된 요청에 응답합니다. 캐시 된 응답을 제공하기 위해 PHP 응용 프로그램을 시작하면 아마도 그보다 10 배 느릴 것입니다. Nginx 캐싱은 현재 잘 작동하고 있으며 많은 서버에 캐시를 배포하기 만하면됩니다.
Brad

1
타사 Nginx SRCache 모듈을 사용하여 캐시 된 컨텐츠를 전용 Memcached od Redis에 저장할 수 있습니다.
Max Kochubey

1
@Brad 이것은 해키이므로 답으로 쓰지 않을 것입니다 : 우리는 현재 서버의 nginx 캐시 디렉토리 사이에 rsync를 사용하여 각기 다른 최신 캐시 파일을 최신 상태로 유지하는 야간 실행 스크립트를 가지고 있습니다. 스크립트는 정상적인 nginx 재시작 및 성공 확인으로 끝납니다. 내가 말했듯이, 그것은 해 키지 만, 높은 처리량 시스템에서 우리에게 효과적입니다.
mVChr

@mVChr 흥미 롭습니다. rsync 또는 이와 유사한 것을 지속적으로 실행 해 보셨습니까? 결국 사용을 위해 결국 Redis가 작동하지만 전체 Redis 컬렉션이 메모리에 있어야하기 때문에 매우 큰 캐시를 허용하지 않습니다. 16GB가 내 응용 프로그램을 빠르게 채 웁니다.
Brad

답변:


1

이 문제에 대해 https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/ 에 새로운 블로그 게시물이있는 것 같습니다 . 이 첫 번째 예는 두 개 이상의 nginx 캐시 서버를 실행하는 경우 유용 할 수 있습니다.

특히 게시물의 두 번째 부분은 현재 사용 사례에서 흥미로운 것으로 들리며 변경된 항목을 캐시에 자동으로 다시 크롤링하려고합니다.

NGINX의 오픈 소스 버전에서도 작동합니다. 기본적으로 각 NGINX 서버 (Nginx-Cache1-> NGinx-Cache2-> Origin-Server)를 통해 연결된 요청을 프록시하여 각 서버가 관련 업스트림에서 캐시하며 원하는 경우 HA 클러스터도 만들 수 있습니다. https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.