django - Django Storages 无法在 nginx 和 docker 配置中上传静态文件
问题描述
上传媒体文件时,我无法让 NGINX(我认为这是罪魁祸首)与 django-storages 一起工作。它将从我的 S3 存储桶接收静态文件,但它只是拒绝发布到它。每当将图像上传到站点时,我都会收到 NGINX 500 内部服务器错误。它适用于默认的 django runserver 应用程序,我不确定是什么导致它失败。这一切都在 docker 容器中运行。这是我所拥有的:
设置,显示如何设置存储
AWS_STORAGE_BUCKET_NAME = 'sitename-staticfiles'
AWS_S3_REGION_NAME = 'us-east-1'
AWS_ACCESS_KEY_ID= 'access_key'
AWS_SECRET_ACCESS_KEY= 'secret_key'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_QUERYSTRING_AUTH = False
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
AWS_DEFAULT_ACL = None
STATICFILES_LOCATION = 'static'
STATICFILES_STORAGE = 'custom_storages.StaticStorage'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static', 'sitename')]
MEDIAFILES_LOCATION = 'media'
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage'
custom_storages.py
from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage
class StaticStorage(S3Boto3Storage):
location = settings.STATICFILES_LOCATION
class MediaStorage(S3Boto3Storage):
location = settings.MEDIAFILES_LOCATION
nginx.conf
user nobody;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name sitename.com localhost;
location / {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /;
uwsgi_pass unix:///var/tmp/sitename.sock;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
#include /etc/nginx/conf.d/*.conf;
#include /etc/nginx/sites-enabled/*;
}
uwsgi.ini
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = %d
# Django's wsgi file
module = sitename.wsgi
# the virtualenv (full path)
# home = /
#socket=:8000
# http = 0.0.0.0:8000
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# the socket (use the full path to be safe
socket = /var/tmp/sloopsnoop.sock
# ... with appropriate permissions - may be needed
chmod-socket = 666
# clear environment on exit
vacuum = true
docker-compose.yaml
version: '3.7'
services:
web:
build: ./app
entrypoint: ./entrypoint-prod.sh
volumes:
- ./app/:/usr/src/app/
- static_volume:/usr/src/app/static/
- media_volume:/usr/src/app/media/
ports:
- 8085:80
env_file:
- ./.env.dev
depends_on:
- db
db:
image: postgres:12-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=username
- POSTGRES_PASSWORD=password
- POSTGRES_DB=sitename_db_dev
volumes:
postgres_data:
static_volume:
media_volume:
解决方案
推荐阅读
- laravel - 如何在 Laravel 中使用带局部变量的 where 子句而不传递参数
- java - 由于向数据库添加数据而导致应用程序崩溃
- delphi - 使用 VCL 样式隐藏 MDI 表单中的滚动条
- eclipse - 为什么 Jenkins 会更改我的工作空间路径?
- laravel - 当单击外部 div 时,vuejs 停止传播单击
- javascript - useEffect 缺少依赖项(使用 useContext 而不是 useState 时)
- javascript - 如何获取 DOM 中渲染的 Vue 组件的数量?
- python - Python:“myvar = 1000”有什么作用?
- tcl - 在 tcl 中打开 gnome-terminal 并运行脚本
- php - 有人知道如何根据字符串名称更改颜色吗?