Gunicorn выдает ошибку 403 при доступе к статическим файлам - PullRequest
0 голосов
/ 23 января 2019

python==2.7.5, django==1.11.10, gunicorn==19.7.1, RHEL 7.4

У меня на работе django проект, написанный не мной. Он находился в домашнем каталоге eventcat пользователя, и со временем нам не хватило места на диске. Я должен был перенести проект на /data/. После того, как я переместил каталог проекта и настроил новую среду, я столкнулся с проблемой, что статические файлы не загружаются и выдают ошибку 403 forbidden.

Хорошо, я знаю, что gunicorn не должен обслуживать статические файлы на производстве, но это внутренний проект с низкой нагрузкой. Я должен иметь дело с этим как есть.

Сервер запускается с помощью собственного сценария (я изменил строку среды на новый путь):

#!/bin/sh
. ~/.bash_profile
. /data/eventcat/env/bin/activate
exec gunicorn -c gunicorn.conf.py eventcat.wsgi:application

gunicorn.conf.py состоит из:

bind = '127.0.0.1:8000'
backlog = 2048
workers = 1
worker_class = 'sync'
worker_connections = 1000
timeout = 120
keepalive = 2
spew = False
daemon = True
pidfile = 'eventcat.pid'
umask = 0
user = None
group = None
tmp_upload_dir = None
errorlog = 'er.log'
loglevel = 'debug'
accesslog = 'ac.log'
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
proc_name = None 

def post_fork(server, worker):
    server.log.info("Worker spawned (pid: %s)", worker.pid)

def pre_fork(server, worker):
    pass

def pre_exec(server):
    server.log.info("Forked child, re-executing.")

def when_ready(server):
    server.log.info("Server is ready. Spawning workers")

def worker_int(worker):
    worker.log.info("worker received INT or QUIT signal")
    import threading, sys, traceback
    id2name = dict([(th.identm, th.name) for th in threading.enumerate()])
    code = []
    for threadId, stack in sys._current_frames().items():
        code.append("\n# Thread: %s(%d)" % (id2name.get(threadId, ""), threadId))
        for filename, lineno, name, line in traceback.exctract_stack(stack):
            code.append('File: "%s", line %d, in %s' %(filename, lineno, name))
            if line:
                code.append(" %s" % (line.strip()))
    worker.log.debug("\n".join(code))

def worker_abort(worker):
    worker.log.info("worker received SIGABRT signal")

Все файлы в каталоге static принадлежат пользователю eventcat, так же как и сам каталог. Я не смог найти никакой полезной информации в er.log и ac.log.

Сервер работает по протоколу https, а в каталоге проекта ssl.conf. У него есть псевдонимы для static и media, указывающие на предыдущее местоположение проекта, и я изменил все эти записи на новые. Хотя я не мог найти, где этот файл конфигурации используется.

Пожалуйста, посоветуйте, как мне выяснить причину проблемы. Какие файлы конфигурации или что-то мне нужно посмотреть?

UPDATE : Благодаря @ruddra, gunicorn не служил статическому вообще. Это было httpd. После внесения изменений в конфиг httpd все работает.

1 Ответ

0 голосов
/ 23 января 2019

Насколько я знаю, gunicorn не обслуживает статическое содержимое.Поэтому для обслуживания статического содержимого лучше всего использовать whitenoise или использовать NGINX, Apache или любой обратный прокси-сервер.Вы можете проверить документацию Gunicorn о развертывании с использованием NGINX.

Если вы хотите использовать белизну, установите ее, используя:

pip install whitenoise

Затем добавьте белизну к MIDDLEWARES следующим образом (внутри settings.py):

MIDDLEWARE = [
  # 'django.middleware.security.SecurityMiddleware',
  'whitenoise.middleware.WhiteNoiseMiddleware',
  # ...
]
...