Nginx没有为Django提供静态文件

时间:2015-10-28 18:06:29

标签: python django nginx uwsgi

我已使用本指南设置了django服务器:

https://gist.github.com/evildmp/3094281

uwsgi服务正常,但静态文件明显缺失,因为它们是nginx的责任。所以似乎nginx是我的问题。我的nginx配置与该指南中的相同。

但这是我的base.py设置文件:

########## PATH CONFIGURATION
# Absolute filesystem path to the Django project directory:
DJANGO_ROOT = dirname(dirname(abspath(__file__)))

# Absolute filesystem path to the top-level project folder:
SITE_ROOT = dirname(DJANGO_ROOT)

BASE_DIR = dirname(dirname(abspath(__file__)))

# Site name:
SITE_NAME = "sasite"

# Add our project to our pythonpath, this way we don't need to type our project
# name in our dotted import paths:
path.append(DJANGO_ROOT)
########## END PATH CONFIGURATION

########## MEDIA CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root
MEDIA_ROOT = normpath(join(SITE_ROOT, 'media'))

# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-url
MEDIA_URL = '/media/'
########## END MEDIA CONFIGURATION

########## UPLOAD CONFIGURATION

UPLOAD_ROOT = join(BASE_DIR, 'uploads')

UPLOADS_URL = '/uploads/'

FILE_UPLOAD_HANDLERS = (
    "django.core.files.uploadhandler.MemoryFileUploadHandler",
    "django.core.files.uploadhandler.TemporaryFileUploadHandler",
)

########## END UPLOAD CONFIGURATION

########## STATIC FILE CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root
STATIC_ROOT = normpath(join(SITE_ROOT, 'assets'))
STATICFILE_ROOT = normpath(join(SITE_ROOT, 'static'))

# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url
STATIC_URL = '/static/'

# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
STATICFILES_DIRS = (
    normpath(join(SITE_ROOT, 'static')),
)

我说的配置与我链接的指南相同,目录的路径是正确的,但我也有资产目录,其中有一些静态文件支持某些javascript插件,例如我正在使用主题。我假设在我的nginx.conf中为资产添加另一个条目会有所帮助,但是,我在/ media /中添加了一个名为1.txt的文件。当我去domainname.com:8001(uwsgi正在服务)时,它没有css,没有javascript等。当我尝试访问domainname.com:8000/media/1.txt(nginx正在服务)我收到错误,例如空响应或者它不起作用。

由于uWSGI显然是在为站点提供服务,并且没有提供静态文件,我如何修复nginx以便正确提供静态文件,以便当我访问domainname.com:8000时它将显示完整网站上有静态文件和所有,因为uWSGI应该只是在nginx反向代理之后。

我可以在这里使用一些帮助,我理解它是如何工作的但是我似乎无法让它正常工作。

感谢您提供的任何帮助。

编辑:

nginx.conf

# nginx.conf
upstream django {
    # connect to this socket
    # server unix:///tmp/uwsgi.sock;    # for a file socket
    server 127.0.0.1:8001;      # for a web port socket
    }

server {
    # the port your site will be served on
    listen      8000;
    # the domain name it will serve for
    server_name .cshenkan.com;   # substitute your machine's IP address or FQDN
    charset     utf-8;

    #Max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
            alias /home/ubuntu/sasite-rewrite/media;      # your Django pro$
    }

    location /static {
            alias /home/ubuntu/sasite-rewrite/static;     # your Django pro$
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /etc/nginx/uwsgi_params; # or the uwsgi_params you installe$
        }
    }

和我用来运行uwsgi的命令:

uwsgi --http :8001 --chdir /home/ubuntu/sasite-rewrite --wsgi-file /home/ubuntu/sasite-rewrite/sasite/wsgi.py

和wsgi.py文件:

from os.path import abspath, dirname
from sys import path
from django.core.wsgi import get_wsgi_application

SITE_ROOT = dirname(dirname(abspath(__file__)))
path.append(SITE_ROOT)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sasite.settings.production")

application = get_wsgi_application()

我尝试使用unix套接字,更改nginx配置以使用unix套接字而不是网络套接字,并将我的uwsgi命令更改为

uwsgi --socket /tmp/uwsgi.sock --chdir / home / ubuntu / sasite-rewrite --wsgi-file /home/ubuntu/sasite-rewrite/sasite/wsgi.py

但是当我这样做时,当我导航到domainname.com:8000并且因为我不再使用端口8001的web套接字时它根本不起作用,我无法通过访问domainname.com:8001单独测试uwsgi 。再次看来nginx似乎不起作用,而且我不确定如何使用unix套接字单独测试uwsgi。

知道我做错了什么吗?我跟着几个指南,尝试了几种方法,似乎都没有工作,我得到的最接近的是我把顶部联系起来的要点。但是,当我尝试更改为unix套接字时(正如我所说),它似乎根本不起作用。

编辑2:

所以现在我的新base.py设置文件如下所示:

STATIC_ROOT = normpath(join(SITE_ROOT, 'static'))
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    normpath(join(SITE_ROOT, 'static')),
    normpath(join(SITE_ROOT, 'assets')),
)

此配置是否与我设置的方式一致?我有静态/作为我典型的django静态目录,但assets /是我正在使用的主题,我也需要从那里提供静态文件。如果我将它添加到STATICFILES_DIRS会做的伎俩吗?我需要在nginx.conf中添加任何东西吗?例如,在nginx.conf中为资产创建一些东西,就像我设置static一样?

e.g。将此添加到nginx.conf:

location /assets  {
        alias /home/ubuntu/sasite-rewrite/assets
} 

这是正确的做法吗?不幸的是,我无法让nginx完全适用于静态文件,所以我无法测试它。只是好奇我是否以正确的方式做到了。

1 个答案:

答案 0 :(得分:1)

你的eon.chart({ transform : function(m) { var obj = {columns: [ ['x', new Date().getTime()] ]}; for (var i in m.devices) { obj.columns.push(['Bytes Read ' + i, m.devices[i].output.Bytes_Read]); obj.columns.push(['Bytes Written ' + i, m.devices[i].output.Bytes_Written]]); } } return obj; } }); 是../assets,而不是../static,所以你应该将你的nginx位置别名指向/ static。

您还定义了STATICFILE_ROOT设置以指向../static,但这不是Django设置,因此它不会执行任何操作。