SignalR в ASP.NET Core за Nginx

У меня есть сервер с Ubuntu 16.04, kestrel и nginx в качестве прокси-сервера, который перенаправляет на localhost, где находится мое приложение. И мое приложение работает на Asp.Net Core 2. Я пытаюсь добавить push-уведомления и использую ядро ​​SignalR. На localhost все работает хорошо, и на бесплатном хостинге с iis и windows тоже. Но когда я развертываю свое приложение на сервере Linux, у меня появляется ошибка:

signalr-clientES5-1.0.0-alpha2-final.min.js? v = kyX7znyB8Ce8zvId4sE1UkSsjqo9gtcsZb9yeE7Ha10: 1 Соединение WebSocket с 'ws://devportal.vrweartek.com/chat?id=210fc2aa2e-ea-e03737-e03737-e983379-e983379: Ошибка во время рукопожатия WebSocket: Неожиданный код ответа: 204

Но эта ошибка возникает, только если я запрашиваю свой сайт с другого компьютера через имя моего сайта. И когда я запрашиваю сайт с сервера через localhost: порт, все в порядке. Так что я думаю, что проблема в nginx. Я прочитал, что мне нужно настроить его для работы с веб-сокетами, которые используются в сигнализаторе для установления соединения, но мне это не удалось. Может быть, есть какая-то глупая ошибка?

введите описание изображения здесь

3 ответа

Я смог решить эту проблему, используя $http_connection вместо keep-alive или upgrade

server {
  server_name example.com;

  location / {
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

Я сделал это, потому что SignalR также пытался использовать запросы POST и GET к моим концентраторам, поэтому просто выполнить обновление до соединения в конфигурации отдельного сервера было недостаточно.

Проблема в файле конфигурации nginx. Если вы используете настройки по умолчанию из руководства по развертыванию ASP.NET Core, проблема заключается в заголовке прокси. WebSocket требует заголовок соединения как "обновление".

Вы должны установить новый путь для SignalR Hub в файле конфигурации nginx.

такие как

location /api/chat {
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

Вы можете прочитать мой полный блог

https://medium.com/@alm.ozdmr/deployment-of-signalr-with-nginx-daf392cf2b93

Для SignalR в моем случае, помимо настроек «proxy_set_header», есть еще одна критическая настройка «proxy_buffering off;».

Итак, полный пример теперь выглядит так:

      http {
  map $http_upgrade $connection_upgrade {
    default Upgrade;
    '' close;
  }

  server {
    server_name some_name;
    listen 80 default_server;

    root /path/to/wwwroot;
    
    # Configure the SignalR Endpoint
    location /hubroute {
      proxy_pass http://localhost:5000;

      # Configure WebSockets
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_cache_bypass $http_upgrade;

      # Configure ServerSentEvents
      proxy_buffering off;

      # Configure LongPolling
      proxy_read_timeout 100s;

      proxy_set_header Host $host;
    }
  }
}

См. ссылку: Документирование использования обратного прокси-сервера с помощью SignalR.

Другие вопросы по тегам