Порт не работает с использованием systemd

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

Я мигрирую на сервер Linux Red Hat 9 и не могу запустить свое .NET веб-приложение на конкретном порту (8343) при использовании systemd. Я специально использую Kestrel.

Я вижу следующую ошибку при отладке:

dbug: Microsoft.AspNetCore.Server.Kestrel.Core.Internal.CertificatePathWatcher[4]
      Создан наблюдатель за директорией для '/etc/pki/tls'.
dbug: Microsoft.AspNetCore.Server.Kestrel.Core.Internal.CertificatePathWatcher[5]
      Создан наблюдатель за директорией для '/etc/pki/tls/cert.pfx'.
dbug: Microsoft.AspNetCore.Server.Kestrel[0]
      Не удалось привязаться к http://[::]:8343 (IPv6Any). Попытка привязки к http://0.0.0.0:8343 вместо этого.
info: Microsoft.Hosting.Lifetime[14]
      Сейчас слушает на: https://0.0.0.0:8343

Он не связывается сразу, когда сервис запускается, и в конечном итоге начинает слушать на https://0.0.0.0:8343. Когда я пытаюсь перейти на https://someurl.com:8343/ или https://someurl.com:8343/healthcheck, он не запускается.

Вот мой файл службы и скрипт оболочки ниже:

#TestApp.service

[Unit]
Description=TestApp
Documentation=''
After=multi-user.target

[Service]
User=someuser
ExecStart=/bin/sh -c /www/someurl.com/TestApp/app.sh
Restart=on-failure
RestartSec=60s

[Install]
WantedBy=multi-user.target

#app.sh

#!/bin/bash
now=$(date +"%Y%m%d_%H%M%S")
cd /www/someurl.com/TestApp/app
set -o pipefail
Kestrel__Endpoints__Https__Certificate__Path="/etc/pki/tls/cert.pfx" Kestrel__Endpoints__Https__Certificate__Password="**********" Kestrel__Endpoints__Https__Url="https://*:8343" DOTNET_ENVIRONMENT="Staging" ./TestApp 2>&1 | tee /apps/logs/TestApp/output_&now.log

Буду признателен за любые идеи или предложения! Спасибо!

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

Проблемы с работой порта при использовании systemd для .NET приложения на Kestrel

При миграции вашего .NET веб-приложения на сервер Linux Red Hat 9 и конфигурации Kestrel может возникнуть ряд проблем с доступностью определенного порта. В данном случае порт 8343 не работает, и ниже представлены шаги по решению проблемы, основанные на описании ошибки и конфигурации вашей системы.

1. Анализ проблемы

Как видно из сообщения об ошибке, ваше приложение не может сразу привязаться к адресу http://[::]:8343 (IPv6Any), но затем успешно переходит на https://0.0.0.0:8343. Это может свидетельствовать о нескольких проблемах:

  • Недоступность порта: Возможные конфликты на порту или неправильные параметры конфигурации.
  • Проблемы с сетью: Неправильные сетевые настройки или фаерволл, блокирующий доступ к порту.
  • Правами доступа: Недостаточные права на выполнение для пользователя, под которым запускается служба.

2. Проверка конфигурации systemd

Ваша конфигурация service-файла выглядит корректно, однако стоит убедиться в следующих моментах:

  • Проверка наличия необходимых зависимостей: Убедитесь, что все зависимости вашего приложения установлены и доступны для пользователя, запускающего сервис (в данном случае someuser).

  • Правильные параметры запуска: Убедитесь, что скрипт app.sh имеет права на выполнение (chmod +x /www/someurl.com/TestApp/app.sh).

  • Переменные окружения: Убедитесь, что параметры, такие как Kestrel__Endpoints__Https__Certificate__Path, корректны и файл cert.pfx доступен и имеет правильные права.

3. Проверка настроек фаервола

Убедитесь, что фаерволл на вашем сервере разрешает входящие соединения на порт 8343:

sudo firewall-cmd --permanent --add-port=8343/tcp
sudo firewall-cmd --reload

Помимо этого, проверьте наличие других правил, которые могут блокировать соединение.

4. Логи и мониторинг

Для анализа работы вашего приложения стоит просмотреть логи, которые создаёт Kestrel. Вы используете следующую команду для логирования:

./TestApp 2>&1 | tee /apps/logs/TestApp/output_$now.log

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

5. Пункты для отладки

  • Проверка занятости порта: Узнайте, какой сервис использует порт, с помощью команды:
    sudo lsof -i :8343
  • Изменение конфигурации Kestrel: Возможно, имеет смысл указать явным образом привязываться к IPv4. В вашем app.sh попробуйте модифицировать строку с Kestrel__Endpoints__Https__Url на https://127.0.0.1:8343.

6. Проверка успешности

После внесения изменений не забудьте перезапустить службу:

sudo systemctl daemon-reload
sudo systemctl restart TestApp.service

Проверьте статус службы:

sudo systemctl status TestApp.service

Дополнительно, вы можете использовать команды типа curl для проверки доступности портов:

curl -k https://localhost:8343/healthcheck

Заключение

Системы на базе Linux и работа с Kestrel могут иметь ряд нюансов, которые важно учитывать при настройке серверов. Следуя вышеизложенным рекомендациям, вы сможете диагностировать и исправить проблемы с доступностью порта 8343 и убедиться, что ваше приложение работает корректно. Не забывайте о важности тщательной проверки прав доступа, конфигураций фаерволов и системных логов для успешного управления вашими приложениями.

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

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