Node.js websocket “Ошибка: listen EADDRNOTAVAIL”

Вопрос или проблема

Приложение работает нормально на localhost, но при подключении к серверу возникает ошибка. Я подключаюсь к серверу через порт 22.

Но мое приложение подключается к серверу через порт 80.

Это ошибка:

 Error: listen EADDRNOTAVAIL Error: listen EADDRNOTAVAIL
 at errnoException (net.js:904:11)
 at Server._listen2 (net.js:1023:19)
 at listen (net.js:1064:10)
 at net.js:1146:9
 at dns.js:72:18
 at process._tickCallback (node.js:419:13)
 at Function.Module.runMain (module.js:499:11)
 at startup (node.js:119:16)
 at node.js:906:3

Я запускаю netstat -tulpn | grep 22

Результат:

 tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      683/sshd
 tcp6       0      0 :::22                   :::*                    LISTEN      683/sshd

но я запускаю netstat -tulpn | grep 80

Ничего не отображается.

Нужна помощь. Это ошибка сервера?

запуск netstat -nlt

     Active Internet connections (only servers)
     Proto Recv-Q Send-Q Local Address           Foreign Address         State
     tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN
     tcp        0      0 127.0.0.1:5901          0.0.0.0:*               LISTEN
     tcp        0      0 127.0.0.1:5902          0.0.0.0:*               LISTEN
     tcp        0      0 0.0.0.0:6001            0.0.0.0:*               LISTEN
     tcp        0      0 0.0.0.0:6002            0.0.0.0:*               LISTEN
     tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
     tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN
     tcp6       0      0 :::22                   :::*                    LISTEN
     tcp6       0      0 ::1:631                 :::*                    LISTEN

Запуск netstat -anp | grep :80

     tcp        1      0 162.243.145.226:60728   91.189.94.25:80         CLOSE_WAIT  1726/ubuntu-geoip-p
     tcp        1      0 162.243.145.226:47842   74.125.239.148:80       CLOSE_WAIT  8104/epiphany-brows
     tcp        1      0 162.243.145.226:60727   91.189.94.25:80         CLOSE_WAIT  1417/ubuntu-geoip-p
     tcp        1      0 162.243.145.226:58818   198.41.30.199:80        CLOSE_WAIT  8104/epiphany-brows

Это исходный код

source-link

Вы запускаете программу от имени root?

Если вы не запускаете программу от имени root, вы не можете привязать программу к портам ниже 1024. Эти порты считаются привилегированными, и только root может использовать их.

Если хотите запускать от root, не делайте этого. Запуск от root может создать проблемы, если кто-то эксплуатирует вашу программу, получит shell и обнаружит, что это shell root.

Запускайте программу от имени непривилегированного пользователя и измените порт с 80 на что-то выше 1024.

Из man 7 ip

ERRORS
       ...

       EADDRNOTAVAIL
              A  nonexistent  interface  was  requested  or  the  requested source
              address was not local.

Вероятно, вы опечатались в IP-адресе прослушивания в конфигурации.

Ответ или решение

Ошибка "Error: listen EADDRNOTAVAIL" является достаточно распространенной при разработке приложений на Node.js, особенно при настройке сетевых подключений и WebSocket. Эта ошибка возникает, когда приложение пытается прослушивать на адресе и порте, которые либо не существуют, либо недоступны. Далее мы рассмотрим возможные причины этой ошибки и предложим пути их решения.

Теория

Ошибка "EADDRNOTAVAIL" указывает на проблему с доступностью сетевого адреса, на котором приложение пытается инициализировать получение соединений. Это может означать, что:

  1. Несуществующий Адрес: Приложение пытается слушать на IP-адресе, который недоступен или не настроен на сервере.

  2. Недоступный Порт: Порт находится в статусе "занят" или используется другим приложением.

  3. Права Доступа: Нехватка прав доступа для использования портов до 1024, так как они считаются привилегированными и требуют запуска приложения от имени пользователя с правами администратора.

Пример

Ваше приложение отлично работает на локальном компьютере, но вызывает ошибку при попытке запуска на сервере через WebSocket-соединение на порту 80. При помощи команды netstat вы проверили, что на сервере порт 80 не занят, однако сами соединения через другие порты находятся в состоянии CLOSE_WAIT, что указывает на наличия открытых соединений, ожидающих завершения.

При этом вы подключаетесь к серверу по SSH на порт 22, что подтверждает, что указанный сервер доступен и корректно настраивает SSH подключения.

Применение

Понимание проблемы позволяет выработать несколько стратегий её решения:

  1. Проверка IP-адреса: Убедитесь, что вы получите точный IP-адрес, который будет доступен на сервере. Команда ifconfig или ip a в Linux поможет определить, какие адреса настроены на сервере.

  2. Проверка Других Приложений: Убедитесь, что порт 80 не используется другими приложениями на момент запуска вашего. Команда netstat -tulpn поможет выявить, какие еще процессы слушают какие порты.

  3. Изменение Порта: Если вы не хотите запускать приложение от имени пользователя с повышенными правами (что не рекомендуется из соображений безопасности), используйте не привилегированный порт, например, 8080. После этого вы можете настроить прокси, например Nginx, для перенаправления трафика с порта 80 на 8080.

  4. Проверка Прав Доступа: Если порт 80 необходим, убедитесь, что приложение запускается от имени суперпользователя. Однако старайтесь избегать этой практики по вышеозначенным причинам безопасности.

  5. Файрвол и Сетевые Настройки: Убедитесь, что настройки сети и файрвола сервера позволяют подключение на указанный порт. Например, с помощью iptables или ufw проверьте наличие правил, блокирующих соединения.

  6. Конфигурация WebSocket: Перепроверьте конфигурацию WebSocket-сервера, указанный в вашем приложении IP-адрес может быть неправильно задан.

  7. Отладка Логов: Просмотрите логи сервера и самого приложения для наличия дополнительных подсказок или ошибок, которые могут помочь в выявлении корня проблемы.

Заключение: решение ошибки "EADDRNOTAVAIL" требует системного подхода и внимательного изучения конфигураций системы и вашего приложения. Использование диагностики на каждом уровне сети и приложений позволит вам выявить и устранить проблему, обеспечивая стабильную и безопасную работу вашего Node.js приложения.

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

Капча загружается...