Nginx: stat () не удалось (13: отказано в разрешении)

103

Я использую конфигурацию по умолчанию при добавлении определенного каталога с nginx, установленным на моем компьютере с Ubuntu 12.04.

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6

        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                root /username/test/static;
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
...

...
}

Я просто хочу, чтобы простой статический сервер nginx обслуживал файлы из этого каталога. Однако, проверяя, error.logя вижу

2014/09/10 16:55:16 [crit] 10808#0: *2 stat() "/username/test/static/index.html" failed (13: Permission denied), client:, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "domain"
2014/09/10 16:55:16 [error] 10808#0: *2 rewrite or internal redirection cycle while internally redirecting to "/index.html

Я уже сделал chown -R www-data:www-dataна /username/test/static, я поставил их chmod 755. Не знаю, что еще нужно установить.

user299709
источник
3
Проверьте, может ли www-dataпользователь cdперейти в /username/test/staticкаталог:sudo -u www-data cd /username/test/static
Maciej Sz
Мне отказано в разрешении, но когда я использую ls -l, он показывает, что он установлен на www-data user
user299709
2
Может быть, / username находится на encryptfs? У меня точно такие же проблемы с папкой / home / username, в которой находится мой сайт. Если я уберу его из encryptfs, все будет нормально. Для меня все еще нет решения ...
Георгий

Ответы:

194

Nginx работает в каталоге, поэтому, если вы не можете cdперейти в этот каталог от пользователя nginx, он завершится ошибкой (как и statкоманда в вашем журнале). Убедитесь, что www-userбанка cdдо /username/test/static. Вы можете подтвердить, что программа statзавершится неудачно или успешно, запустив

sudo -u www-data stat /username/test/static

В вашем случае, вероятно, /usernameпроблема здесь в каталоге. Обычно www-dataне имеет прав доступа cdк домашним каталогам других пользователей.

Лучшим решением в этом случае было бы добавить www-dataв usernameгруппу:

gpasswd -a www-data username

и убедитесь, что usernameгруппа может войти во все каталоги по пути:

chmod g+x /username && chmod g+x /username/test && chmod g+x /username/test/static

Чтобы ваши изменения работали, перезапустите nginx

nginx -s reload
Maciej Sz
источник
Означает ли это, что для каждого нового каталога, добавляемого в корневой каталог, необходимо выполнить команду chmod для новых каталогов?
Цянь Чен
2
@ElgsQianChen имейте в виду, что это система разрешений на уровне ОС, поэтому в системах POSIX это зависит от вашего umask. Если вам нужно более общее решение, для которого не требуется chmodкаждый новый каталог, то решение есть. Это требует обратного группового объединения ( usernameв www-dataгруппу) и использования setgid. Не стесняйтесь размещать новый вопрос для более подробного описания, и я буду рад ответить.
Maciej Sz
Что делать, если мой путь находится в каталоге / root /? Безопасно ли выполнять команду chmod g + x на / root? А добавление www-данных в корневую группу?
Олег Абражаев
В Fedora 24 моя проблема возникла с ... разрешениями ACL ... другим уровнем ... ДА!
Рэй Фосс
1
Ну, мой nginxпользователь может получить доступ к каталогу моего веб-сайта, но все же в журналах ошибок говорится, что разрешение отклонено.
Рахил Вазир
89

У меня была такая же проблема с коробкой CentOS 7.

Кажется, я попал в selinux. Перевод selinux в разрешающий режим ( setenforce permissive) на данный момент решил проблему. Я постараюсь вернуться с правильным исправлением.

Эндрю Ричард Миллер
источник
4
Это именно то «недокументированное» поведение, которое я пытался понять последние 3 дня ...
Ахилл,
2
Вот сообщение об этом поведении: axilleas.me/en/blog/2013/…
Achilles
2
Итак, я вернулся сюда ... На этот раз я обнаружил, что скопировал рассматриваемый файл из моего домашнего каталога в каталог html и обновил право собственности. Та же проблема, что и в 2015 году ... Лучшее исправление: ls -Z myFile.jsпокажет контекст SELinux: -rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js Используйте chcon -v --type=httpd_sys_content_t myFileдля изменения содержимого SELinux.
Эндрю Ричард Миллер
2
Ага; Я была такая же проблема. sudo setenforce 0исправил это для меня.
Overload119
1
Обратите внимание: если вы хотите полностью отключить selinux, вам необходимо изменить SELINUXзначение на disabledin /etc/selinux/config, а затем выполнить перезагрузку. Когда он установлен permissive, он все еще может выполнять проверки «за кулисами» (используя ценный процессор), но не предпринимать никаких действий.
Оливер Таппин
77

Nginx должен иметь доступ + x ко всем каталогам, ведущим к корневому каталогу сайта.

Убедитесь, что у вас есть + x во всех каталогах на пути, ведущем к корню сайта. Например, если корень сайта / home / username / siteroot:

chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot
Сайрам Криш
источник
13
После 6 часов отчаянных поисков ... найденное тело упомянуло это, но вы! Спасибо!
Валид Аммар
3
Спасибо вам большое! Потратили часы, пытаясь заставить это работать, и натолкнулись на всевозможные ответы, не могу поверить, что это было так просто!
Эрик Грум
2
у меня эта работа отлично работает, centos 7, php fpm 7.2 (selinux уже выключен)
anhduc.bkhn
1
Спасибо! Не могу поверить, что это все, что мне приходилось делать все время!
exciteabletom
1
Спасибо, отлично !.
Softsofter,
32

В CentOS 7.0 у меня была эта Access Deinedпроблема, вызванная SELinux, и эти шаги решили проблему:

yum install -y policycoreutils-devel
grep nginx /var/log/audit/audit.log | audit2allow -M nginx
semodule -i nginx.pp

Обновление: просто примечание из того, что я узнал при использовании виртуальных серверов Linux Digitalocean, или, как они их называют, капли . Использование SELinux требует приличного количества оперативной памяти. Скорее всего, вы не сможете запускать и управлять SELinux в капле с менее чем 2 ГБ оперативной памяти.

Ахиллес
источник
2
Большое спасибо за это. Это действительно решило мою проблему (также на CentOS 7), но затем я был заблокирован вторым отказом в другом месте, поэтому я обратился setenforce 0. Однако, оглядываясь назад на то, что на самом деле делает это решение, я понял, что мне нужно повторно запустить команды, чтобы обновить разрешения для пользователя nginx. Похоже, это сработало, и я смог вернуть SELinux к принудительному исполнению.
danj1974
Что ж, может быть, уже слишком поздно. Тем не менее, стоит упомянуть, что когда вы продолжаете принудительно выполнять SELinux; обязательно помнить, что программное обеспечение, такое как Nginx, вставляет в SELinux свой собственный набор правил, таких как порты по умолчанию, пути по умолчанию, доступ для чтения / записи к путям и т. д. Если вы не хотите никаких проблем, вы должны следовать этим правилам (например, помещать свои файлы HTML / PHP в / var / www) или подготовиться к преодолению проблем, возникающих глубоко в контексте SELinux. Это может быть полезно [CentOS <8]: getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
Ахилл,
27

Возможно, у вас работает Linux с усиленной безопасностью, поэтому добавьте для этого правило. У меня было разрешение 13 ошибок, хотя разрешения были установлены и пользователь существовал ..

chcon -Rt httpd_sys_content_t /username/test/static

Артём Курапов
источник
Спасибо! Работал над выпуском CentOS 6.10 (Final).
Marw
1
Работал на CentOS 7.5.1804 (Core).
Niek
4

Симптом:

Не удалось загрузить изображения в медиатеку WordPress.

Причина:

(CentOS) yum update

Ошибка:

2014/10/22 18:08:50 [crit] 23286#0: *5332 open() "/var/lib/nginx/tmp/client_body/0000000003" failed (13: Permission denied), client: 1.2.3.4, server: _, request: "POST /wp-admin/media-new.php HTTP/1.1", host: "example.com", referrer: "http://example/wp-admin/media-new.php"

Решение:

chown -R www-data:www-data /var/lib/nginx

Пи Джей Брюнет
источник
2

По умолчанию статические данные при установке nginx будут в / var / www / html. Таким образом, вы можете просто скопировать свою статическую папку в / var / html / и установить

root /var/www/<your static folder>

в ngix.conf (или / etc / nginx / sites-available / default)

Это сработало для меня на ubuntu, но я думаю, что для других дистрибутивов это не должно сильно отличаться.

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

Патрик Бего
источник
2

Измените свою nginx.conf userсобственность на www-staticfiles owener.

#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user your_user_name;

# same other config
lonnyzhang423
источник
1

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

chown -R nginx:nginx /username/test/static
Джулиан Салас
источник
1

В моем случае папка, которая обслуживала файлы, была символической ссылкой на другую папку, созданную с помощью

ln -sf /origin /var/www/destination

Несмотря на то, что разрешения (пользователь и группа) в целевой папке (символическая ссылка) правильные, у меня все еще была ошибка, потому что Nginx также должен был иметь разрешения для всей иерархии исходной папки.

Сантьяго Марти Ольбрих
источник
1

Я наконец нашел свой путь. Вкратце, допустим, у вас есть имя пользователя, joeи вы держите веб-сайт в своей личной файловой системе /home/joe/path/to/website.

Вы буквально должны сказать системе, что nginxваш друг.
Место nginxв joeгруппе:

sudo gpasswd -a nginx joe

После этого, если по-прежнему не работает, проверьте права доступа к /home/joeкаталогу. Вероятно, это причина, по которой nginx не может получить доступ к файлу, потому что даже если он теперь ваш друг, вы должны открыть ему дверь в свой дом:

sudo chmod g+x /home/joe

Вот и все. Это буквально все, что вам нужно сделать, чтобы предоставить nginx доступ к вашим локальным файлам :)

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

vdegenne
источник
0

У меня была такая же проблема, я использую Plesk Onyx 17 с Centos7. Я мог видеть эту ошибку в proxy_error_log в журналах затронутого домена. Все каталоги / файлы в / var / www / vhosts / принадлежат соответствующим пользователям (владельцам доменов), и вы можете видеть, что все они находятся в группе psacln. Решением было добавить nginx в эту группу, чтобы он мог видеть, что ему нужно:

usermod -aG psacln nginx

И действительно, перезапустите nginx и перезагрузите страницу с помощью Ctrl + F5.

Славомир Мисковец
источник
0

Я нашел решение: переместил папку в папку конфигурации nginx, в моем случае «/ etc / nginx / my-web-app». А затем изменил права на пользователя root "sudo chown -R root: root" my-web-app ".

Дирадж
источник
0

Вы также можете указать, какой пользователь будет запускать nginx. В файле nginx.conf внесите следующие изменения:

user root;

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

Раджат Бхатнагар
источник
0

Обычно это проблема привилегий ... Для меня это потому, что я использую / root / ** в качестве корня nginx, ему нужны более высокие привилегии. Самый простой способ - просто переместить проект в каталог, созданный вами.

фууул
источник