Nginx 不为 django 应用程序提供静态文件

Ama*_*r C 5 django nginx python-3.x gunicorn

我正在尝试使用 nginx + Gunicorn + mysql 部署 Django 项目。所有配置均已完成,但现在我的 nginx 对任何静态内容都会抛出 404 错误。

setting.py:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Run Code Online (Sandbox Code Playgroud)

Nginx 配置文件:

upstream app_server {
    server unix:/var/www/production/JDApps/jd/jd_gunicorn.sock fail_timeout=0;
}

server {
    listen 8000;
    server_name 10.1.1.2;

    keepalive_timeout 5;
    client_max_body_size 4G;

    access_log /var/log/nginx/jd-inventory-access.log;
    error_log /var/log/nginx/jd-inventory-error.log;

    location /static/ {
        alias /var/www/production/JDApps/jd/staticfiles;
    }

    location /media/ {
        alias /opt/;
    }

    location / {
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }
}
Run Code Online (Sandbox Code Playgroud)

Gunicorn启动脚本:

upstream app_server {
    server unix:/var/www/production/JDApps/jd/jd_gunicorn.sock fail_timeout=0;
}

server {
    listen 8000;
    server_name 10.1.1.2;

    keepalive_timeout 5;
    client_max_body_size 4G;

    access_log /var/log/nginx/jd-inventory-access.log;
    error_log /var/log/nginx/jd-inventory-error.log;

    location /static/ {
        alias /var/www/production/JDApps/jd/staticfiles;
    }

    location /media/ {
        alias /opt/;
    }

    location / {
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }
}
Run Code Online (Sandbox Code Playgroud)

文件结构:

#!/bin/bash

NAME="jd_inventory"
DJANGODIR=/var/www/production/JDApps/jd
USER=nginx
GROUP=nginx
WORKERS=3
BIND=unix:/var/www/production/JDApps/jd/jd_gunicorn.sock
DJANGO_SETTINGS_MODULE=jd.settings
DJANGO_WSGI_MODULE=jd.wsgi
LOGLEVEL=error
LOGFILE=/tmp/jd.log
echo "Starting $NAME as `whoami`"

# Activate the virtual environment

cd $DJANGODIR
source ../venv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Start your Django Unicorn

exec ../venv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $WORKERS \
  --user=$USER \
  --group=$GROUP \
  --bind=$BIND \
  --log-level=$LOGLEVEL \
  --log-file=$LOGFILE
Run Code Online (Sandbox Code Playgroud)

通过上述配置,nginx 会在任何静态文件中抛出 404 错误:

10.1.1.1 - - [23/Aug/2019:19:22:09 -0400] "GET /static/admin/css/base.css HTTP/1.1" 404 555 "http://10.1.1.2:8000/admin/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"

10.1.1.1 - - [23/Aug/2019:21:05:01 -0400] "GET /static/js/inventory.js HTTP/1.1" 404 555 "http://10.1.1.2/inventory/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会发生这种情况。我在“static”文件夹和“staticfiles”文件夹中有静态文件。但 nginx 无法获取任何此类文件。

更新:

我通过将 nginx conf 文件更改为:

root /var/www/production/JDApps/jd;
Run Code Online (Sandbox Code Playgroud)

然后将 django staic 文件从 staticfiles 复制到 static 文件夹。

所以我猜带有位置块的别名没有按预期工作。有人有猜测吗?

vin*_*zee 0

尝试:

alias /var/www/production/JDApps/jd/staticfiles/;
Run Code Online (Sandbox Code Playgroud)

带有尾随/.

感谢@Richard Smith 的评论