SystemdDoctor
служба не работает node сеть права

Node-служба не может занять порт 80

Приложения на Node часто настраивают на порт 80 или 443. От непривилегированного пользователя это невозможно: нужна отдельная возможность процесса, сокет-активация или веб-сервер впереди.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Порт ниже 1024 у службы от обычного пользователя

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

  2. Правильнее поставить веб-сервер впереди

    Приложение на порту выше 1024 за обратным прокси — стандартная схема: она даёт TLS, сжатие, статику и защиту.

  3. Менеджер процессов запускается вместо службы

    Средства вроде pm2 дублируют работу systemd: два менеджера процессов мешают друг другу и путают состояние.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Пользователь и возможности службы.

systemctl show myapp.service -p User -p AmbientCapabilities

Сообщение приложения об отказе.

journalctl -u myapp.service -n 20 --no-pager | grep -iE "EACCES|listen"

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Порт ниже 1024 у службы от обычного пользователя
Почему происходит
Ядро разрешает такие порты только с нужной возможностью. Приложение получает отказ и завершается.
Как проверить
Посмотрите порт и пользователя.
systemctl show myapp.service -p User -p AmbientCapabilities
journalctl -u myapp.service -n 20 --no-pager | grep -i EACCES
Как исправить
Дайте службе только возможность привязки к привилегированным портам, оставив обычного пользователя.
[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
2. Правильнее поставить веб-сервер впереди
Почему происходит
Приложение на порту выше 1024 за обратным прокси — стандартная схема: она даёт TLS, сжатие, статику и защиту.
Как проверить
Посмотрите, есть ли веб-сервер и куда он обращается.
sudo nginx -T 2>/dev/null | grep proxy_pass | head
Как исправить
Переведите приложение на порт выше 1024 и настройте обратный прокси. Это надёжнее выдачи возможностей.
3. Менеджер процессов запускается вместо службы
Почему происходит
Средства вроде pm2 дублируют работу systemd: два менеджера процессов мешают друг другу и путают состояние.
Как проверить
Посмотрите команду запуска.
systemctl cat myapp.service | grep ExecStart
Как исправить
Запускайте приложение напрямую через systemd: перезапуск, журнал и ограничения он берёт на себя.

Пример вывода

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

myapp[4100]: Error: listen EACCES: permission denied 0.0.0.0:80
myapp[4100]:     at Server.setupListenHandle
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE

Связанные ошибки

Где встречается чаще всего

Источники

  • systemd.exec(5)
    AmbientCapabilities= и возможность привязки к портам.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено приложением на Node с портом 80 при User=app.
    собственная проверка, systemd 255
    сверено 15 сентября 2026