【问题标题】:Nginx not serving static files for DjangoNginx 不为 Django 提供静态文件
【发布时间】:2016-01-28 15:54:37
【问题描述】:

我已经建立了一个 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 套接字而不是 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。

知道我做错了什么吗?我遵循了一些指南,并尝试了几种方法,但似乎都不起作用,我得到的最接近的是我链接到顶部的要点。但是当我尝试更改为 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')),
)

此配置是否可以按照我的设置方式工作?我有 static/ 作为我典型的 django 静态目录,但 assets/ 是我正在使用的主题,我也需要从那里提供静态文件。如果我将它添加到 STATICFILES_DIRS 会成功吗?我需要向 nginx.conf 添加任何内容吗?例如,以与我设置静态相同的方式在 nginx.conf 中为资产创建一些东西?

例如将此添加到 nginx.conf:

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

这是正确的方法吗?不幸的是,我无法让 nginx 完全用于静态文件,所以我无法对其进行测试。只是好奇我的做法是否正确。

【问题讨论】:

  • 我不明白你的问题。你知道在 nginx 中为你的媒体文件添加一个路由是可行的,那么你为什么不这样做呢?直接访问 uwsgi 的所有内容有什么关系?
  • 你能发布 nginx conf
  • 我已经在我的 nginx 配置中添加了路由,但我无法达到我所说的。当我尝试访问 domainname.com:8000 时,似乎没有任何 /media/ 或 /static/ 文件被提供,我什么也没得到,甚至 domainname.com:8000/media/whatever 什么也没有返回。据我了解,nginx 应该提供静态文件,同时允许 uwsgi 服务于站点的其余部分。 uWSGI 完成了它的工作,但 nginx 没有。
  • 你打电话给collectstatic命令了吗?
  • 是的,我最初是这样做的,静态文件夹是它们全部收集的地方。 assets 文件夹是一个剩余的文件夹,我的主题插件等在其中存储了一些资产。所以我确实需要资产目录,但静态是我的实际 STATIC_ROOT

标签: python django nginx uwsgi


【解决方案1】:

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

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

【讨论】:

  • 我有 /assets 和 /static 目录。尽管资产具有某些插件的静态文件,但两者都有静态文件。但它们都是必需的。我了解 STATICFILE_ROOT 不是 django 设置,但是如何正确配置 assets/ 和 static/ 作为静态目录的设置?我已经正确完成了静态操作,但是如何处理资产文件夹?在 nginx.conf 中,我将对其进行设置,以便静态、资产和媒体都由 nginx 提供服务。此外,通过我向您展示的配置,它可以在 django 开发服务器上正常工作。
  • 如果我要更改它以使 STATIC_ROOT 引用静态而不是资产,请完全删除 STATICFILE_ROOT,然后在 STATICFILES_DIRS 中添加静态和资产。 (现在它只有静态的)基本上我希望它被设置为 /static/ 和 /assets/ 都在 STATICFILES_DIRS 中。这会帮助我解决问题吗?我基本上只需要 assets 和 static 作为 staticfiles 目录。虽然大多数来自 /static/ 但一些插件的东西来自 /assets/
  • 参见 EDIT 2 了解我对 cme​​ts 所做的更改。但是在我的测试中,我使用了在设置中正确配置的 /media。问题是我怎样才能同时拥有 /static 和 /assets 作为 staticfiles_dirs?我的编辑 2 是正确的方法吗?正如我所说,我需要资产目录来处理某些与主题相关的事情,静态/目录应该做它通常在 django 应用程序中所做的事情
猜你喜欢
  • 2021-12-02
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2018-08-26
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多