Я пытаюсь разместить проект .net core 8.0 на сервере Linux. Я сделал настройки, но он по-прежнему не работает.

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

Сначала мы установили .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-сервере.

  1. Настройка 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.

  2. Проверка статуса сервиса: После того как вы запустили ваш сервис, проверьте его статус командой:

    sudo systemctl status myapp.service

    Убедитесь, что сервис действительно работает и не выдает никаких ошибок. Если сервис не запущен, используйте journalctl -u myapp.service для проверки логов и выявления ошибок.

  3. Проброс портов в Firewall: Вы упомянули, что добавили порты в правила файрвола. Убедитесь, что порты 8080 и 8091 открыты и доступны из внешней сети. Вы можете использовать следующую команду для проверки открытых портов:

    sudo ufw status

    Если нужно, добавьте правила для открытия необходимых портов:

    sudo ufw allow 8080/tcp
    sudo ufw allow 8091/tcp
  4. Проверка доступности приложения: Попробуйте получить доступ к вашему приложению напрямую через cURL. Используйте команду:

    curl -I http://localhost:8091

    Это поможет вам выяснить, отвечает ли ваше приложение на запросы.

  5. Переменные окружения: Вы указали, что в launchSettings.json используете среду разработки (Development). Убедитесь, что вы установили значение ASPNETCORE_ENVIRONMENT в Production для вашего сервиса и убедитесь, что ваше приложение правильно настроено для работы в продакшн среде.

  6. Код в Program.cs: Возможно, вам стоит проверить, правильно ли произведена инициализация вашего приложения в Program.cs. Пример кода инициализации может выглядеть так:

    var builder = WebApplication.CreateBuilder(args);
    
    // . . . Конфигурация сервисов . . .
    
    var app = builder.Build();
    
    app.UseForwardedHeaders();
    app.UseRouting();
    
    app.MapControllers(); // или другой метод маршрутизации
    
    app.Run("http://localhost:8091");
  7. Логи Nginx: Проверьте логи Nginx для выявления проблем. Логи обычно находятся в /var/log/nginx/error.log и /var/log/nginx/access.log.

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

Надеюсь, эти советы помогут вам решить проблему с развертыванием вашего .NET Core проекта. Если у вас будут дополнительные вопросы, не стесняйтесь задавать их!

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

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