Я хотел бы обслуживать веб-узел за местом на моем веб-сервере. Например, если мой домен - http: // mydomain
, я хотел бы, чтобы мой веб-сокет был доступен по адресу ws: // mydomain / ws
.
Я использую локальный сервер websocket на порту 8080, и я могу подключиться к нему, используя как localhost, так и IP-адрес локальной сети (192.168.1.100). Когда я пытаюсь получить доступ к веб-сокету, используя этот путь, я получаю Ошибка: неожиданный ответ сервера (404)
.
Вот моя конфигурация nginx в попытке сделать это:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server 127.0.0.1:8080;
}
server {
listen 80;
listen [::]:80;
access_log /var/log/nginx/mydomain.access.log;
error_log /var/log/nginx/mydomain.error.log;
server_name mydomain;
location / {
alias /var/www/mydomain/htdocs;
index index.html;
try_files $uri $uri/ =404;
}
location /ws/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://websocket;
}
}
Я нашел несколько предыдущих вопросов в Интернете, но, похоже, ни один из них не решает эту проблему; Я даже не уверен, возможен ли такой тип прокси.
Изначально у меня был протокол websocket, определенный как «чат», и я получал Sent непустой заголовок «Sec-WebSocket-Protocol», но ответа не было получено
ошибка; удаление исправляет это на данный момент.
Мой сервер websocket использует созданный локально NetCoreServer из https://github.com/chronoxor/NetCoreServer и почти идентичен имеющемуся у них примеру небезопасного сервера websocket. Сообщите мне, если я могу предоставить дополнительную информацию, которая поможет решить эту проблему.
Решение состоит в том, чтобы удалить все необязательные заголовки, удалить функцию upstream
и указать все конечные точки веб-сокетов, а не главный сервер без конечных точек. Для меня основным сервером был ws.example.com
, и у меня есть ws.example.com/chat
и ws.example.com/notifications
, поэтому я установил его примерно так:
location /chat {
proxy_pass "http://127.0.0.1:2020/chat/";
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /notifications
{
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass "http://127.0.0.1:2020/notifications/";
}
location / { return 405;}
Если вы использовали разные конечные точки для каждой службы, восходящий поток не будет работать, но я понятия не имею, почему.
Чуть не забыл. Моя переменная $http_upgrade отображается следующим образом:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
В вашем случае это будет вызвано неправильным $connection_upgrade
вы взяли его из SoF, и я сделал ту же ошибку:
location /ws/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass "http://127.0.0.1:8080/ws/";
}