带有FastCGI的Django在浏览器中提供404但在命令行上工作

时间:2015-11-30 16:46:29

标签: python django apache .htaccess fastcgi

摘要

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如何工作,所以我可以更好地调试它?

我尝试过的变种

  1. 通过执行此操作,使用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代码的包装。

  2. 使用fcgid-script中的.htaccess处理程序代替fastcgi-script

    #AddHandler fastcgi-script .fcgi
    AddHandler fcgid-script .fcgi
    
  3. 使用我在其他教程中找到的RewriteCond中的.htaccess

    #RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !(sitename/site.fcgi)
    RewriteRule ^(.*)$ sitename/site.fcgi/$1 [QSA,L]
    
  4. 将WSGI URI作为命令提示符样式参数传递(注意空格而不是/):

    #RewriteRule ^(.*)$ sitename/site.fcgi/$1 [QSA,L]
    RewriteRule ^(.*)$ sitename/site.fcgi $1 [QSA,L]
    
  5. 确保已设置REQUEST_URI环境变量:

    SetEnv REQUEST_URI %{REQUEST_URI}
    
  6. 甚至将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

  7. 上述变化都没有奏效,也没有其中几个的多种组合。其中许多人返回404: Page Not Found,有些人返回了更明显的错误,而其他人则只显示了site.fcgi的来源。

    修改

    1. 我获得了与Arvixe和LunarPages共享托管的相同/类似结果。以上描述仅使用我的Arvixe帐户,因为我的LunarPages帐户没有SSH访问权限,因此难以调试。

      我甚至愿意接受能够使其发挥作用的低成本替代托管计划(例如,其他托管公司)。这只是一个个人网站,没有产生任何金钱,所以我不想花费每月20美元的时间,Arvixe和LunarPages要求有专门的托管以便mod_wsgi访问。

    2. 提前感谢您提供任何帮助或建议!

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题(发布在here上),并最终确定这是由于我通过bluehost订阅的共享托管帐户受到限制。我切换了Dreamhost共享托管计划,并且很快就可以启动并运行。