Я использую 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