Вопрос или проблема
Я мигрирую на сервер 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 и убедиться, что ваше приложение работает корректно. Не забывайте о важности тщательной проверки прав доступа, конфигураций фаерволов и системных логов для успешного управления вашими приложениями.