【问题标题】:media not displayed in django deploy using nginx + gunicorn service使用 nginx + gunicorn 服务在 django 部署中未显示媒体
【发布时间】:2019-11-02 07:52:43
【问题描述】:

我正在使用 Nginx 和 gunicorn 服务在 VPS(debian 9)中部署 django 应用程序。一切都按预期工作,但用户在媒体文件中上传的图像未显示,404(未找到)。当我使用Debug=True 显示图像时,静态文件在开发和生产中正常工作。

为了运行这个应用程序,我创建了一个没有 sudo 权限的网络用户和一个名为 webapps 的组。由于似乎nginx看不到媒体我已将组更改为www-data,但仍然无法正常工作。有一个类似的问题here,但没有接受的答案。任何帮助将不胜感激。

下面是一些重要的配置:

(web_env) webuser@:~/web_project$ ls -la
total 72
drwxrwxr-x 10 webuser www-data  4096 Jun 11 20:30 .
drwxr-xr-x  3 webuser webapps   4096 Jun 10 17:15 ..
drwxr-xr-x  6 webuser webapps   4096 Jun 10 17:15 blog
-rw-r--r--  1 webuser webapps    655 Jun 10 17:15 environment.yaml
drwxr-xr-x  2 webuser webapps   4096 Jun 10 17:15 .idea
drwxr-xr-x  2 webuser webuser   4096 Jun 11 17:28 logs
-rwxr-xr-x  1 webuser webapps    631 Jun 10 17:15 manage.py
drwxrwxr-x  3 webuser www-data  4096 Jun 10 17:15 media
-rw-r--r--  1 webuser webapps  14417 Jun 10 17:15 posts.json
-rw-r--r--  1 webuser webapps    229 Jun 10 17:15 README.md
-rw-r--r--  1 webuser webapps    161 Jun 10 17:15 requirements.txt
drwxrwxr-x  2 webuser www-data  4096 Jun 19 13:47 run
drwxrwxr-x  4 webuser www-data  4096 Jun 11 16:31 static
drwxr-xr-x  5 webuser webapps   4096 Jun 16 12:12 users
drwxr-xr-x  3 webuser webapps   4096 Jun 19 15:52 web_project

/etc/systemd/system/gunicorn.service 中的 Gunicorn 服务

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=webuser
Group=www-data
WorkingDirectory=/home/webuser/DjangoProjects/web_project
ExecStart=/home/webuser/.conda/envs/web_env/bin/gunicorn \
      --access-logfile - \
      --workers 3 \
      --bind 
unix:/home/webuser/DjangoProjects/web_project/run/gunicorn.soc$
      web_project.wsgi:application

[Install]
WantedBy=multi-user.target

我的 nginx 配置

server {
    listen         80;
    server_name    mysite.com;
    client_max_body_size 100M; #to have space to load images
    return         301 https://$server_name$request_uri;
}

server {
    listen         443 ssl;
    server_name    mysite.com www.mysitet;
    client_max_body_size 100M; #to have space to load images

    ssl on;
    ssl_certificate /etc/letsencrypt/live/mysite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem;

    location /static/ {
            autoindex on;
            alias /home/webuser/DjangoProject/web_project/static/;
    }

    location /media/ {
            autoindex on;
            alias /home/webuser/DjangoProject/web_project/media/;
    }

    location / {
            include proxy_params;           
            proxy_pass http://unix:/home/webuser/DjangoProjects/web_project/run/gunicorn.sock;

    }
}

我的 settings.py 的某些部分

import os
import json

with open('/etc/config.json') as config_file:
    config = json.load(config_file)

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


SECRET_KEY = config['SECRET_KEY']
DEBUG = False
ALLOWED_HOSTS = ['mysite.com', '198.XX.XX.XXX']

INSTALLED_APPS = [
  'blog.apps.BlogConfig',
  'users.apps.UsersConfig',
  'crispy_forms',
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
]

ROOT_URLCONF = 'web_project.urls'

TEMPLATES = [
  {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [
        ''
    ],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
  },
]

WSGI_APPLICATION = 'web_project.wsgi.application'

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'dbname',
    'USER': 'webuser',
    'PASSWORD': 'dbpassword',
    'HOST': 'localhost',
    'PORT': '',
  }
}

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

在 urls.py 我已经添加了

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

当然,在每次更改后我都会使用它来运行

sudo systemctl restart nginx
sudo pkill gunicorn
sudo systemctl daemon-reload
sudoo systemctl start gunicorn

已编辑

/var/logs/nginx

2019/06/19 20:17:13 [error] 17420#17420: *53 open() "/home/webuser/DjangoProject/web_project/media/profile_pics/StackOverFlowPicture_TL8URPF.png" failed (2: No such file or directory), client: 109.132.181.209, server: example.com, request: "GET /media/profile_pics/StackOverFlowPicture_TL8URPF.png HTTP/1.1", host: "example.com", referrer: "https://example.com/"
2019/06/19 20:17:17 [error] 17420#17420: *53 open() "/home/webuser/DjangoProject/web_project/media/default.jpg" failed (2: No such file or directory), client: 109.132.181.209, server: example.com, request: "GET /media/default.jpg HTTP/1.1", host: "example.com", referrer: "https://example.com/profile/"

原始图片是 StackOverFlowPicture.png 但知道我还有另一张图片

webuser@:~/DjangoProjects/web_project/media/profile_pics$ ls
StackOverFlowPicture.png  StackOverFlowPicture_TL8URPF.png

【问题讨论】:

  • /home/webuser - 您的服务是否在此用户下运行? ~/web_project != /home/webuser/DjangoProject/web_project
  • 我不太明白你的问题。我的项目目录 web_project 位于 /home/webuser/.. 我可以在登录 webuser 时运行 gunicorn web_project.wsgi:application --bind mysite.com:8000 但要重新启动 nginx 或杀死 gunicorn 我需要使用具有 sudo 权限的用户。我在检查 nginx 日志时意识到了一个不同的错误。请检查已编辑的问题。
  • project directory web_project is located in /home/webuser/ 那么为什么将 nginx 指向不存在的附加子文件夹 DjangoProject?此外,如果您不在webuser 登录下运行这些服务,那么使用的登录可能无法访问webuser 主文件夹或一些主子文件夹。
  • @Ivan Starostin web_project 位于/home/webuser/DjangoProject/web_project。我从 user1 运行 sudo 命令。我注意到在 /var/www/example.com 中有一个带有 profile_pics 子目录的媒体目录,两个目录都是空的。现在我迷路了,nginx在哪里看图片?我已将 user1 添加到 www-data 组,但它并没有解决问题。我认为这是权限问题,但我不知道该怎么做。 user1 将如何访问 django 项目?
  • DjangoProjects != DjangoProject

标签: django nginx gunicorn


【解决方案1】:

感谢 Ivan Starostin 指出我的拼写错误 DjangoProjects != DjangoProject 和我的最后一个日志错误

2019/06/20 11:06:46 [error] 22983#22983: *1 open() "/home/webuser/DjangoProjects/web_project/media/media/profile_pics/StackOverFlowPicture_TL8URPF.png" failed (2: No such file or directory), client: 109.132.217.176, server: example.com, request: "GET /media/profile_pics/StackOverFlowPicture_TL8URPF.png HTTP/1.1", host: "example.com", referrer: "https://example.com/"

我已经通过改变解决了这个问题

location /media/ {
        autoindex on;
        alias /home/webuser/DjangoProject/web_project/media/;
}

location /media/ {
        autoindex on;
        alias /home/webuser/DjangoProject/web_project;
}

现在图片已加载。感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 2020-04-06
    • 1970-01-01
    • 2015-06-02
    • 2013-12-08
    • 2018-10-08
    • 2016-10-27
    • 2014-10-20
    相关资源
    最近更新 更多