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 文件夹。
所以我猜带有位置块的别名没有按预期工作。有人有猜测吗?
尝试:
alias /var/www/production/JDApps/jd/staticfiles/;
Run Code Online (Sandbox Code Playgroud)
带有尾随/
.
感谢@Richard Smith 的评论。