Digital Ocean 上的 Django 产品未加载静态文件

问题描述 投票:0回答:3

我即将在 Digital Ocean Droplet 上发布我的第一个 Django 项目。我按照官方 Digital Ocean 指南在 Droplet 上安装 Django (https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn- on-ubuntu-22-04#creating-systemd-socket-and-service-files-for-gunicorn)并且一切正常,但静态文件的服务。

以下是我的文件的关键部分:

设置.py

BASE_DIR = Path(__file__).resolve().parent.parent
STATIC_ROOT = os.path.join(BASE_DIR,"static")

STATIC_URL = '/static/'

DEBUG = False

COMPRESS_ROOT = os.path.join(BASE_DIR,"static")

COMPRESS_ENABLED = True

STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'compressor.finders.CompressorFinder',
]

urls.py

urlpatterns = [
    ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

这是我在数字海洋上的文件夹结构:

root/
    snap/
    gymtracker/
        gymenv/
        gymtracker/
            gymtrackerapp/
            static/

我在数字海洋的终端上看到所有静态文件都在这个位置:

/根/gymtracker/gymtracker/静态/

但是当我加载页面时,我得到静态文件的 403(否则页面加载正常):

请求方式:GET

状态代码:403 禁止

非常感谢您的帮助!

django nginx digital-ocean django-staticfiles
3个回答
2
投票

找到解决方案。

数字海洋教程 (https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-22-04#creating -systemd-socket-and-service-files-for-gunicorn)最后错过了一项重要的 Nginx 配置更改,以使静态资源显示出来。

按照教程进行操作后,您需要编辑 /etc/nginx/nginx.conf 并通过运行将用户从 www-data 更改为您的用户名(例如 sammy)

sudo nano /etc/nginx/nginx.conf

1
投票

另一种解决方案有效,但几乎没有其他选择。我认为最安全的方法是将 /static/ 文件夹移出 /home/{user}/ 目录

创建目录并设置权限:

sudo mkdir -pv /var/www/{项目名称或域名等}/static/

sudo chown -cR {用户}:{用户} /var/www/{项目名称或域名等}/

现在更改 NGINX 配置:

sudo nano /etc/nginx/sites-available/{project_name_or_domain_etc}

将“

location /static/
”部分替换为

location /static/ {
    alias /var/www/{project_name_or_domain_etc}/static/;
}

sudo systemctl 重新启动 nginx

还需要更改 DJANGO 设置,将“

STATIC_URL =
”行替换为:

STATIC_URL = '/static/'
STATIC_ROOT = '/var/www/{project_name_or_domain_etc}/static'
STATICFILES_DIRS = [BASE_DIR / 'static']

现在运行collectstatic,它应该可以工作!基于 https://realpython.com/django-nginx-gunicorn/#serving-static-files-directly-with-nginx


0
投票

此问题与

nginx
对生成的
static
文件夹的权限有关。无需修改 Django 设置、
static
文件夹位置或
nginx.conf
值。相反,以下内容应该足够了。

假设 Ubuntu@22 用户“sammy”正在运行

nginx
运行:

  1. sudo usermod -a -G sammy www-data
  2. sudo chown -R :www-data /home/sammy/your_django_project_directory

这将导致

nginx
拥有足够的权限来访问您的静态文件。要测试这一点,您可以尝试从网络浏览器(如
<your-domain-or-ip-address>/static/admin/css/base.css
)加载文件。

© www.soinside.com 2019 - 2024. All rights reserved.