我即将在 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 禁止
非常感谢您的帮助!
找到解决方案。
数字海洋教程 (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
另一种解决方案有效,但几乎没有其他选择。我认为最安全的方法是将 /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
此问题与
nginx
对生成的 static
文件夹的权限有关。无需修改 Django 设置、static
文件夹位置或 nginx.conf
值。相反,以下内容应该足够了。
假设 Ubuntu@22 用户“sammy”正在运行
nginx
运行:
sudo usermod -a -G sammy www-data
sudo chown -R :www-data /home/sammy/your_django_project_directory
这将导致
nginx
拥有足够的权限来访问您的静态文件。要测试这一点,您可以尝试从网络浏览器(如 <your-domain-or-ip-address>/static/admin/css/base.css
)加载文件。