【问题标题】:ProxyPass and ProxyPassReverse for Django appDjango 应用程序的 ProxyPass 和 ProxyPassReverse
【发布时间】:2025-12-20 19:35:10
【问题描述】:

我的原始Django serving question 提出了一个后续问题,该问题是如何开发 Django 应用程序并从与我的主要基于 PHP 的站点相同的服务器上为它们提供服务(我的网站从静态和PHP 驱动一个到一系列 Django 应用程序)。

我不能完全使用我提供的名称服务器解决方案,而是使用 mod_wsgi 将我的 Django 应用程序部署在不同的端口 (8000) 上。但是,现在我需要将 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 似乎有些疏忽。我有其他使用 ProxyPass 和 ProxyPassReverse 的 Java 相关进程,它们工作正常。此外,当我不尝试应用 ProxyPass 时,Django 应用程序都运行良好(即,当我直接在端口 8000 上寻址它们时)。

有什么想法吗?我不觉得我正在做的事情特别复杂。

提前致谢。

【问题讨论】:

  • 有人建议我,因为一切都在同一台服务器上,我可能应该使用 mod_rewrite 而不是 mod_proxy。

标签: django apache mod-wsgi mod-proxy proxypass


【解决方案1】:

最后,使用 mod_rewrite 是解决方案。将此添加到 Apache 的 httpd.conf 文件中:

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

一切都按预期进行。

【讨论】:

  • 这并没有完全解决问题。 Django get_absolute_url 方法并不总是有效,偶尔会在它生成的链接中留下端口号 (8000)。
  • 100% 通过删除 get_absolute_url() 并替换为 {% url "named-view" %} 语法修复。
最近更新 更多