Django lighttpd FCGI错误
我正在尝试通过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 个回答
首先,使用 sh
命令时,你是在尝试把你的脚本当作一个 shell 脚本来运行,而不是 Python 程序。如果你真的想把它当作 Python 程序来运行,就输入 python /home/wite/code/code.fcgi
。
其次,要记住,FastCGI 应用程序是以守护进程的形式运行的——你仍然需要一个 Web 服务器来连接你在这里启动的进程。
最后,如果你想手动测试这个 FastCGI 程序,这并不总是有帮助,因为 FastCGI 在 Web 服务器和你的应用程序之间使用了一种特殊的协议来处理输入和输出。(你可以用这种方式测试 CGI 脚本,因为 CGI 要简单得多)。
事情比表面看起来要复杂得多。
payne说得对,这个fastcgi监听器是通过标准输入(stdin)作为通信的方式。
不过,这只是运行FastCGI响应器的一种方式。实际上,这种方式对于lighttpd来说是错误的,因为lighttpd不支持通过标准输入与其响应器进行通信。
关键在于这一行:
runfastcgi(method="threaded", daemonize="false")
这行代码适用于apache,但不适用于lighttpd。对于lighttpd,你需要使用类似这样的代码:
runfastcgi(method="prefork", daemonize="true", host="127.0.0.1", port="3033")
这样做的目的是让fastcgi进程在你选择的主机和端口上运行,作为一个后台进程。为了调试,或者如果你使用像supervisord
这样的工具,可以把daemonize设置为“false”,但大多数人一般希望它在后台运行。
需要注意的是,如果你的脚本和你刚刚粘贴的那样简单,整个脚本其实并不是必需的。你可以直接通过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文档中找到,但由于频繁的编辑和一些功能的增加,这份文档的清晰度已经下降了很多。