2013-07-22 7 views
0

Я работаю над системой Django с бэкэндом Mongo, впервые экспериментирую с этой настройкой. Он имеет довольно стандартную настройку сервера nginx-hands-off-to-Apache для python. Кажется, что все это работает для более стандартного приложения Django-MySQL на том же сервере.django работает через оболочку, но через браузер получает 504

Для моего приложения Django-Монго, когда я использую 'питона manage.py оболочки', я получаю:

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

Мой/и т.д./Nginx/сайты с поддержкой/ВХост включает в себя следующее:

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 , и pinging сайт с моим веб-браузером. Я думал, что это одно и то же, но так как один возвращает ответ, а другой - нет, я явно ошибаюсь. Является ли разница только на уровне apache и/или nginx, или есть части оборудования django, которые также различны? Любые идеи о том, где искать, почему это работает в оболочке django, но не через браузер?

Edit: вот что в моих сайтах Недоступные/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> 
+1

Тестирование с помощью 'django.test.client' аналогично тестированию с помощью встроенного веб-сервера Django (с помощью' manage.py runningerver'). В настоящий момент вы используете стек nginx-apache-django реального мира, поэтому я думаю, что проблема лежит где-то в конфигурации между nginx и apache. Не могли бы вы описать свой стек более подробно? Что-то вроде: browser => nginx => Apache => Django? –

+0

Да, nginx отправляется в Apache для подпапки, в которой находится это приложение (а также для приложения Django-mysql, которое работает, поэтому я считаю, что это правильно). Затем Apache должен отдать Django, и снова он подходит для более старого приложения. Nginx имеет порт 80 и отправляет в порт 84, который предназначен для Apache. Я полагаю, что более раннее приложение было написано под Django 1.3, а новое - в Django 1.5, поэтому их структуры каталогов немного отличаются из-за изменений в Django, но похоже, что мы даже не дошли до этого. – rossdavidh

+1

Поскольку 504 означает, что ваш запрос никогда не доходит до серверного сервера, имеет смысл сначала протестировать django и apache. Не могли бы вы немного переустановить Apache (если необходимо), чтобы прослушать порт 84 и попробовать сначала 'yourdomain.com: 84'? –

ответ

0

Большое спасибо Hieu Nguyen за его комментарии выше, которые помогли мне найти способ отладки это. Большое количество использования /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 находясь на пути питона , а затем также проблема gogoworld/wsgi.py, которая сначала найдет параметры setup.py обычного mysqlapp и выполнила это (поэтому я переключил порядок, чтобы gogoworld впервые появился в WSGIPythonPath). Я считаю, что есть, вероятно, лучший способ настройки, когда у вас есть несколько приложений django, но эта настройка, похоже, работает как для нового, так и для старого приложения.

Краткая история: несколько приложений для django требуют больше знаний об Apache, чем один, и если вы не являетесь гуру Apache, вам придется потратить некоторое время, чтобы поиграть с ним, чтобы получить правильное выполнение wsgi.py, а правильные настройки!

+0

Эта тема также была полезной при настройке для двух разных проектов django: http://stackoverflow.com/questions/9581197/two-django-projects-running-simultaneous-and-mod-wsgi-acting-werid – rossdavidh