ProxyPass и ProxyPassReverse для приложения Django

У меня есть дополнительный вопрос из моего исходного вопрос об обслуживании Django, который заключался в том, как разрабатывать приложения Django и обслуживать их с того же сервера, что и мой основной сайт на основе PHP (все это часть более крупной миграции моего веб-сайта со статического и PHP-сайта). привел один к серии приложений Django).

Я не мог использовать предоставленное мне решение сервера имен и вместо этого просто развернул свои приложения Django на другом порту (8000) с помощью mod_wsgi. Однако теперь мне нужно фактически интегрировать приложение Django в основной сайт. В моем файле конфигурации Apache 2.0 (например, http://www.example.com) я добавил следующий ProxyPass команды (после моей инициализации mod_wsgi):

ProxyPass        /app/newsletter     http://www.example.com:8000/app/newsletter
ProxyPassReverse /app/newsletter     http://www.example.com:8000/app/newsletter

Здесь я ожидаю, что любой запрос на:

http://www.example.com/app/newsletter

будет успешно проксирован на:

http://www.example.com:8000/app/newsletter

и все будет в порядке с миром.

Тем не менее, это не так. Apache зависает примерно на 5 минут (время, затраченное на создание этого вопроса), а затем выдает ошибку прокси-сервера 502:

Proxy Error

The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /app/newsletter/.

Reason: Error reading from remote server

Просматривая мой журнал ошибок Apache 2.0 после этого ответа, я вижу постоянные ошибки, подобные следующим:

[Thu Sep 27 15:25:49 2012] [error] Exception KeyError: KeyError(****,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored

Так что что-то кажется упущенным в том, как mod_proxy работает с Django и/или Python. У меня есть другие процессы, связанные с Java, в которых я использую ProxyPass и ProxyPassReverse, и они работают нормально. Кроме того, когда я не пытаюсь применить ProxyPass, все приложения Django работают хорошо (т.е. когда я обращаюсь к ним напрямую через порт 8000).

Любые идеи? Я не чувствую, что то, что я делаю, особенно сложно.

Заранее спасибо.


person tatlar    schedule 27.09.2012    source источник
comment
Мне было рекомендовано, поскольку все находится на одном сервере, я, вероятно, должен использовать mod_rewrite, а не mod_proxy.   -  person tatlar    schedule 28.09.2012


Ответы (1)


В конце концов, использование mod_rewrite стало решением. Добавил это в файл httpd.conf Apache:

RewriteEngine On
RewriteRule ^/app/newsletter/(.*)$ http://%{SERVER_NAME}:8000%{REQUEST_URI} [P]

Все работает так, как ожидалось.

person tatlar    schedule 28.09.2012
comment
Это не решило проблему полностью. Метод Django get_absolute_url не всегда работает и иногда оставляет номер порта (8000) в генерируемых им ссылках. - person tatlar; 28.09.2012
comment
100% исправлено путем удаления get_absolute_url() и замены синтаксиса {% url named-view %}. - person tatlar; 17.04.2013