ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Как выжать максимум из этой конфигурации?


  • To: nginx-ru@xxxxxxxxx
  • Subject: Как выжать максимум из этой конфигурации?
  • From: Andrey Ryabushenko <cdome@xxxxx>
  • Date: Tue, 4 Sep 2007 13:45:51 +0300

Nginx обслуживает один сайт с больший количеством запросов.
Сайт написан на Django и использует его cache_middleware для складывания 
страниц в memcached. Но прирост производительности оказался менее ожидаемого 
от включения кеширования, я полагаю что, все потому-что связка
nginx -> apache2.0+mod_python -> django -> memcached
слишком длинная, хочется укоротить до nginx -> memcached.
Проблема в том что django cache_middleware умная штуковина, она не просто 
складывает страницы по ключу типа:
SOME_PREFIX + $uri
Она ещё учитывает Vary headers и складывает так
По ключу SOME_PREFIX + $uri кладет не страницу, а список Header-ов, 
по-которому страница Vary.
А саму страницу кладёт по ключу "SOME_PREFIX + $uri + MD5hash Vary headers" 
Как мне задействовать nginx memcached module в такой конфигурации, или сдесь 
можно nginx perl module задействовать, так чтобы производительность по 
максимуму выжать. 

P.S. А функционал Vary сайту нужен и урезать его нельзя, разве что переделать.

P.S2 Вот код django midleware чтобы было понятно

def _generate_cache_key(request, headerlist, key_prefix):
    "Returns a cache key from the headers given in the header list."
    ctx = md5.new()
    for header in headerlist:
        value = request.META.get(header, None)
        if value is not None:
            ctx.update(value)
    return 'views.decorators.cache.cache_page.%s.%s.%s' % (key_prefix, 
request.path, ctx.hexdigest())

def get_cache_key(request, key_prefix=None):
    """
    Returns a cache key based on the request path. It can be used in the
    request phase because it pulls the list of headers to take into account
    from the global path registry and uses those to build a cache key to check
    against.

    If there is no headerlist stored, the page needs to be rebuilt, so this
    function returns None.
    """
    if key_prefix is None:
        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
    cache_key = 'views.decorators.cache.cache_header.%s.%s' % (key_prefix, 
request.path)
    headerlist = cache.get(cache_key, None)
    if headerlist is not None:
        return _generate_cache_key(request, headerlist, key_prefix)
    else:
        return None

def learn_cache_key(request, response, cache_timeout=None, key_prefix=None):
    """
    Learns what headers to take into account for some request path from the
    response object. It stores those headers in a global path registry so that
    later access to that path will know what headers to take into account
    without building the response object itself. The headers are named in the
    Vary header of the response, but we want to prevent response generation.

    The list of headers to use for cache key generation is stored in the same
    cache as the pages themselves. If the cache ages some data out of the
    cache, this just means that we have to build the response once to get at
    the Vary header and so at the list of headers to use for the cache key.
    """
    if key_prefix is None:
        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
    if cache_timeout is None:
        cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
    cache_key = 'views.decorators.cache.cache_header.%s.%s' % (key_prefix, 
request.path)
    if response.has_header('Vary'):
        headerlist = ['HTTP_'+header.upper().replace('-', '_') for header in 
vary_delim_re.split(response['Vary'])]
        cache.set(cache_key, headerlist, cache_timeout)
        return _generate_cache_key(request, headerlist, key_prefix)
    else:
        # if there is no Vary header, we still need a cache key
        # for the request.path
        cache.set(cache_key, [], cache_timeout)
        return _generate_cache_key(request, [], key_prefix)


 




Copyright © Lexa Software, 1996-2009.