Django + uwsgi + nginx + debug off = 服务器错误 (500)

7
我正在尝试搭建一个生产服务器,其中包括Django + uwsgi + Nginx。我正在遵循的教程在这里:http://www.panta.info/blog/3/how-to-install-and-configure-nginx-uwsgi-and-django-on-ubuntu.html 当debug开启时,生产服务器可以正常工作,因为我可以看到管理页面,但当我关闭debug时,它会再次显示“Server Error(500)”。 我不知道该怎么办。Ngnix应该服务于Django请求。我现在一筹莫展,请有经验的人士帮助我。
以下是“/etc/nginx/sites-available/mysite.com”:
server {
  listen  80;
  server_name mysite.com www.mysite.com;
  access_log /var/log/nginx/mysite.com_access.log;
  error_log /var/log/nginx/mysite.com_error.log;


  location / {
    uwsgi_pass  unix:///tmp/mysite.com.sock;
    include     uwsgi_params;
  }



  location /media/  {
    alias /home/projects/mysite/media/;
  }



  location  /static/ {
   alias  /home/projects/mysite/static/;
  }
}

我的/etc/uwsgi/apps-available/mysite.com.ini

[uwsgi]
vhost = true
plugins = python
socket = /tmp/mysite.com.sock
master = true
enable-threads = true
processes = 2
wsgi-file = /home/projects/mysite/mysite/wsgi.py
virtualenv = /home/projects/venv
chdir = /home/projects/mysite
touch-reload = /home/projects/mysite/reload

我的settings.py

root@localhost:~# cat /home/projects/mysite/mysite/settings.py
# Django settings for my site project.

DEBUG = False
TEMPLATE_DEBUG = DEBUG





min/css/base.css" failed (2: No such file or directory), client: 160.19.332.22, server: mysite.com, request: "GET /static/admin/css/base.css HTTP/1.1", host: "160.19.332.22"
2013/06/17 14:33:39 [error] 8346#0: *13 open() "/home/projects/mysite/static/admin/css/login.css" failed (2: No such file or directory), client: 160.19.332.22, server: mysite.com, request: "GET /static/admin/css/login.css HTTP/1.1", host: "174.200.14.200"
2013/06/17 14:33:39 [error] 8346#0: *14 open() "/home/projects/mysite/static/admin/css/base.css" failed (2: No such file or directory), client: 160.19.332.22, server: mysite.com, request: "GET /static/admin/css/base.css HTTP/1.1", host: "174.200.14.2007", referrer: "http://174.200.14.200/admin/"
2013/06/17 14:33:39 [error] 8346#0: *15 open() "/home/projects/mysite/static/admin/css/login.css" failed (2: No such file or directory), client: 160.19.332.22, server: mysite.com, request: "GET /static/admin/css/login.css HTTP/1.1", host: "174.200.14.200", referrer: "http://174.200.14.200/admin/"

1
你需要在日志中找出导致500错误的实际Python错误信息。 - Timmy O'Mahony
我把它发布给 Timmy 了,很奇怪。在调试开启时一切都正常,在关闭调试时一切都变得奇怪。 - Uncle Toby
你是否正在使用 django-compressor 或类似的工具来创建压缩的静态文件? - Timmy O'Mahony
2
请确保在您的设置中设置了ALLOWED_HOSTS - Alasdair
@Alasdair 我没有设置域名,但我正在VPS上设置我的生产服务器。当我使用VPS IP作为允许的主机时,它无法工作。 - Uncle Toby
@TimmyO'Mahony 不,我没有使用django-compressor。我认为问题出在ALLOWED_HOST上。我正在生产环境中运行VPS,但我还没有域名,所以我将VPS IP输入到allowed_host字段中。但它仍然无法工作。 - Uncle Toby
2个回答

18

我认为是您的ALLOWED_HOSTS设置(在Django 1.5中新增)。

请在您的settings.py文件中尝试以下操作。

ALLOWED_HOSTS = ['*']

在您处理好域名之前,这将允许所有内容连接。

值得一提的是,当您处理好域名后,请确保更新此值(允许的域名列表)。正如ALLOWED_HOSTS文档所述:

这是一项安全措施,可防止攻击者通过提交带有虚假HTTP主机标头的请求来污染缓存和密码重置电子邮件中的链接到恶意主机,即使在许多看似安全的Web服务器配置下也可以实现此目的。

另外(一个小插曲)-我不知道您是否针对每个环境具有不同的Django设置,但这就是我做的:

在您的settings.py的结尾处包含以下内容:

try:
    from local_settings import *
except ImportError:
    pass

在与settings.py相同的目录中创建一个local_settings.py文件(如果使用不同的结构,则还需创建一个__init__.py文件),并在其中为每个环境设置您的设置。同时将local_settings.py从您的版本控制系统中排除。

例如,我在我的settings.py中具有DEBUG=False(用于安全默认值),但可以在我的开发本地设置中使用DEBUG=True进行覆盖。

我还将所有数据库信息保存在我的本地设置文件中,因此不会被包含在版本控制中。

如果你之前不知道这些,这里有一些小提示 :-)


1

我遇到了同样的问题,但在我的情况下,问题出在STATICFILES_STORAGE被错误地设置为:

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

这个问题已经有一个被接受的答案了,但我还是留下了这个问题,以防万一有人遇到了同样的情况。你也可以查看类似的答案来解决同样的错误。


非常感谢,我永远也想不到这就是问题所在。 - Johannes Pertl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接