[已解决] Nginx不为Django应用提供静态文件

时间:2019-08-24 01:07:35

标签: django python-3.x nginx 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')

Nginx conf文件

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;
    }
}

Gunicorn启动脚本

#!/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

文件结构

[root@vm-1 JDApps]# pwd
/var/www/production/JDApps
[root@vm-1 JDApps]# ll
total 4
drwxr-xr-x. 7 nginx nginx 148 Aug 23 19:21 jd
-rw-r--r--. 1 nginx nginx 455 Aug 22 19:19 requirements.txt
drwxr-xr-x. 6 nginx nginx  69 Aug 22 19:19 venv
[root@vm-1 JDApps]# ll *
-rw-r--r--. 1 nginx nginx 455 Aug 22 19:19 requirements.txt

jd:
total 4
-rw-r--r--. 1 nginx nginx   0 Aug 22 22:30 filename_new.log
drwxr-xr-x. 4 nginx nginx 217 Aug 21 18:06 inventory
drwxr-xr-x. 3 nginx nginx  93 Aug 23 20:55 jd
srwxrwxrwx. 1 nginx nginx   0 Aug 23 19:21 jd_gunicorn.sock
-rw-rw-r--. 1 nginx nginx 622 Aug 21 18:06 manage.py
drwxrwxr-x. 4 nginx nginx  64 Aug 21 18:06 static
drwxr-xr-x. 6 nginx nginx  99 Aug 22 21:36 staticfiles
drwxrwxr-x. 3 nginx nginx 277 Aug 21 18:06 templates

venv:
total 4
drwxr-xr-x. 3 nginx nginx 4096 Aug 22 21:45 bin
drwxr-xr-x. 2 nginx nginx   24 Aug 22 19:17 include
drwxr-xr-x. 3 nginx nginx   23 Aug 22 19:17 lib
lrwxrwxrwx. 1 nginx nginx    3 Aug 22 19:17 lib64 -> lib
drwxr-xr-x. 3 nginx nginx   17 Aug 22 19:19 share
[root@vm-1 JDApps]# 


通过上述配置,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"

我不明白为什么会这样。我在“ static”文件夹和“ staticfiles”文件夹中都有静态文件。但是nginx无法获得任何这些文件。

更新

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

root /var/www/production/JDApps/jd;

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

因此,我猜想带有位置块的别名无法按预期工作。 任何人都有猜想

解决方案 检查评论。

0 个答案:

没有答案