Nginx обслуживает статический файл и получил 403 запрещенных
Просто хочу помочь кому-нибудь. да, вы просто хотите обслуживать статический файл с помощью nginx, и вы все правильно поняли в nginx.conf:
location /static {
autoindex on;
#root /root/downloads/boxes/;
alias /root/downloads/boxes/;
}
Но, в конце концов, вы потерпели неудачу. Вы получили "403 запрещено" из браузера...
---------------------------------------- Ответ ниже: ------ ----------------------------------
Решение очень простое:
Способ 1: Запустите nginx как пользователь как владелец '/ root / downloads / boxes /'
В nginx.conf:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
ДА, в первой строке " nouser noboy; " просто удалите " # " и измените " nobody " на свое собственное имя пользователя в Linux/OS X, т.е. измените на " root " для проверки. Перезапустите nginx.
Внимание, вам лучше не запускать nginx от имени root! Вот только для тестирования, это опасно для хакера.
Для получения дополнительной информации см. Nginx (двигатель X) - Какая боль в заднице! [13: В доступе отказано]
Способ 2: замените владельца / root / downloads / boxes / на "www-data" или "nobody"
В терминале:
ps aux | grep nginx
Получить имя пользователя для запуска nginx. Это должно быть "www-data" или "nobody", определяемое версией nginx. Затем нажмите "Терминал" (например, используйте "www-data"):
chown -R www-data:www-data /root/downloads/boxes/
------------------------------ Еще одна важная вещь: -------------- ----------------
Эти родительские каталоги "/", "/ root", "/ root / downloads" должны предоставлять полномочия exe cute(x) для www-data или nobody. т.е.
ls -al /root
chmod o+x /root
chmod o+x /root/downloads
Дополнительные сведения см. В разделе " Устранение ошибки"403 Forbidden" и Nginx 403, запрещенной для всех файлов".
13 ответов
Вы должны дать разрешения nginx для чтения файла. Это означает, что вы должны дать пользователю, который запускает процесс nginx, права на чтение файла.
Этот пользователь, который запускает процесс nginx, настраивается с помощью user
директива в конфиге nginx, обычно находится где-то в верхней части nginx.conf
:
user www-data
http://wiki.nginx.org/CoreModule
Второй аргумент, который вы даете user
является группой, но если вы не укажете ее, она использует ту же самую, что и пользователь, поэтому в моем примере пользователь и группа оба www-data
,
Теперь файлы, которые вы хотите использовать в nginx, должны иметь правильные права доступа. У Nginx должны быть права на чтение файлов. Вы можете дать группе www-data
разрешения на чтение в файл, как это:
chown :www-data my-file.html
http://linux.die.net/man/1/chown
с chown
Вы можете изменить пользователя и владельца группы файла. В этой команде я изменяю только группу, если вы также измените пользователя, вы должны указать имя пользователя ДО двоеточия, например chown www-data:www-data my-file.html
, Но правильной установки прав доступа группы должно быть достаточно, чтобы nginx мог прочитать файл.
Поскольку Nginx обрабатывает статические файлы напрямую, ему необходим доступ к соответствующим каталогам. Нам нужно дать ему исполняемые разрешения для нашего домашнего каталога.
Самый безопасный способ сделать это - добавить пользователя Nginx в нашу собственную группу пользователей. Затем мы можем добавить исполняемое разрешение владельцам группы нашего домашнего каталога, предоставив Nginx достаточно доступа к файлам:
sudo usermod -a -G your_user nginx
chmod 710 / home /your_user
За принятый ответ
sudo chown -R :www-data static_folder
для изменения владельца группы всех файлов в этой папке
Я столкнулся с этой проблемой с проектом Django. Изменение прав пользователей и групп не помогло. Однако перенос всей статической папки из моего проекта в / var / www сделал.
Скопируйте статические файлы проекта в / var / www / static
# cp -r /project/static /var/www/static
Укажите nginx в правильном каталоге
# sudo nano /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
location /static/ {
root /var/www;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Протестируйте конфигурацию nginx и перезагрузите
# sudo nginx -t
# sudo systemctl reload nginx
Для меня это был SElinux, мне пришлось запустить следующее: (RHEL/Centos на AWS)
sudo setsebool -P httpd_can_network_connect on
chcon -Rt httpd_sys_content_t /var/www/
Покопавшись в очень полезных ответах, решил собрать все рецепты, связанные с разрешениями. В частности, самое простое решение с максимальной безопасностью (= минимальные разрешения).
- Предположим, мы развернули сайт как пользователь
admin
она владеет сайтом dir и всем внутри. Мы не хотим запускать nginx от имени этого пользователя (слишком много разрешений). Это нормально для тестирования, а не для прод. - По умолчанию Nginx запускает рабочих как пользователь
nginx
то есть конфиг содержит строкуuser nginx
- По умолчанию пользователь
nginx
находится в группе с тем же именем:nginx
, - Мы хотим дать минимальные разрешения пользователю
nginx
без изменения владельца файла. Это кажется наиболее безопасным из наивных вариантов. Чтобы обслуживать статические файлы, минимальные необходимые разрешения в иерархии папок (см. Групповые разрешения) должны быть такими (используйте команду
namei -l /home/admin/WebProject/site/static/hmenu.css
):корень dr-xr-xr-x /
drwxr-xr-x root root home
drwxr-x --- admin nginx admin
drwx - x --- admin nginx WebProject
drwx - x --- admin сайт nginx
drwx - x --- admin nginx static
-rwxr ----- admin nginx hmenu.cssДалее, как получить эту красивую картинку? Чтобы изменить групповое владение для dirs, мы сначала применяем
sudo chown :nginx /home/admin/WebProject/site/static
и затем повторите команду, убрав dirs справа налево.Чтобы изменить разрешения для dirs, мы применяем
sudo chmod g+x /home/admin/WebProject/site/static
и снова раздеваю реж.Измените группу для файлов в каталоге /static:
sudo chown -R :nginx /home/admin/WebProject/site/static
Наконец, измените разрешения для файлов в каталоге /static:
sudo chmod g+r /home/admin/WebProject/site/static/*
(Конечно, можно создать отдельную группу и изменить имя пользователя, но это затеняет повествование неважными деталями.)
Установка пользователя root в nginx может быть очень опасной. Необходимость установки разрешений для всей файловой иерархии может быть громоздкой (представьте, что полный путь к папке находится в более чем 10 подпапках).
Что бы я сделал, это отразил папку, к которой вы хотите предоставить общий доступ, в /usr/share/nginx/any_folder_name с разрешениями для сконфигурированного пользователя nginx (обычно это www-data). Что вы можете сделать с bindfs.
В вашем случае я бы сделал:
sudo bindfs -u www-data -g www-data /root/downloads/boxes/ /usr/share/nginx/root_boxes
Он будет монтировать / root / downloads / boxes в /usr/share/nginx/root_boxes со всеми разрешениями для пользовательских www-данных. Теперь вы устанавливаете этот путь в конфигурации вашего блока местоположения
location /static {
autoindex on;
alias /usr/share/nginx/root_boxes/;
}
Попробуйте принятый ответ @gitaarik, и если он все еще дает 403 Forbidden
или 404 Not Found
и ваше целевое местоположение /
читать дальше.
У меня тоже возникла эта проблема, но ни одно из упомянутых выше изменений разрешений не решило мою проблему. Решилось добавлениемroot
директиву, потому что я определял корневое местоположение (/
) и случайно воспользовался alias
директиву, когда я должен был использовать root
директива.
Конфигурация принята, но дает 403 Forbidden
, или 404 Not Found
если автоиндексирование включено для /
:
location / {
alias /my/path/;
index index.html;
}
Правильное определение:
location / {
root /my/path/;
index index.html;
}
Вы можете просто сделать то, что сделано:
ЦенОС/Федора
sudo usermod -a -G your_user_name nginx
chmod 710 /home/your_user_name
Убунту / Дебиан
sudo usermod -a -G your_user_name www-data
sudo chown -R :www-data /path/to/your/static_folder
И в вашем файле nginx, который обслуживает ваш сайт, убедитесь, что ваше местоположение для
static
вот так:
location /static/ {
root /path/to/your/static_folder;
}
Тем, у кого заблокировали доступ по ssh , следуя ответу @sandes для Ubuntu. Вам нужно каким-то образом восстановить доступ в качестве пользователя с разрешениями и запустить эту команду
sudo gpasswd -d www-data your_user
Это удалит пользователя www-data из группы и позволит вам снова войти в систему.
Мой nginx запускается как пользователь nginx и группа nginx, но добавление группы nginx в общую папку у меня не работает.
Я проверяю разрешение как пользователь nginx.
su nginx -s /bin/bash
Я нашел, что мне нужно добавить группу для полного пути. Мой путь начинается с /root, поэтому мне нужно сделать следующее:
chown -R :nginx /root
Я довольно долго бился головой об этой проблеме 403. Я использую CentOS от DigitalOcean.
Я думал, что исправить проблему, просто установив SELINUX=disabled в / etc / selinux / config, но я ошибался. Как-то у меня капелька облажалась.
У меня это работает! sudo chown nginx:nginx /var/www/mydir
Лучший вариант для этого — поместить статику в/var/www/static/
и изменить свой/etc/nginx/sites-available/projectname
к
location /static/ {
root /var/www;
}
или
location /static/ {
alias /var/www/static;
}