Nginx 不为 Django 提供静态文件
Nginx not serving static files for Django
我已经使用本指南设置了一个 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 中为资产添加另一个条目会有所帮助,但是 none 尽管如此,我还是向 /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 的网络套接字,我无法通过转到 domainname.com:8001。又一次,nginx 似乎无法正常工作,而且我不确定如何使用 unix 套接字单独测试 uwsgi。
知道我做错了什么吗?我遵循了一些指南,并尝试了几种方法,none 似乎有效,我得到的最接近的是我链接到顶部的要点。但是当我尝试更改为 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 添加任何内容吗?例如,像我设置 static?
一样,为 nginx.conf 中的资产创建一些东西
例如将此添加到 nginx.conf:
location /assets {
alias /home/ubuntu/sasite-rewrite/assets
}
这是正确的做法吗?不幸的是,我无法让 nginx 为静态文件工作,所以我无法测试它。只是好奇我是否以正确的方式进行操作。
您的 STATIC_ROOT
是 ../assets,而不是 ../static,因此您应该将 nginx 位置别名指向 /static。
您还定义了一个指向 ../static 的 STATICFILE_ROOT 设置,但这不是 Django 设置,因此它不会执行任何操作。
我已经使用本指南设置了一个 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 中为资产添加另一个条目会有所帮助,但是 none 尽管如此,我还是向 /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 的网络套接字,我无法通过转到 domainname.com:8001。又一次,nginx 似乎无法正常工作,而且我不确定如何使用 unix 套接字单独测试 uwsgi。
知道我做错了什么吗?我遵循了一些指南,并尝试了几种方法,none 似乎有效,我得到的最接近的是我链接到顶部的要点。但是当我尝试更改为 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 添加任何内容吗?例如,像我设置 static?
一样,为 nginx.conf 中的资产创建一些东西例如将此添加到 nginx.conf:
location /assets {
alias /home/ubuntu/sasite-rewrite/assets
}
这是正确的做法吗?不幸的是,我无法让 nginx 为静态文件工作,所以我无法测试它。只是好奇我是否以正确的方式进行操作。
您的 STATIC_ROOT
是 ../assets,而不是 ../static,因此您应该将 nginx 位置别名指向 /static。
您还定义了一个指向 ../static 的 STATICFILE_ROOT 设置,但这不是 Django 设置,因此它不会执行任何操作。