Nginx无法为Django提供静态文件服务

4

我已经按照这个指南设置了一个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')),
)

正如我之前所说,我的配置与我提供的指南中的配置相同,目录的路径是正确的,但我还有一个名为assets的目录,其中包含一些支持某些JavaScript插件等的静态文件,因为我使用了一个主题。我猜在我的nginx.conf中为assets添加另一个条目会有所帮助,但尽管如此,我还是在/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套接字而不是Web套接字,并通过更改我的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。
有什么想法我做错了什么吗?我遵循了几个指南,并尝试了几种方法,但似乎都不起作用,我最接近的是我在顶部链接的gist。但是当我尝试更改为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静态目录是static/,但assets/用于我正在使用的主题,我也需要从那里提供静态文件。如果我将它添加到STATICFILES_DIRS中,这样做就可以了吗?我需要在nginx.conf中添加任何内容吗?例如,在nginx.conf中为assets创建与我设置静态文件相同的东西?
location /assets  {
        alias /home/ubuntu/sasite-rewrite/assets
} 

这是正确的方法吗?不幸的是,我无法让nginx为静态文件正常工作,因此无法测试它。只是好奇我是否以正确的方式进行。


我不明白你的问题。你知道在nginx中为媒体文件添加路由会起作用,那么为什么不这样做呢?所有关于直接访问uwsgi的东西与任何事情有什么关系? - Daniel Roseman
你可以发布Nginx配置吗? - Sebastian Wozny
我已经在我的nginx配置中添加了路由,但是像我说的那样,我无法访问它。似乎没有任何/media/或/static/文件被提供,因为当我尝试访问domainname.com:8000时,什么也没有,甚至domainname.com:8000/media/whatever也返回空白。据我所知,nginx应该提供静态文件,同时允许uwsgi提供站点的其余部分。uWSGI做了它的工作,但nginx没有。 - ss7
你执行了 collectstatic 命令吗? - Ramon Moraes
是的,我最初就是这样做的,静态文件夹是它们的集合地。资产文件夹是一个剩余的文件夹,我的主题插件等都将一些资产存储在那里。所以我确实需要资产目录,但静态文件夹才是我的实际STATIC_ROOT。 - ss7
1个回答

2

你的STATIC_ROOT是../assets,而不是../static,因此你应该将nginx的location别名指向/static。

你还定义了一个STATICFILE_ROOT设置,指向../static,但这不是Django的设置,所以它没有任何作用。


我有/assets和/static目录。两者都有静态文件,尽管assets具有某些插件的静态文件。但是它们都是必需的。我知道STATICFILE_ROOT不是Django设置,但是如何正确配置两个静态目录assets/和static/的设置?我已经正确处理了静态文件,但是如何处理资产文件夹?在nginx.conf中,我将设置它,以便从nginx提供所有静态、资产和媒体服务。此外,使用我向您展示的配置,它可以在Django开发服务器上正常工作。 - ss7
如果我更改STATIC_ROOT以引用static而不是assets,完全删除STATICFILE_ROOT,然后在STATICFILES_DIRS中添加static和assets。 (现在它只有静态)基本上我希望将/static/和/assets/都设置为STATICFILES_DIRS。 这会帮助我解决问题吗? 我只需要使assets和static均成为staticfiles目录即可。 因为大部分内容来自/static/,但某些插件内容来自/assets/。 - ss7
请看我在评论方面所做的更改,但在我的测试中,我使用的是/media,它在设置中配置正确。问题是如何同时拥有/static和/assets作为staticfiles_dirs?我的编辑2是否是正确的方法?正如我所说,我需要assets目录来处理某些与主题相关的事情,static/目录应该像django应用程序中通常所做的那样。 - ss7

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