Назад | Перейти на главную страницу

настроить nginx для обслуживания статических файлов разработки django

Я использую Nginx для обслуживания статических файлов на сервере разработки django. Однако я не могу заставить его работать. Сервер работает нормально, но nginx не может найти статические файлы.

Это мои настройки в nginx.conf:

listen       8080;
server_name  localhost;

#charset koi8-r;
#access_log  logs/host.access.log  main;

location / {
    #root   html;
    #index  index.html index.htm;
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header X-Forwarded-Host $server_name;
    proxy_set_header X-Real-IP $remote_addr;
}
location /static/  {
    alias /path/Documents/python_projects/to_pm/static/;
    access_log off;
    expires    30d;
}

Мой проект settings.py:

STATIC_URL = '/static/'

# for production
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

И я также использовал python manage.py collectstatics скопировать все статические файлы в /path/Documents/python_projects/to_pm/static/ папка.

Но когда я использую http://localhost:8080 сайт выглядит очень некрасиво, очевидно, что статические файлы не обслуживаются nginx. Как я могу это исправить?

В моих журналах ошибок сказано

13: Отказано в разрешении для статических файлов

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

[emerg] getgrnam("root") failed in /usr/local/etc/nginx/nginx.conf:2

У меня была похожая проблема. Оказалось, что это проблема SELinux, проявившаяся после обновления.

*Это решение применяется, если ваши статические файлы находятся ниже домашней папки пользователя.

Заглянув в журнал nginx в /var/log/nginx/-error.log, я увидел, что процессу nginx отказано в доступе при попытке открыть статические файлы.

После этого я заглянул в журнал аудита (/var/log/audit/audit.log). В этом файле содержится вся информация о том, что происходит, но его трудно читать.

Но есть хороший инструмент под названием audit2why (yum установить policycoreutils-python)

Итак, если вы попробуете это: grep 1433926027.242: 416 /var/log/audit/audit.log | audit2why

У меня есть этот номер 1433926027.242, глядя в хвост файла audit.log

При запуске показал решение. Просто нужно засеять флаг с помощью setsebool:

setsebool -P httpd_read_user_content 1

После этого мой nginx мог без проблем открывать статические файлы. *

Надеюсь, поможет!

Я нашел ответ на свой вопрос:

Ответ в этой статье:

https://gist.github.com/jhjguxin/6208474

Как указывается:

Nginx needs to have read permission of the files that should be served AND 
have execute permission in each of the parent directories along the path from 
the root to the served files.

Статическая папка также должна принадлежать вашему пользователю nginx.

Если вы используете CentOS, вы можете:

# This allows to use semanage - SELinux Policy Management tool
sudo yum install -y policycoreutils-python 

sudo chown -R $USER:$USER /home/path/Documents/python_projects/to_pm/static
sudo usermod -a -G $USER nginx
sudo chmod 755 -R /home
sudo semanage fcontext -a -t httpd_sys_content_t /home/path/Documents/python_projects/to_pm/static(/.*)?"
sudo restorecon -R -v /home/path/Documents/python_projects/to_pm/static
sudo systemctl restart nginx