Перенаправление на правильную локализацию: Nginx, Apache, memcached и Django - PullRequest
2 голосов
/ 20 апреля 2011

Мой сайт локализуется с помощью строки в URL-адресе (например, /DE/certificate получает немецкую версию, /US/certificate получает en-US и т. Д.) Для некоторых URL-адресов на сайте пропуская часть локализации перенаправляет в лучшую сторону -гагаю (обычно /US/<url>), но для других я просто получаю пустую страницу.

Это сайт Django. Django работает через mod_python на Apache, прослушивая порт 8000. Nginx находится на порту 80. Когда приходит запрос, Nginx проверяет memcached для страницы и, если он находится в кеше, обслуживает непосредственно из кеша. Если memcached отсутствует, Nginx передает запрос обратно в Apache. Django сохраняет вывод большинства GET запросов в memcached. Трафик на этом сайте очень резкий, и этот метод помогает нам получить максимальную отдачу от относительно маломощного сервера.

Проблема, описанная выше, не присутствует, если я пропускаю Nginx и кеш и отправляю запросы непосредственно в Apache через порт 8000. Это наводит меня на мысль, что проблема в слое Nginx / memcached.

Просмотр журнала Apache об успешном запросе показывает 302, возвращаемых для нелокализованного запроса, и новый запрос для исправленного URL. Просмотр журнала Nginx для неудавшегося запроса показывает ответ 200 и, по-видимому, пустой ответ. Я догадываюсь, что в memcached хранится пустая страница. Есть ли способ исследовать ключи в memcached, чтобы подтвердить эту догадку, или я должен искать какую-то другую информацию для устранения проблемы?

Вот соответствующий раздел конфигурации nginx:

    location / {
             if ($request_method = POST) {
                proxy_pass http://production;
                break;
             }
             default_type "text/html; charset=utf-8";
             set $memcached_key "/key-$uri";
             memcached_pass     localhost:11211;
             error_page 404 502 = /django;
    }

    location = /django {
             proxy_pass http://production;
             break;
    } 

Поможет ли мне включить мое промежуточное ПО для кэширования Django? Я настроил это, следуя этой статье в значительной степени точно.

1 Ответ

3 голосов
/ 03 мая 2011

используйте "@django" (в обеих строках) вместо "/ django"

...