【问题标题】:django working via shell but via browser gets 504django 通过 shell 工作但通过浏览器得到 504
【发布时间】:2013-07-21 12:30:45
【问题描述】:

我正在开发一个带有 Mongo 后端的 Django 系统,这是我第一次尝试这种设置。它有一个相当标准的 nginx-hands-off-to-Apache-for-python 服务器设置。这一切似乎都适用于同一服务器上更标准的 Django-MySQL 应用程序。

对于我的 Django-Mongo 应用程序,当我使用“python manage.py shell”时,我得到:

from django.test.client import Client
client = Client()
response = client.get('/')
response.status_code
200
response.content
'<html>\n  <head>\n    <link href="/static/blog.css" rel="stylesheet" type="text/css">\n    <title>Worldmaker</title>\n  </head>\n  <body>\n      <ul>\n        <li><a href="sourcedoc/create/">New Sourcedoc</a></li>\n        <li><a href="sourcedoc/list/">All Sourcedocs</a></li>\n        <li><a href="noun/create/">New Noun</a></li>\n        <li><a href="noun/list/">All Nouns</a></li>\n      </ul>\n      <h1>Worldmaker</h1>\n    \n\n  </body>\n</html>\n\n'

但是,当我浏览到 http://www.mydomain.com/gogoworld/ 时,我得到一个 nginx 504 页面:

504 网关超时 nginx/1.4.1

我的 /etc/nginx/sites-enabled/vhost 包括:

  location /gogoworld/ {
    proxy_pass http://127.0.0.1:84;
    include /etc/nginx/proxy.conf;
  }

我的 /etc/apache2/httpd.conf 包括这个:

<Directory "/home/rosshartshorn/htdocs/gogoworld">
WSGIScriptAlias /gogoworld /home/rosshartshorn/htdocs/gogoworld/wsgi.py

WSGIPythonPath /home/rosshartshorn/htdocs/ordinarymysqlapp:/home/rosshartshorn/htdocs/worldmaker:/home/rosshartshorn/htdocs/gogoworld

我的 urls.py

from django.conf.urls import patterns, include, url

from sourcedocs import views

urlpatterns = patterns('',
    url(r'^$', views.index),
)

我的困惑是使用 django.text.client 和使用我的网络浏览器 ping 站点之间有什么区别。我曾认为这是同一件事,但由于一个返回响应而另一个没有,我显然是不正确的。差异仅在 apache 和/或 nginx 级别,还是 django 机器的某些部分也不同?关于在哪里查看为什么这在 django shell 中有效但不能通过浏览器的任何想法?

编辑:这是我的网站可用/rosshartshorn 中的内容:

Listen 84

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>
<VirtualHost *:84>
  ServerName     www.rosshartshorn.net
  ServerAlias rosshartshorn.net
  DocumentRoot /home/rosshartshorn/htdocs
  <Directory /home/rosshartshorn/htdocs>
    AllowOverride All
    allow from all
  </Directory>
</VirtualHost>

【问题讨论】:

  • 使用 django.test.client 进行测试与使用 Django 内置网络服务器(manage.py runserver)进行测试类似。目前您正在使用“真实世界”堆栈 nginx-apache-django,所以我想问题出在 nginx 和 apache 之间的配置中。你能更详细地描述你的堆栈吗?类似于:浏览器 => nginx => Apache => Django?
  • 是的,nginx 将这个应用程序所在的子文件夹交给 Apache(还有一个 Django-mysql 应用程序,它可以工作,所以我认为这是正确的)。然后 Apache 应该移交给 Django,并再次为较旧的应用程序移交。 Nginx 有 80 端口,发送到 84 端口,用于 Apache。我相信旧的应用程序是在 Django 1.3 下编写的,而新的应用程序是在 Django 1.5 下编写的,因此它们的目录结构由于 Django 的变化而略有不同,但似乎我们甚至没有达到这一点。
  • 由于 504 意味着您的请求永远不会到达后端服务器,因此首先单独测试 django 和 apache 是有意义的。您能否尝试重新配置 Apache(如果需要)以侦听端口 84 并先尝试yourdomain.com:84?
  • 感谢您的帮助,Hieu,这些都是很好的建议。当我直接浏览到端口 84 时,我没有得到 504 页面,但它只是永远旋转。因此,似乎 nginx 不是问题的一部分,它只是报告 Apache 没有返回任何内容的事实。因此,我猜这意味着它不是django,也不是nginx,所以它一定是Apache?
  • 是的 apache 配置已关闭或类似的东西,我不太擅长配置 apache 和 django(我所有的网站都是 django+nginx)所以我不太了解细节。跨度>

标签: django apache mongodb nginx


【解决方案1】:

非常感谢 Hieu Nguyen 提供的上述 cmets,帮助我找到了调试方法。大量使用 /var/log/apache2/error.log 来查看发生了什么/没有发生什么,以及“import sys” print >> sys.stderr, [一些调试语句]"

原来问题出在我的 /etc/apache2/httpd.conf 中,现在看起来更像这样:

WSGIScriptAlias /secretoktobermoneymade /home/rosshartshorn/htdocs/ordinarymysqlapp/wsgi.py
WSGIScriptAlias /gogoworld /home/rosshartshorn/htdocs/gogoworld/gogoworld/wsgi.py

WSGIPythonPath /home/rosshartshorn/htdocs/gogoworld/:/home/rosshartshorn/htdocs/gogoworld/gogoworld:/home/rosshartshorn/htdocs/ordinarymysqlapp

以前,我有一个组合,没有 gogoworld/wsgi.py 的位置在 python 路径上,然后还有 gogoworld/wsgi.py 的问题,首先找到普通mysqlapp的settings.py并运行它(这就是为什么我切换了顺序,以便 gogoworld 首先出现在 WSGIPythonPath 中)。我相信当您有多个 django 应用程序时,可能有更好的设置方法,但这种设置似乎对新旧应用程序都有效。

长话短说:多个 django 应用程序需要的 Apache 知识比一个应用程序要多,如果您不是 Apache 专家,那么您将不得不花一些时间来摆弄它以执行正确的 wsgi.py 和正确的设置!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-11-30
  • 2021-09-05
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多