Django lighttpd FCGI ошибка - PullRequest
       8

Django lighttpd FCGI ошибка

1 голос
/ 11 февраля 2011

Я пытаюсь развернуть свое приложение django через lighttpd + fcgi, но когда я запускаю скрипт fcgi, он выдает ошибку

Вот сам скрипт fcgi:

#!/usr/bin/python2.6
import sys, os

# Add a custom Python path.
sys.path.insert(0, "/home/wite")

# Switch to the directory of your project. (Optional.)
os.chdir("/home/wite/dormcode")

# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "dormcode.settings"

from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")

При запуске сценария fcgi с python я получаю 302 FOUND.Когда я пытаюсь перейти на страницу через веб-браузер, я ничего не получаю.

WSGIServer: missing FastCGI param REQUEST_METHOD required by WSGI!
WSGIServer: missing FastCGI param SERVER_NAME required by WSGI!
WSGIServer: missing FastCGI param SERVER_PORT required by WSGI!
WSGIServer: missing FastCGI param SERVER_PROTOCOL required by WSGI!
Status: 302 FOUND
Vary: Cookie
Content-Type: text/html; charset=utf-8
Location: http://localhost/login/
Set-Cookie:  csrftoken=30f07d4a59820a5ab7b502447cc16f5a; Max-Age=31449600; Path=/

* РЕДАКТИРОВАТЬ *

После игры с некоторыми из настроек lighttpdварианты, мне удалось получить что-то другое.Когда я захожу в приложение через веб-браузер, страница на некоторое время зависает и появляется с ошибкой 500, оставляя это в журналах:

2011-02-12 01:04:59: (mod_fastcgi.c.2582) unexpected end-of-file (perhaps the fastcgi process died): pid: 0 socket: tcp:127.0.0.1:80 
2011-02-12 01:04:59: (mod_fastcgi.c.3367) response not received, request sent: 1076 on socket: tcp:127.0.0.1:80 for /dormcode.fcgi?, closing connection

Ответы [ 2 ]

3 голосов
/ 20 февраля 2011

Это больше, чем кажется на первый взгляд.

Payne правильно, так как этот слушатель fastcgi использует stdin в качестве сокета для связи.

Однако, это всего лишь один из способов запуска респондента FastCGI. На самом деле это неправильный способ запуска респондента для lighttpd, потому что lighttpd не поддерживает общение со своими респондентами через stdin.

Ключ лежит в этой строке:

runfastcgi(method="threaded", daemonize="false")

Это правильная строка для apache, но не правильная строка для lighttpd. Для lighttpd вы хотите что-то вроде этого:

runfastcgi(method="prefork", daemonize="true", host="127.0.0.1", port="3033")

Что это будет делать, так это запускать процесс fastcgi вместо хоста / порта по вашему выбору в качестве демона, который будет переходить в фоновый режим. Установите daemonize = "false" для отладки или если вы используете что-то вроде supervisord, но большинство людей обычно хотят демона.

Следует отметить, что весь скрипт не нужен, если ваш скрипт такой же простой, как тот, который вы только что вставили. Вместо этого вы можете просто запустить респондент fastCGI через manage.py:

./manage.py runfcgi method=prefork host=127.0.0.1 port=3033 pidfile=/path/to/foo.pid

Теперь, когда вы (надеюсь) запустили свой респондент FastCGI, вы хотите сделать это в своей конфигурации lighttpd:

"/mysite.fcgi" => (
    "main" => (
         "host" => "127.0.0.1",
         "port" => 3033,
          "check-local" => "disable",
    )
),

То есть, какой бы порт вы ни выбрали для своего респондента fastcgi, вам нужно указать lighttpd там.

Следует отметить, что все это доступно в документации Django FastCGI , но эта документация утратила большую часть своей ясности из-за частых изменений и некоторой ползучести функций в проекте с открытым исходным кодом.

1 голос
/ 11 февраля 2011

Во-первых, с sh вы пытаетесь запустить свой скрипт как скрипт оболочки, а не как программу на Python.Если вы действительно хотите запустить его как программу на Python, наберите python /home/wite/code/code.fcgi

Во-вторых, имейте в виду, что приложения FastCGI работают как демоны - вам все еще нужен веб-сервер для подключения к процессу, который вы запускаетездесь.

Наконец, если вы пытаетесь вручную протестировать эту программу FastCGI: это не всегда полезно, потому что FastCGI использует специальный протокол на stdin и stdout между веб-сервером и вашим приложением.(Вы можете протестировать CGI-скрипты таким образом, потому что CGI был намного проще).

...