Ошибка 404 при подключении к веб-сокету за nginx proxy_pass

Я хотел бы обслуживать веб-узел за местом на моем веб-сервере. Например, если мой домен - 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. Сообщите мне, если я могу предоставить дополнительную информацию, которая поможет решить эту проблему.

0
задан 9 March 2020 в 20:02
1 ответ

Решение состоит в том, чтобы удалить все необязательные заголовки, удалить функцию 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/";
    }
1
ответ дан 26 June 2021 в 08:40

Теги

Похожие вопросы