웹사이트를 최적화하기 위해 nginx와 memcached를 사용한 경험이 있습니까?

StackOverflow https://stackoverflow.com/questions/1010905

문제

우리는 Java EE 기반 웹 애플리케이션을 실행하고 있습니다. 글래스피쉬 앱 서버 클러스터.들어오는 트래픽은 주로 애플리케이션 리소스의 XML 기반 표현에 대한 RESTful 요청이지만 아마도 트래픽의 5%는 JSON 또는 XHTML/CSS 기반 표현에 대한 것일 수 있습니다.

현재 우리는 클러스터의 Glassfish 인스턴스 전체에 수신 트래픽을 분산하기 위한 로드 밸런싱 솔루션을 조사하고 있습니다.또한 키가 REST 리소스 이름(예: "/user/bob", "/group/jazzlovers")이고 값이 다음과 같은 인메모리 분산 해시 맵인 memcached를 사용하여 클러스터를 오프로드하는 방법을 조사하고 있습니다. 해당 XML 표현.

유망해 보이는 한 가지 접근 방식은 일석이조로 두 마리의 새를 모두 죽이고 가볍고 빠른 것을 사용하는 것입니다. nginx HTTP 서버/역방향 프록시.Nginx는 먼저 memcached에서 URI를 검색하여 만료되지 않은 XML 표현이 이미 있는지 확인함으로써 들어오는 각 요청을 처리합니다.그렇지 않은 경우 nginx는 Glassfish 인스턴스 중 하나에 요청을 보냅니다.nginx memcached 모듈은 다음에 설명되어 있습니다. 이 짧은 글.

이러한 방식으로 사용되는 nginx 및 memcached에 대한 전반적인 인상은 어떻습니까? 이에 대해 얼마나 만족하시나요?학습에 가장 도움이 된 자료는 무엇입니까?시도해 보았는데 목적에 맞지 않는다면 왜 안 됩니까? 대신 무엇을 사용하셨나요?

메모:여기 있어요 관련 질문.

업데이트:나중에 물어보니 같은 질문 ServerFault.com에서.거기에 대한 답변은 주로 nginx에 대한 대안을 제안하는 것입니다(유용하지만 간접적임).

도움이 되었습니까?

해결책

사용자에게 데이터를 업스트림으로 전달하는 애플리케이션 서버 뱅크가 있다고 가정합니다.

upstream webservices {
    server 10.0.0.1:80;
    server 10.0.0.2:80;
    server 10.0.0.3:80;
}
server {
    ... default nginx stuff ...
    location /dynamic_content {
          memcached_pass localhost:11211;
          default_type   text/html;
          error_page     404 502 = @dynamic_content_cache_miss;
          set $memcached_key $uri;
    }
    location @dynamic_content_cache_miss {
          proxy_pass http://webservices;
    }

위의 nginx.conf 스니펫이 수행하는 작업은 모든 트래픽을 다음으로부터 전달하는 것입니다. http://example.com/dynamic/* memcached 서버에 직접 연결됩니다.Memcache에 콘텐츠가 있으면 업스트림 서버에 트래픽이 전혀 표시되지 않습니다.

404 또는 502 오류(캐시가 아니거나 Memcache에 도달할 수 없음)로 인해 캐시 적중이 실패하면 nginx는 요청을 업스트림 서버로 전달합니다.업스트림 정의에는 세 개의 서버가 있으므로 투명한 로드 밸런싱 프록시도 얻을 수 있습니다.

이제 유일한 주의 사항은 백엔드 애플리케이션 서버가 Memcache의 데이터를 최신 상태로 유지하는지 확인해야 한다는 것입니다.나는 nginx + memcached + web.py를 사용하여 비교적 적당한 하드웨어에서 분당 수천 개의 요청을 처리하는 간단하고 작은 시스템을 만듭니다.

애플리케이션 서버의 일반적인 의사 코드는 web.py의 경우와 같습니다.

class some_page:
     def GET(self):
         output = 'Do normal page generation stuff'
         web_url = web.url().encode('ASCII')
         cache.set(web_url, str(output), seconds_to_cache_content)
         return output

위의 web.py/의사 코드에서 기억해야 할 중요한 사항은 nginx를 통해 memcached에서 오는 콘텐츠는 전혀 변경할 수 없다는 것입니다.nginx는 유니코드가 아닌 간단한 문자열을 사용합니다.Memcached에 유니코드 출력을 저장하면 캐시된 콘텐츠의 시작과 끝 부분에 최소한 이상한 문자가 표시됩니다.

나는 몇 시간 동안만 지속되는 막대한 트래픽 펄스를 얻는 스포츠 관련 웹사이트에 nginx와 memcached를 사용합니다.nginx와 memcached 없이는 살아갈 수 없었습니다.위의 변경 사항을 구현한 후 지난 7월 4일 대규모 스포츠 이벤트 중 서버 로드가 70%에서 0.6%로 감소했습니다.나는 그것을 충분히 추천할 수 없다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top