#Что означает ошибка
403 Forbidden nginx
Nginx отвечает 403, когда не может или не должен отдавать ресурс: в каталоге нет индексного файла и запрещён листинг, у пользователя nginx (www-data, nginx) нет прав на файлы, правило deny блокирует адрес, или защитный модуль (SELinux, AppArmor) запрещает доступ. Точная причина записана в error.log — смотрите его первым.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
Нет индексного файлаВ каталоге нет index.html/index.php. | В логе «directory index of ... is forbidden». | Добавьте индекс или укажите index. |
| Нет прав на каталог или файлыПользователь nginx не имеет доступа. | В логе «Permission denied». | Исправьте права. |
| Правило deny или allowОграничение по IP. | Правило в location. | Проверьте конфигурацию. |
| SELinux или AppArmorЗащитный модуль блокирует. | В audit.log отказ. | Настройте контекст. |
#Пошаговое решение
- Посмотрите логПодключитесь к серверу по SSH и прочитайте последние сообщения
sudo tail -n 40 /var/log/nginx/error.log(при другом расположении найдите директивуerror_logв конфигурации). Воспроизведите 403 на конкретном URL и ищитеdirectory index ... is forbidden,Permission deniedилиaccess forbidden by rule. Каждая фраза требует своего исправления — не начинайте с изменения всех прав файлов. - Проверьте корневой каталогНайдите виртуальный хост данного домена командой
sudo nginx -T 2>/dev/null | grep -n -E "server_name|root |alias "и определите корневой каталог нужного блокаserver. Сравните путь с реальным расположениемindex.php/index.htmlчерезls -l, учитывая, чтоaliasработает иначе, чемroot. Сначала сохраните файл конфигурации, исправляйте только неверный путь и выполняйтеsudo nginx -t. - Проверьте индексЕсли журнал сообщает
directory index ... forbidden, проверьте, существует ли стартовый файл в фактическом каталоге сайта и задана ли директиваindex index.php index.html;в нужном контексте. Для PHP также проверьте отдельную обработку.phpчерез PHP-FPM. Не включайтеautoindex onтолько ради обхода 403: это может раскрыть содержимое каталога посетителям. - Проверьте права по всему путиЕсли ошибка
Permission denied, выполнитеnamei -l /var/www/site/index.html, заменив путь реальным файлом, и проверьте разрешение прохода по каждому каталогу для пользователя Nginx. Установите нужного владельца только после выяснения, кто должен читать статический файл и кто обслуживает PHP. Не применяйтеchown -R www-dataили массовую установку755/644: на нескольких сайтах или при ACL это может сломать безопасность. - Исправьте владельцаЕсли найден конкретный файл, который веб-сервер должен читать, сохраните текущие права командой
stat /фактический/путьи изменяйте только его с учётом пользователя и группы службы. Для каталогов нужно право проходаx, для файлов — чтениеr; запись на все файлы Nginx не нужна. После точечной правки откройте проблемный URL; при новой ошибке верните прежний владелец/режим. - Проверьте правилаОткройте актуальный блок
locationнужного сайта в конфигурации и проверьте директивыdeny,allow,auth_basicи ограничения по IP. Если доступ закрыт намеренно, не снимайте защиту. Если правило ошибочно блокирует публичный путь, сохраните старое значение и исправьте только условие, связанное с этим URL. Послеsudo nginx -tприменитеreloadи проверьте ответ из нужной сети. - Проверьте SELinuxНа RHEL/AlmaLinux/Rocky с SELinux выполните
getenforceи приEnforcingнайдите отказ доступа в журнале аудита (ausearch -m AVC -ts recent, если установлен auditd). Проверьте действующий контекстls -Zи исправляйте его штатно черезsemanage fcontextиrestoreconтолько для целевого каталога. Временныйchcon -Rчасто теряется после восстановления контекстов; не выключайте SELinux. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
- Перезагрузите nginxПроверьте конфигурацию
sudo nginx -t; при успехе выполнитеsudo systemctl reload nginx, затем в браузере откройте тот же URL. Ответ 200 или предусмотренный редирект означает, что проверяемый маршрут снова доступен. Если 403 сохраняется, сопоставьте новое сообщение журнала со старым; не повторяйте изменения прав без дополнительной диагностики.
Если сайт расположен в домашнем каталоге с правами 700 (/home/user/site), Nginx может не иметь права прохода по родительскому каталогу. Не открывайте домашний каталог всем командой chmod o+x /home/user. Безопаснее перенести открытые файлы сайта в отдельный каталог публикации или выделить доступ только рабочей группе/учётной записи Nginx с помощью настроенных ACL. Сначала выясните фактического пользователя Nginx и права каждого каталога командой namei -l /реальный/путь/index.php. Для PHP-FPM отдельно проверьте доступ к сокету. При использовании Docker-томов сверяйте права и пользователей внутри контейнера. Документация — .
Если сайт работает через PHP-FPM и 403 возникает только на .php, проверьте директиву location ~ \.php$ и права на сокет /run/php/php8.2-fpm.sock (пользователь www-data должен входить в группу сокета). В журнале ошибок внимательно читайте формулировку: «access forbidden by rule» означает правило deny, «directory index ... is forbidden» — отсутствие индекса, а «Permission denied» — права файловой системы или SELinux. После любых правок выполняйте sudo nginx -t, чтобы не остановить рабочий сайт ошибкой конфигурации.