姜戈 |由 nginx 提供的静态文件未被客户端使用
Django | Static files served by nginx not used by Client
我有一个 Django 应用程序,静态文件的设置如下:
STATIC_DIR = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = [STATIC_DIR,]
STATIC_ROOT = '/opt/static/'
我是 运行 django 使用以下 gunicorn 命令:
gunicorn evee.wsgi -b 0.0.0.0:8000
.
我已使用以下配置配置 nginx 以提供静态文件和 ssl:
server {
keepalive_timeout 5;
listen 443 ssl;
server_name api.home.com;
client_max_body_size 4G;
error_page 500 502 503 504 /500.html;
# path for static files
root /opt;
location / {
# checks for static file, if not found proxy to app
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Ssl off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port 80;
proxy_set_header X-Forwarded-Proto $scheme;
# we don't want nginx trying to do something clever with
# redirects, we set the Host: header above already.
proxy_redirect off;
proxy_pass http://evee:8000;
}
}
有趣的是,我能够在客户端中看到 CSS。例如,对 https://secapi.ril.com/static/admin/css/base.css
的请求是成功的,并且 returns 是一个 200 响应。我可以在提到的 URL 查看所有静态文件,但 django 似乎没有使用它们。换客户端和私密模式都试过
我是不是做错了什么?我上次检查时这是有效的。
尝试在您的 nginx 配置文件中添加静态文件路径:
location /static/ {
alias /opt/static/;
}
此处提及静态文件夹的完整路径。我猜你的情况是 /opt/static/
这是我解决这个问题的方法。必须编辑 nginx.conf 文件来配置上游,而不是直接将其重定向到 http,并删除一些正在设置的 headers。不知道它有多么不同,也不知道为什么会这样。 Docker Swarm 中的整个设置 运行。
#### SECAPI #####
upstream app_server {
# for a TCP configuration
server evee:8000 fail_timeout=0;
}
server {
keepalive_timeout 5;
listen 443 ssl;
server_name api.home.com;
client_max_body_size 4G;
error_page 500 502 503 504 /500.html;
# path for static files
root /opt;
location / {
# checks for static file, if not found proxy to app
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
# we don't want nginx trying to do something clever with
# redirects, we set the Host: header above already.
proxy_redirect off;
proxy_pass http://app_server;
}
}
我有一个 Django 应用程序,静态文件的设置如下:
STATIC_DIR = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = [STATIC_DIR,]
STATIC_ROOT = '/opt/static/'
我是 运行 django 使用以下 gunicorn 命令:
gunicorn evee.wsgi -b 0.0.0.0:8000
.
我已使用以下配置配置 nginx 以提供静态文件和 ssl:
server {
keepalive_timeout 5;
listen 443 ssl;
server_name api.home.com;
client_max_body_size 4G;
error_page 500 502 503 504 /500.html;
# path for static files
root /opt;
location / {
# checks for static file, if not found proxy to app
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Ssl off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port 80;
proxy_set_header X-Forwarded-Proto $scheme;
# we don't want nginx trying to do something clever with
# redirects, we set the Host: header above already.
proxy_redirect off;
proxy_pass http://evee:8000;
}
}
有趣的是,我能够在客户端中看到 CSS。例如,对 https://secapi.ril.com/static/admin/css/base.css
的请求是成功的,并且 returns 是一个 200 响应。我可以在提到的 URL 查看所有静态文件,但 django 似乎没有使用它们。换客户端和私密模式都试过
我是不是做错了什么?我上次检查时这是有效的。
尝试在您的 nginx 配置文件中添加静态文件路径:
location /static/ {
alias /opt/static/;
}
此处提及静态文件夹的完整路径。我猜你的情况是 /opt/static/
这是我解决这个问题的方法。必须编辑 nginx.conf 文件来配置上游,而不是直接将其重定向到 http,并删除一些正在设置的 headers。不知道它有多么不同,也不知道为什么会这样。 Docker Swarm 中的整个设置 运行。
#### SECAPI #####
upstream app_server {
# for a TCP configuration
server evee:8000 fail_timeout=0;
}
server {
keepalive_timeout 5;
listen 443 ssl;
server_name api.home.com;
client_max_body_size 4G;
error_page 500 502 503 504 /500.html;
# path for static files
root /opt;
location / {
# checks for static file, if not found proxy to app
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
# we don't want nginx trying to do something clever with
# redirects, we set the Host: header above already.
proxy_redirect off;
proxy_pass http://app_server;
}
}