Вопрос или проблема
Приложение работает нормально на 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
Это исходный код
Вы запускаете программу от имени 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" указывает на проблему с доступностью сетевого адреса, на котором приложение пытается инициализировать получение соединений. Это может означать, что:
-
Несуществующий Адрес: Приложение пытается слушать на IP-адресе, который недоступен или не настроен на сервере.
-
Недоступный Порт: Порт находится в статусе "занят" или используется другим приложением.
-
Права Доступа: Нехватка прав доступа для использования портов до 1024, так как они считаются привилегированными и требуют запуска приложения от имени пользователя с правами администратора.
Пример
Ваше приложение отлично работает на локальном компьютере, но вызывает ошибку при попытке запуска на сервере через WebSocket-соединение на порту 80. При помощи команды netstat
вы проверили, что на сервере порт 80 не занят, однако сами соединения через другие порты находятся в состоянии CLOSE_WAIT
, что указывает на наличия открытых соединений, ожидающих завершения.
При этом вы подключаетесь к серверу по SSH на порт 22, что подтверждает, что указанный сервер доступен и корректно настраивает SSH подключения.
Применение
Понимание проблемы позволяет выработать несколько стратегий её решения:
-
Проверка IP-адреса: Убедитесь, что вы получите точный IP-адрес, который будет доступен на сервере. Команда
ifconfig
илиip a
в Linux поможет определить, какие адреса настроены на сервере. -
Проверка Других Приложений: Убедитесь, что порт 80 не используется другими приложениями на момент запуска вашего. Команда
netstat -tulpn
поможет выявить, какие еще процессы слушают какие порты. -
Изменение Порта: Если вы не хотите запускать приложение от имени пользователя с повышенными правами (что не рекомендуется из соображений безопасности), используйте не привилегированный порт, например, 8080. После этого вы можете настроить прокси, например Nginx, для перенаправления трафика с порта 80 на 8080.
-
Проверка Прав Доступа: Если порт 80 необходим, убедитесь, что приложение запускается от имени суперпользователя. Однако старайтесь избегать этой практики по вышеозначенным причинам безопасности.
-
Файрвол и Сетевые Настройки: Убедитесь, что настройки сети и файрвола сервера позволяют подключение на указанный порт. Например, с помощью
iptables
илиufw
проверьте наличие правил, блокирующих соединения. -
Конфигурация WebSocket: Перепроверьте конфигурацию WebSocket-сервера, указанный в вашем приложении IP-адрес может быть неправильно задан.
-
Отладка Логов: Просмотрите логи сервера и самого приложения для наличия дополнительных подсказок или ошибок, которые могут помочь в выявлении корня проблемы.
Заключение: решение ошибки "EADDRNOTAVAIL" требует системного подхода и внимательного изучения конфигураций системы и вашего приложения. Использование диагностики на каждом уровне сети и приложений позволит вам выявить и устранить проблему, обеспечивая стабильную и безопасную работу вашего Node.js приложения.