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.