nginx: [emerg] open() failed при чтении конфигурации
Сообщение open() ... failed (2: No such file or directory) при проверке конфигурации значит, что nginx не нашёл файл, на который сослались: включаемый фрагмент, сертификат, ключ или файл с настройками. Путь в сообщении указан полностью — с него и начинается разбор.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Битая ссылка в sites-enabled
В Debian и Ubuntu включённые сайты — это ссылки на файлы из sites-available. После удаления или переименования исходного файла ссылка остаётся и ведёт в никуда.
-
Файл сертификата или ключа отсутствует
Путь указан заранее, а сертификат ещё не выпущен — типичная ситуация при первичной настройке HTTPS. nginx отказывается стартовать без файла.
-
Нет прав на чтение файла
Ключ сертификата с правами 0600 и владельцем root читается главным процессом nginx (он работает от root), а вот включаемые файлы в чужих каталогах могут быть недоступны.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Печатает точный путь, который не удалось открыть.
sudo nginx -tВсе битые ссылки в конфигурации nginx.
sudo find /etc/nginx -xtype lПоказывает, на каком файле остановился разбор.
sudo nginx -T 2>&1 | tail -20Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- В Debian и Ubuntu включённые сайты — это ссылки на файлы из sites-available. После удаления или переименования исходного файла ссылка остаётся и ведёт в никуда.
- Как проверить
-
Найдите битые ссылки.
sudo find /etc/nginx/sites-enabled -xtype l
- Как исправить
-
Удалите битые ссылки и перепроверьте конфигурацию.
sudo find /etc/nginx/sites-enabled -xtype l -delete && sudo nginx -t
- Почему происходит
- Путь указан заранее, а сертификат ещё не выпущен — типичная ситуация при первичной настройке HTTPS. nginx отказывается стартовать без файла.
- Как проверить
-
Проверьте пути из директив сертификата.
sudo nginx -T 2>/dev/null | grep -E "ssl_certificate|ssl_certificate_key" sudo ls -l /etc/letsencrypt/live/*/fullchain.pem 2>/dev/null
- Как исправить
- Сначала получите сертификат по HTTP, затем включайте блок с HTTPS. Обратный порядок не работает: сервер не поднимется и проверку владения доменом пройти будет нечем.
- Почему происходит
- Ключ сертификата с правами 0600 и владельцем root читается главным процессом nginx (он работает от root), а вот включаемые файлы в чужих каталогах могут быть недоступны.
- Как проверить
-
Пройдите по пути целиком.
namei -l /etc/nginx/snippets/ssl.conf
- Как исправить
- Исправьте права на файл и на каталоги по пути.
Пример вывода
Ссылка в sites-enabled ведёт на удалённый файл. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
nginx[4120]: nginx: [emerg] open() "/etc/nginx/sites-enabled/old-site.conf" failed (2: No such file or directory) in /etc/nginx/nginx.conf:62
nginx[4120]: nginx: configuration file /etc/nginx/nginx.conf test failed
systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Связанные ошибки
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- nginx: [emerg] unknown directive nginx не запускается: неизвестная директива в конфигурации. Опечатка, не тот контекст или отсутствующий модуль.
- nginx reload не применяет изменения Перезагрузка nginx прошла, а изменения не действуют: правка не в том файле, файл не включён, кеш, старые рабочие процессы.
- nginx: SSL_do_handshake() failed и ошибки TLS Ошибки рукопожатия TLS в журнале nginx: несовпадение версий протокола, отсутствие поддерживаемых наборов шифров, обращение по http к https-порту.
- nginx: [emerg] duplicate listen options и conflicting server name nginx не запускается из-за повторных объявлений: duplicate listen options, conflicting server name, duplicate default server.
- nginx: could not build server_names_hash nginx не запускается при большом числе или длинных именах серверов: нужно увеличить server_names_hash_bucket_size.
- nginx: ошибки сертификата при запуске (SSL_CTX_use_PrivateKey) nginx не запускается из-за сертификата: не совпадает ключ, неполная цепочка, файл повреждён, нет прав на чтение ключа.
Где встречается чаще всего
Источники
- Документация nginx: include и ssl_certificate
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено удалением файла, на который ссылается sites-enabled.