Nginx Error 500: open() failed (13: Permission denied) — Решение
Веб-сервер возвращает код 500 Internal Server Error при обращении к статическим файлам или скриптам. В файле /var/log/nginx/error.log фиксируется отказ системного вызова open(): open() "/var/www/html/index.php" failed (13: Permission denied), client: ..., server: ..., request: "GET / HTTP/1.1".
| Компонент проверки | Текущее состояние | Требуемое значение |
|---|---|---|
| Владелец процесса worker | nginx или www-data | Должен иметь права на чтение файлов и исполнение (траверс) каталогов |
| Права на директории | drwx------ (700) | drwxr-xr-x (755) по всей иерархии пути от корня / |
| Права на файлы | -rw------- (600) | -rw-r--r-- (644) |
| SELinux Context | unlabeled_t / default_t | httpd_sys_content_t |
- Пользователь получает 500 ошибку, если Nginx работает как standalone HTTP-сервер, или 403 Forbidden, если блокируется чтение директории.
- Прямой доступ от пользователя
rootработает, но под пользователем веб-сервера доступ заблокирован.
- Определите системного пользователя, под которым запущены рабочие процессы Nginx:
ps aux | grep "nginx: worker process" | awk '{print $1}' | head -n 1 - Установите корректного владельца и группу для каталога с сайтом (например,
www-data):sudo chown -R www-data:www-data /var/www/html - Выставьте стандартные безопасные права:
755для директорий и644для файлов:sudo find /var/www/html -type d -exec chmod 755 {} \; sudo find /var/www/html -type f -exec chmod 644 {} \; - Убедитесь, что пользователь Nginx имеет флаг исполнения (
+x) на все родительские каталоги пути:namei -l /var/www/html/index.php - Если на сервере включен SELinux (CentOS, RHEL, AlmaLinux, Rocky), восстановите контексты безопасности веб-сервера:
sudo getenforce sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?" sudo restorecon -Rv /var/www/html - Перезапустите Nginx:
sudo systemctl restart nginx.
chmod -R 777. Это открывает вектор для локальной эскалации привилегий и модификации исходного кода злоумышленниками через веб-шеллы.Частые вопросы (FAQ)
Почему Nginx отдает 500, а не 403 Forbidden при ошибке прав?
Если Nginx пытается открыть файл для внутренней передачи или выполнения через суб-модули и получает отказ ядра EACCES (13: Permission denied), обработчик запроса считает это системным сбоем ввода-вывода и генерирует статус 500.
Зачем нужны права на выполнение (+x) для директорий?
В Linux бит исполнения (+x) на директории дает пользователю право войти в нее (traverse). Без этого бита чтение файлов внутри директории невозможно даже при полных правах на сам файл.
Что делает утилита namei -l?
Утилита namei выполняет пошаговую проверку прав доступа и владельцев каждого сегмента пути от корня / до конечного файла, мгновенно выявляя каталог с блокирующими правами.
Как настроить права, если над файлами работают несколько разработчиков по SFTP?
Используйте установку SGID бита на директории (chmod g+s) и настройте POSIX ACL: setfacl -R -d -m u:www-data:rx,u:developer:rwx /var/www/html.