Распространенные ошибки подключения Nginx

Nginx — это популярный веб-сервер, на котором размещаются многие крупные сайты. Ошибки подключения Nginx иногда трудно отладить, поскольку существует множество причин их возникновения. Более того, не всегда есть достаточно информации, которая указывала бы на путь решения проблемы. Поскольку природа ошибки заключается в том, что не удается установить соединение с Nginx, подобные ошибки часто появляются на уровне браузера, а не на уровне Nginx. В целом, многие распространенные ошибки с Nginx связаны с теми или иными аспектами соединения — портами или брандмауэрами.

Примеры в этом мануале были протестированы на сервере Ubuntu, но они будут работать на большинстве установок Nginx, так как в основном связаны со стандартным файлом конфигурации. Каталоги и пути могут немного отличаться.

Мы разберем, что означает ошибка соединения браузера с веб-сервером Nginx, а также рассмотрим пути определения и устранения проблем для возвращения сервера в рабочее состояние.

Проверка лога ошибок Nginx

В этом мануале мы рассмотрим самые распространенные ошибки и способы их устранения. Синтаксические ошибки нарушают структуру, которую Nginx распознает как допустимую. Часто одна ошибка переходит в другую и становится причиной более серьезной проблемы. Поэтому конкретные обстоятельства и настройки в реальной среде могут отличаться от тех, что приведены в данном мануале.

Помните, что вы всегда можете обратиться к логу ошибок Nginx, чтобы посмотреть текущий список неисправностей:

sudo cat /var/log/nginx/error.log

Ошибка “This site can’t be reached”

Работая в интернете, вы могли сталкиваться с веб-страницей, на которой написано что-то вроде “This site can’t be reached”. Есть много причин возникновения этой проблемы, но в этом мануале мы рассмотрим распространенные ошибки с точки зрения пользователя, который настраивает Nginx. Иногда обновление браузера может решить проблему, но могут быть и другие факторы, которые влияют на соединение сервера на бэкенде.

Пример сообщения об ошибке, которое вы можете получить в веб-браузере:


Прежде чем мы начнем, давайте обсудим, что эта ошибка говорит о веб-сервере. Во-первых, your_domain_or_IP слишком долго отвечает, поэтому в конце сообщения упоминается ERR_CONNECTION_TIMED_OUT. Но помните, что это ошибка на уровне браузера, а не прямая ошибка вашего сервера Nginx. Это сообщение об ошибке можно интерпретировать как возможную причину того, что соединение с сервером не может быть установлено. Предложенные решения даны с точки зрения конечного пользователя на стороне клиента.

Опять же, в этом сценарии вы не посещаете какой-либо сайт в Интернете, а работаете со своим сервером. Чтобы определить проблему, нужно самостоятельно проверить настройки Nginx и в процессе исключить из списка вероятные причины.

Поскольку вы работаете с Nginx, вы можете проверить элементы, которые могут быть причиной этой ошибки, выполнив определенные команды и проверив параметры брандмауэра и конфигурации.

Проверка активности веб-сервера Nginx

Первое, что можно сделать — убедиться, что Nginx активен в системе и что не было никаких проблем с его установкой. Для этого запросите состояние сервиса у системы инициализации systemd:

systemctl status nginx

Если веб-сервер Nginx работает правильно, получим следующий вывод:

nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enable>
     Active: active (running) since Thu 2022-11-03 16:37:22 UTC; 1 week 4 days >
       Docs: man:nginx(8)
   Main PID: 3253 (nginx)
      Tasks: 2 (limit: 1116)
     Memory: 3.7M
        CPU: 1.250s
     CGroup: /system.slice/nginx.service
             ├─3253 "nginx: master process /usr/sbin/nginx -g daemon on; master>
             └─3254 "nginx: worker process"

В выводе есть строка “Active”, в которой указано, работает веб-сервер или нет. В этом примере он успешно запущен и работает. Если бы это было не так, эта строка была бы inactive (dead).

Примечание. Если в результате вы получите сообщение inactive (dead), попробуйте перезапустить сервер с помощью команды sudo systemctl start nginx. Если вы вносили изменения в конфигурацию, обязательно сбросьте их с помощью sudo systemctl reload nginx и затем снова проверьте статус. Как управлять процессами Nginx, можно узнать в разделе 4 мануала Установка Nginx в Ubuntu.

Убедившись, что служба Nginx работает, введите адрес своего сервера в браузере http://your_domain_or_ip, чтобы проверить, есть ли проблема с подключением. Если вы не знаете свой IP-адрес, вы можете узнать его с помощью инструмента icanhazip.com:

curl -4 icanhazip.com

Если сайт по-прежнему недоступен, то следующим шагом будет проверка настроек брандмауэра.

Проверка и настройка параметров брандмауэра

Далее нужно проверить настройки брандмауэра, настроен ли он для приема запросов через соответствующий порт. Если нет, нужно настроить брандмауэр для разрешения подключений к порту. По умолчанию веб-сервер Nginx принимает входящие запросы через порт 80, а при установленных SSL-сертификатах он принимает защищенные соединения через порт 443. Но в этом мануале мы сосредоточимся на порте 80.

В этом мануале мы работаем с Ubuntu и брандмауэром Uncomplicated Firewall (UFW). Обратите внимание, что некоторые параметры могут отличаться в зависимости от дистрибутива. Начните с проверки текущих настроек брандмауэра. Следующую команду нужно выполнить с привилегиями root (рекомендуем использовать для этого пользователя sudo):

sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

В этом выводе перечислены текущие открытые соединения портов на этой машине. Порт 80 отсутствует в данном списке, поэтому его нужно добавить, чтобы разрешить доступ к Nginx. Если вы не уверены в том, какие настройки приложений доступны, проверьте их с помощью ufw app list:

sudo ufw app list

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Здесь перечислены доступные для настройки профили Nginx. Вот краткий обзор каждого профиля:

  • Nginx Full: открывает оба порта 80 (обычный незашифрованный трафик) и 443 (зашифрованный трафик TLS/SSL)
  • Nginx HTTP: открывает только порт 80
  • Nginx HTTPS: открывает только порт 443

Так как для правильной настройки соединения нам нужно открыть только порт 80, с помощью следующей команды включите профиль Nginx HTTP:

sudo ufw allow 'Nginx HTTP'

Примечание. При настройке брандмауэра рекомендуется включать наиболее строгий профиль, который разрешает только настроенный трафик. Он будет зависеть от ваших потребностей. Мы открываем трафик Nginx HTTP для порта 80, но если хотите настроить его для для порта 443, ознакомьтесь с мануалом Создание сертификата Let’s Encrypt для Nginx.

Если команда выполнена успешно, вы увидите результат Rule added. Чтобы убедиться, что Nginx HTTP добавлен в список, проверьте статус еще раз с помощью sudo ufw status:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Вывод показывает добавленный профиль Nginx HTTP, что значит, что порт 80 открыт для приема соединений.

Проверка файла конфигурации Nginx

Перед тестированием веб-браузера рекомендуем также проверить конфигурации, чтобы убедиться, что domain block вашего сервера настроен на прослушивание порта 80. Установка соответствующего порта и IP-адреса в конфигурации Nginx очень важна и должна быть сопряжена с соответствующим открытым портом в брандмауэре. Если какой-либо компонент отсутствует, соединение не будет установлено.

Откройте файл конфигурации Nginx в любом текстовом редакторе. Например, мы используем nano:

sudo nano /etc/nginx/sites-available/your_domain

Первые несколько строк состоят из директивы listen:

server {
       listen 80; 
         listen [::]:80; 

       root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

Директива listen указывает порт, с которого сервер может принимать запросы. Кроме того, listen в квадратных скобках [::] представляет IPv6. При желании можете включить информацию о своем IP-адресе после директивы listen. Но в данном примере подключение к домену представлено директивами root path и server_name. Как упоминалось ранее, нужно убедиться, что информация о вашем домене или IP-адресе правильная, иначе файл конфигурации не будет работать. Поэтому проверьте, что директивы root и sever_name точно соответствуют подключаемому домену.

Сохраните и закройте файл после того, как убедитесь, что конфигурация listen настроена на порт 80. 

Для проверки синтаксических ошибок выполните команду:

sudo nginx -t

Обратите внимание: если после внесения изменений в файле конфигурации вы не получили синтаксических ошибок, обязательно перезапустите Nginx с помощью sudo systemctl restart nginx.

Теперь откройте браузер и перейдите по адресу http://your_domain. Если вы видите следующую веб-страницу, значит, настройки брандмауэра разрешили порту 80 принимать запросы:

Эта веб-страница подтверждает, что веб-сервер Nginx установлен и работает правильно.

Подводим итоги

В этом мануале мы разобрали, как проверить, активна ли служба Nginx, а также убедиться, правильно ли работает брандмауэр и соединения портов.

Tags:

Добавить комментарий