2013-03-10 2 views
0

В следующей статье я попытался настроить кеширование Apache2, чтобы использовать его с Django в Ubuntu 12.10 с mod_wsgi. Я хочу, чтобы Apache кэшировал некоторые запросы для меня.Кэширование Django Ответы с mod_wsgi и Apache2 mem_cache

http://www.howtoforge.com/caching-with-apaches-mod_cache-on-ubuntu-10.04 

Из статьи я включил модули и настройки следующий скрипт для тестирования кэширования. Кэширование работает отлично - я получаю только новую метку времени через 5 минут.

vi /var/www/cachetest.php 

<?php 
header("Cache-Control: must-revalidate, max-age=300"); 
header("Vary: Accept-Encoding"); 
echo time()."<br>"; 
?> 

Теперь в моем ответе Джанго, я возвращаю объект HttpResponse после установки соответствующих заголовков одинаково:

# Create a Response Object with the content to return and set it's 
response = HttpResponse("%s"%(output_display)) 
response['Cache-Control'] = 'must-revalidate, max-age=20' 
response['Vary'] = 'Accept-Encoding' 
return response 

Кэширование с просьбой Django не работает. Я использовал Firefox LiveHeaders для просмотра заголовков ответов HTTP.

Для примера ссылку выше и PHP скрипт заголовки выглядят как:

http://localhost/cachetest.php 

GET /cachetest.php HTTP/1.1 
Host: localhost 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Cache-Control: max-age=0 

HTTP/1.1 200 OK 
Date: Sun, 10 Mar 2013 02:29:32 GMT 
Server: Apache/2.2.22 (Ubuntu) 
X-Powered-By: PHP/5.4.6-1ubuntu1.1 
Cache-Control: must-revalidate, max-age=300 
Vary: Accept-Encoding 
Content-Encoding: gzip 
Content-Length: 34 
Connection: close 
Content-Type: text/html 
---------------------------------------------------------- 

Для моей Django запрос - кэширование не работает, он всегда заставляет длительную операцию, чтобы завершить ответ - так же, как перезагружая запрос php выше с помощью F5. Используя плагин FireFox я, кажется, писать правильные заголовки:

http://localhost/testdjango/testdjango/ 

GET /testdjango/testdjango/ HTTP/1.1 
Host: localhost 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

HTTP/1.1 200 OK 
Date: Sun, 10 Mar 2013 02:32:41 GMT 
Server: Apache/2.2.22 (Ubuntu) 
Vary: Accept-Encoding 
Cache-Control: must-revalidate, max-age=20 
Content-Encoding: gzip 
Connection: close 
Transfer-Encoding: chunked 
Content-Type: text/html; charset=utf-8 
---------------------------------------------------------- 

Что я делаю неправильно? Как я могу заставить кеширование django работать как скрипт php? Благодаря!

ответ

0

Это, кажется, ваша проблема:

Transfer-Encoding: chunked 

Это означает 'потоковый ответ', с точкой зрения mod_mem_cache. И, согласно документации:

По умолчанию поточного ответа не будет кэшировать, если он не имеет заголовок Content-Length.

Вы можете решить эту проблему, установив MCacheMaxStreamingBuffer directive.

+0

Спасибо за ответ. Я попытался установить соответствующие заголовки в Django, но они как-то переопределены. См. Мой следующий вопрос об этом здесь: http://stackoverflow.com/questions/15323619/django-response-always-chunked-with-text-html-cannot-set-content-length. У вас есть другие идеи для этого? Thanks - – PhilBot

+0

Разве 'MCacheMaxStreamingBuffer' не исправить вашу проблему? Согласно документации Apache, она должна, даже если кодировка передачи «chunked» * и * в вашем ответе нет набора Content-Length (который, вероятно, лишен «mod_wsgi», хотя это просто предположение). – robertklep

+0

Нет, это не так - вы можете увидеть мой файл конфигурации во вторичном столбце. Что-то еще происходит. – PhilBot