Вопрос или проблема
Сначала мы установили .net runtime и sdk на сервер. Затем я изменил настройки запуска http-профиля на порт, который собираюсь использовать. Я не изменял другие профили.
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:8091",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
Я также добавил строки builder.WebHost.UseUrls("http://localhost:8091");
и app.UseForwardedHeaders();
в program.cs и удалил app.UseHttpsRedirection();
Я поместил файлы публикации в папку root/www/var/myapp.
Затем я установил nginx и изменил server_name на свой поддомен, добавив listen:8080 в файл конфигурации. Также я добавил это для части location.
location / {
proxy_pass http://localhost:8091; //порт моего приложения
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Часть конфигурации https здесь закомментирована. Я ничего там не изменял.
Я проверил, работает ли myapp с командой sudo dotnet myapp.dll
. Он работает.
Затем я создал сервис с именем myapp.service
[Unit]
Description=myapp
[Service]
WorkingDirectory=/root/www/var/myapp
ExecStart=/usr/bin/dotnet /root/www/var/myapp/myapp.dll --urls "http://localhost:8091"
Restart=always
# Перезапустить сервис через 10 секунд, если служба dotnet упадет:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-myapp
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
Затем я запустил и активировал сервис с помощью этих команд.
sudo systemctl enable NewApp.service
sudo systemctl start NewApp.service
sudo nginx -s reload
Статус nginx активен после этого. Я тоже это проверил.
Я также проверил с помощью этой команды sudo lsof -i -P -n | grep LISTEN
, слушает ли порт. У меня есть мои порты в этом списке.
Я также добавил порты, которые я использую, в правила межсетевого экрана.
Теперь, согласно документации, это должно работать. Но когда я захожу на свой поддомен, он говорит, что mysubdomain.com слишком долго не отвечает.
У вас есть какие-нибудь предложения, которые могут помочь? Я что-то упускаю? Заранее спасибо.
Ответ или решение
Конечно, я помогу вам разобраться с этой проблемой. Давайте рассмотрим возможные причины и решения вашей ситуации по развертыванию .NET Core 8.0 проекта на Linux-сервере.
-
Настройка Nginx: Вы указали, что ваш конфигурационный файл Nginx настроен на прослушивание порта 8080, тогда как ваше приложение работает на порту 8091. Убедитесь, что вы используете правильный порт в настройках Nginx. Ваш конфигурационный файл Nginx может выглядеть следующим образом:
server { listen 8080; server_name mysubdomain.com; location / { proxy_pass http://localhost:8091; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Убедитесь, что ваш конфигурационный файл правильно настроен и перезагрузите Nginx с помощью команды
sudo nginx -s reload
. -
Проверка статуса сервиса: После того как вы запустили ваш сервис, проверьте его статус командой:
sudo systemctl status myapp.service
Убедитесь, что сервис действительно работает и не выдает никаких ошибок. Если сервис не запущен, используйте
journalctl -u myapp.service
для проверки логов и выявления ошибок. -
Проброс портов в Firewall: Вы упомянули, что добавили порты в правила файрвола. Убедитесь, что порты 8080 и 8091 открыты и доступны из внешней сети. Вы можете использовать следующую команду для проверки открытых портов:
sudo ufw status
Если нужно, добавьте правила для открытия необходимых портов:
sudo ufw allow 8080/tcp sudo ufw allow 8091/tcp
-
Проверка доступности приложения: Попробуйте получить доступ к вашему приложению напрямую через cURL. Используйте команду:
curl -I http://localhost:8091
Это поможет вам выяснить, отвечает ли ваше приложение на запросы.
-
Переменные окружения: Вы указали, что в
launchSettings.json
используете среду разработки (Development). Убедитесь, что вы установили значениеASPNETCORE_ENVIRONMENT
вProduction
для вашего сервиса и убедитесь, что ваше приложение правильно настроено для работы в продакшн среде. -
Код в
Program.cs
: Возможно, вам стоит проверить, правильно ли произведена инициализация вашего приложения вProgram.cs
. Пример кода инициализации может выглядеть так:var builder = WebApplication.CreateBuilder(args); // . . . Конфигурация сервисов . . . var app = builder.Build(); app.UseForwardedHeaders(); app.UseRouting(); app.MapControllers(); // или другой метод маршрутизации app.Run("http://localhost:8091");
-
Логи Nginx: Проверьте логи Nginx для выявления проблем. Логи обычно находятся в
/var/log/nginx/error.log
и/var/log/nginx/access.log
.
Если после выполнения всех этих шагов проблема все еще сохраняется, можно рассмотреть возможность размещения вашего приложения в режиме отладки на локальной машине, чтобы лучше понять, где именно происходит сбой.
Надеюсь, эти советы помогут вам решить проблему с развертыванием вашего .NET Core проекта. Если у вас будут дополнительные вопросы, не стесняйтесь задавать их!