Ошибки

Ошибка nginx no ssl_certificate is defined: HTTPS без сертификата

В блоке server есть строка listen со словом ssl, а строк с сертификатом нет. Если сертификата ещё нет, уберите эту строку и выпустите его через Certbot. Если он уже выпущен, допишите строки ssl_certificate и ssl_certificate_key.

Обновлено 10.10.2026≈ 6 мин чтения
Содержание 9

Что сделать прямо сейчас

  1. Откройте файл на строке из сообщения — шаг 1.
  2. Сертификата нет — уберите строку listen с ssl: Если сертификата ещё нет. Сертификат есть — допишите его в блок: Если сертификат уже выпущен.
  3. Проверьте и примените настройки — шаг 3.

Все команды на этой странице вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.

Что значит это сообщение

2026/10/09 12:00:00 [emerg] 2345#2345: no "ssl_certificate" is defined for the "listen ... ssl" directive in /etc/nginx/sites-enabled/example.com:1
nginx: configuration file /etc/nginx/nginx.conf test failed

«Для listen … ssl не указан ssl_certificate». Слово ssl в строке listen значит, что по этому порту nginx должен отвечать по HTTPS. Для этого ему нужен сертификат, а строк ssl_certificate и ssl_certificate_key в блоке нет. Дата, время и номер процесса у вас будут свои. В других сборках nginx та же строка начинается со слов nginx: [emerg].

Номер в конце — строка, где начинается блок server {, а не строка listen.

nginx проверяет блок, который стоит на этом порту по умолчанию: блок с пометкой default_server, а если её нет — первый по порядку блок с этим портом.

Причины:

  • строку listen 443 ssl; дописали заранее — до того, как выпустили сертификат;
  • блок для HTTPS скопировали из другого файла, а строки с сертификатом не перенесли;
  • строки ssl_certificate стоят в другом блоке server — например, в блоке для порта 80. Каждый блок server настраивается отдельно.

Шаг 1. Откройте блок из сообщения

Откройте файл из сообщения сразу на нужной строке: число после знака + — номер строки из сообщения, путь — тот, что стоит перед двоеточием.

sudo nano -l +1 /etc/nginx/sites-available/example.com

Если в сообщении путь начинается с /etc/nginx/sites-enabled/, откройте файл с тем же именем в папке /etc/nginx/sites-available/ — там лежит оригинал, а в sites-enabled только ссылка на него. Как это проверить, написано в разделе «Какой файл открывать».

Посмотрите в этом блоке строки listen и строки, которые начинаются с ssl_.

Шаг 2. Найдите свой случай

Если сертификата ещё нет

Найдите в блоке строки listen со словом ssl — например, listen 443 ssl; и listen [::]:443 ssl;. Поставьте курсор на такую строку и нажмите Ctrl+K — nano удалит её целиком. Удалите так все строки listen со словом ssl.

Если после этого в блоке не осталось ни одной строки listen, весь блок был только для HTTPS. Удалите его целиком — от server { до закрывающей } — тем же Ctrl+K.

Сохраните файл: Ctrl+O, Enter, затем Ctrl+X. Примените настройки по шагу 3, а затем выпустите сертификат по инструкции Как поставить сертификат на свой VPS — Certbot сам пропишет его в настройки nginx.

Если сертификат уже выпущен

Узнайте пути к файлам сертификата:

sudo certbot certificates

Команда покажет все сертификаты, которые выпустил Certbot. У каждого есть строка Certificate Path: — путь для ssl_certificate — и строка Private Key Path: — путь для ssl_certificate_key. Если сертификат на одно имя выпускали ещё раз, рядом может оказаться второй, с окончанием -0001 в названии папки.

Допишите в тот же блок server, под строки listen, две строки с этими путями:

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

Сохраните файл: Ctrl+O, Enter, затем Ctrl+X.

Если в сообщении for the "ssl" directive

2026/10/09 12:00:00 [warn] 2345#2345: the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /etc/nginx/sites-enabled/example.com:5
2026/10/09 12:00:00 [emerg] 2345#2345: no "ssl_certificate" is defined for the "ssl" directive in /etc/nginx/sites-enabled/example.com:5

В блоке стоит старая строка ssl on;. Номер в конце сообщения указывает на неё. Удалите эту строку, а в строку listen 443; допишите слово ssl: listen 443 ssl;. Потом допишите сертификат, как в разделе Если сертификат уже выпущен.

Шаг 3. Проверьте и примените настройки

Проверьте настройки ещё раз командой sudo nginx -t. Когда в ответе будут слова syntax is ok и test is successful, примените их:

sudo systemctl reload nginx

Если команда ничего не ответила, настройки применены.

Как проверить

sudo nginx -t отвечает syntax is ok и test is successful. Если вы дописали сертификат, сайт открывается по https:// без предупреждения. Если убрали строку listen, сайт открывается по http:// — теперь можно выпускать сертификат.

Похожие ошибки

СообщениеЧем отличается
cannot load certificateСтрока ssl_certificate есть, но файла по этому пути нет
key values mismatchКлюч от другого сертификата
a duplicate default serverdefault_server на одном порту стоит в двух блоках

Тексты сообщений на этой странице сверены с исходным кодом nginx 1.24.0 — эта версия стоит в Ubuntu 24.04. В других версиях слова могут немного отличаться.

Источники

Сверено 9–10 октября 2026 года.

Что почитать дальше

Проверено и обновлено: 10.10.2026