Django 1.6 Python 2.6 Apache 2.2.27 PostgreSQL 8.4.20 psycopg2 flup
通过命令行查看我的Django站点的FastCGI包装器页面似乎工作正常,但在通过浏览器查看我的站点时总是得到404: Page Not Found
。我究竟做错了什么?我怀疑它与我的Apache设置有关。
Django 1.8文档说,从Django 1.7开始,不推荐使用fastcgi支持,我不能使用mod_wsgi
,所以我使用的是Django 1.6。 Python 2.7及更高版本不可用,所以我使用的是Python 2.6。托管公司不会为我安装Python软件包,但我设法自己安装了flup和psycopg2。 (注意,我必须在我的Linux64机器上编译psycopg2并将其上传到服务器。)
Django,flup和psycopg2安装在/home/account/public_html/sitename/site-packages/
中。我的Django网站位于/home/account/public_html/sitename/sitename/
。在命令提示符处发出set | grep -e PYTHON -e DJANGO
不返回任何结果(即,未设置PYTHON或DJANGO环境变量)。
我正在尝试在共享主机上设置Django。在有人建议之前:不幸的是, mod_wsgi
是不可能的。
我按照此处的说明操作:https://docs.djangoproject.com/en/1.6/howto/deployment/fastcgi/#apache-shared-hosting,最后得到了/home/account/public_html/.htaccess
:
AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ sitename/site.fcgi/$1 [QSA,L]
和/home/account/public_html/sitename/site.fcgi
:
#!/usr/bin/python
import sys, os
# Add a custom Python path.
sys.path.insert(0, "/home/account/public_html/sitename")
sys.path.insert(0, "/home/account/public_html/sitename/site-packages")
# Switch to the directory of your project. (Optional.)
os.chdir("/home/account/public_html/sitename")
# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "sitename.settings"
# From Django
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="prefork", daemonize="false", debug="true")
当我cd /home/account/public_html/sitename/ ; ./site.fcgi
时,我得到:
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: 200 OK
X-Frame-Options: SAMEORIGIN
Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<html>
<head>
...etc...
这是我的Django网站的正确索引页面。 这样可行。(我暂时忽略了WSGIServer错误,因为从命令提示符调用site.fcgi
显然是在WSGI环境之外。)
但是,当我将浏览器导航到http://example.com/
时,出现404: Page Not Found
错误,并且服务器错误日志仅显示:
[error] File does not exist: /home/account/public_html/sitename/site.fcgi/
导航到http://example.com/valid-page
也会产生404
,服务器出错:
[error] File does not exist: /home/account/public_html/sitename/site.fcgi/valid-page
我做错了什么?或者WSGI如何工作,所以我可以更好地调试它?
通过执行此操作,使用HostGator方法site.fcgi
:
# From Django
#from django.core.servers.fastcgi import runfastcgi
#runfastcgi(method="prefork", daemonize="false", debug="true")
# From HostGator
from flup.server.fcgi import WSGIServer
from django.core.wsgi import get_wsgi_application
WSGIServer(get_wsgi_application()).run()
结果相同:404
。这是有道理的,因为手动遍历代码会显示From Django
代码只是From HostGator
代码的包装。
使用fcgid-script
中的.htaccess
处理程序代替fastcgi-script
:
#AddHandler fastcgi-script .fcgi
AddHandler fcgid-script .fcgi
使用我在其他教程中找到的RewriteCond
中的.htaccess
:
#RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(sitename/site.fcgi)
RewriteRule ^(.*)$ sitename/site.fcgi/$1 [QSA,L]
将WSGI URI作为命令提示符样式参数传递(注意空格而不是/
):
#RewriteRule ^(.*)$ sitename/site.fcgi/$1 [QSA,L]
RewriteRule ^(.*)$ sitename/site.fcgi $1 [QSA,L]
确保已设置REQUEST_URI
环境变量:
SetEnv REQUEST_URI %{REQUEST_URI}
甚至将site.fcgi
作为CGI脚本,只是为了看看我是否可以从命令提示符中重现运行site.fcgi
的成功(可能不是永久解决方案):
#AddHandler fastcgi-script .fcgi
#RewriteEngine On
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^(.*)$ sitename/site.fcgi/$1 [QSA,L]
Options -Indexes +ExecCGI
AddHandler cgi-script .fcgi
然后导航到http://example.com/sitename/site.fcgi
。
上述变化都没有奏效,也没有其中几个的多种组合。其中许多人返回404: Page Not Found
,有些人返回了更明显的错误,而其他人则只显示了site.fcgi
的来源。
我获得了与Arvixe和LunarPages共享托管的相同/类似结果。以上描述仅使用我的Arvixe帐户,因为我的LunarPages帐户没有SSH访问权限,因此难以调试。
我甚至愿意接受能够使其发挥作用的低成本替代托管计划(例如,其他托管公司)。这只是一个个人网站,没有产生任何金钱,所以我不想花费每月20美元的时间,Arvixe和LunarPages要求有专门的托管以便mod_wsgi
访问。
提前感谢您提供任何帮助或建议!
答案 0 :(得分:0)
我遇到了同样的问题(发布在here上),并最终确定这是由于我通过bluehost订阅的共享托管帐户受到限制。我切换了Dreamhost共享托管计划,并且很快就可以启动并运行。