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

76

Я использую конфигурацию по умолчанию при добавлении определенного каталога с 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. Я не знаю, что еще нужно установить.

  • 3
    Проверьте www-data пользователь может cd к /username/test/static каталог: sudo -u www-data cd /username/test/static
  • 0
    Я получаю отказано в разрешении, но когда я делаю ls -l, он показывает, что он установлен на пользователя www-data
Показать ещё 1 комментарий
Теги:
nginx

12 ответов

149
Лучший ответ

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
  • 0
    Означает ли это, что для каждого нового каталога, добавленного в корневой каталог, необходимо выполнить команду chmod для новых каталогов?
  • 2
    @ElgsQianChen имейте в виду, что это система разрешений на уровне ОС, поэтому в системах POSIX это зависит от вашего umask . Если вам нужно более общее решение, которое не требует chmod каждого нового каталога, тогда есть решение. Требуется обратная групповая ассоциация ( username для www-data group) и использование setgid . Не стесняйтесь отправлять новый вопрос для более подробного описания, и я буду рад ответить.
Показать ещё 6 комментариев
61

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

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

  • 4
    Это именно то «недокументированное» поведение, которое я пытался понять за последние 3 дня ...
  • 2
    Вот сообщение об этом поведении: axilleas.me/en/blog/2013/…
Показать ещё 3 комментария
29

В 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 ГБ.

  • 1
    Большое спасибо за это. Это действительно решило мою проблему (также в CentOS 7) с самого начала, но затем я был заблокирован вторым отказом в другом месте, поэтому прибегнул к setenforce 0 . Однако, оглядываясь назад на то, что на самом деле делает это решение, я понял, что мне нужно повторно запустить команды, чтобы обновить разрешения для пользователя nginx. Это, похоже, сработало, и я мог вернуть SELinux к принудительному исполнению.
  • 0
    Итак, policycoreutils-devel должен быть установлен на вашем компьютере.
27

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

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

chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot
  • 0
    это прекрасно работает для меня, используя centos 7 (selinux уже выключен)
  • 3
    После 6 часов отчаянных поисков ... найденное тело упомянуло это, кроме вас! благодарю вас!
Показать ещё 1 комментарий
15

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

chcon -Rt httpd_sys_content_t /username/test/static

  • 0
    Спасибо! Работал над выпуском CentOS 6.10 (Final).
  • 1
    Работал на CentOS 7.5.1804 (Core).
3

Симптом:

Не удалось загрузить изображения в медиа-библиотеку 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, но я думаю, что это не должно сильно отличаться для других дистрибутивов.

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

1

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

ln -sf /origin /var/www/destination

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

0

Измените user свойство nginx.conf для www-static файлов www.

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

user your_user_name;

# same other config
0

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

0

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

chown -R nginx:nginx /username/test/static
0

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

usermod -aG psacln nginx

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню