Django lighttpd FCGI错误

时间:2011-02-11 20:31:22

标签: python django lighttpd fastcgi

我正在尝试通过lighttpd + fcgi部署我的django应用程序,但是当我运行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")

使用python运行fcgi脚本时,我得到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 个答案:

答案 0 :(得分:3)

除此之外还有更多的东西。

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之类的东西,但大多数人通常都需要一个守护进程。

应该注意的是,如果您的脚本与您刚粘贴的脚本一样简单,则不需要整个脚本。您只需通过manage.py:

运行fastCGI响应程序即可
./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 documentation中找到,但是这个文档在开源项目中经常编辑和一些功能蠕变已经失去了很多清晰度。

答案 1 :(得分:1)

首先,使用sh,您尝试将脚本作为shell脚本运行,而不是Python程序。如果您真的想将其作为python程序运行,请键入python /home/wite/code/code.fcgi

其次,请记住FastCGI应用程序作为deamons运行 - 您仍然需要一个Web服务器来连接到您从此处开始的进程。

最后,如果您尝试手动测试此FastCGI程序:这并不总是有用,因为FastCGI在Web服务器和您的应用程序之间的stdin和stdout上使用特殊协议。 (您可以通过这种方式测试CGI脚本,因为CGI更简单)。