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. Я не знаю, що ще потрібно встановити.


3
Перевірте, чи www-dataможе користувач cdперейти до /username/test/staticкаталогу:sudo -u www-data cd /username/test/static
Maciej Sz

Мені отримують дозвіл відмовлено, але коли я роблю ls -l, він показує, що його встановлено на www-data user
user299709

2
Може бути, що / ім'я користувача є на encryptfs? У мене виникають абсолютно ті самі проблеми з папкою / home / username, де знаходиться мій сайт. Якщо я переміщу його з шифру, тоді все працює добре. Досі рішення для мене немає ...
Георгій

Відповіді:


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

Чи означає це для кожного нового каталогу, доданого під корінь, chmod потрібно робити в нових каталогах?
Qian Chen

2
@ElgsQianChen майте на увазі, що це система дозволів на рівні ОС, тому в системах POSIX це залежить від вашого umask. Якщо вам потрібно більш загальне рішення, яке не потребує chmodкожного нового каталогу, то є рішення. Він вимагає зворотної групової асоціації ( usernameдо www-dataгрупи) та використання setgid. Не соромтесь розмістити нове запитання для більш детального опису, і я з радістю відповім.
Maciej Sz

Що робити, якщо мій шлях знаходиться в / root / каталозі? Чи безпечно робити chmod g + x on / root? І додавання www-даних до кореневої групи?
Олег Абражаєв

У Fedora 24 у моєму питанні виникла проблема з ... дозволами ACL ... ще одним шаром ... ТАК!
Рей Фосс

1
Добре, що мій nginxкористувач може отримати доступ до каталогу мого веб-сайту, але він все ще говорить, що у журналах помилок заборонено дозвіл.
Рахіль Вазір

89

У мене якраз була та сама проблема у вікні CentOS 7.

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


4
Саме таку "недокументовану" поведінку я намагався зрозуміти протягом останніх 3 днів ...
Ахілл

2
Ось допис про цю поведінку: axilleas.me/uk/blog/2013/…
Ахілл

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виправив це для мене.
Перевантаження119

1
Просто зверніть увагу, якщо ви хочете повністю відключити SELinux, вам необхідно змінити SELINUXзначення disabledв /etc/selinux/config, а потім перезавантаження. Коли це встановлено permissive, він все ще може виконувати перевірки за кадром (використовуючи цінний процесор), але не вживати жодних заходів.
Олівер Таппін

76

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
Дякую! Не можу повірити, це було все, що я мав робити весь час!
хвилюючо

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

chcon -Rt httpd_sys_content_t /username/test/static


Дякую! Працював над випуском CentOS 6.10 (Фінал).
кохання

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-staticвласників файлів.

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

user your_user_name;

# same other config

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


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, йому потрібна більш висока привілей. Простий спосіб - просто перенести проект у каталог, створений вами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.