прокси nginx для клиента Javascript WebSocket

1

У меня nginx работает на localhost, обслуживая статические файлы html/css/js. Он проксирует удаленный сервер для требуемых служб RESTful db. Мне также нужно настроить nginx на прокси-сервер на удаленный сервер веб-сервера, но при этом все неудачи не сработают.

Клиент Javascript работает, если я жестко задаю URL-адрес сервера websocket следующим образом:

socket = new WebSocket("ws://50.29.123.83:9030/something/socket");

Очевидно, что это не оптимальное решение, и я должен иметь возможность использовать location.host и прокси-сервер, чтобы добраться до того же места. Я настроил nginx со следующим:

http {
  ...
  upstream websocket {
    server 50.29.123.83:9030;
    }
}

sever {
  ...
  location /the_socket/ {
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
  }
}

Затем обновлен код клиента:

socket = new WebSocket("ws://" + location.host + "/the_socket/something/socket");

Это не выполняется со следующей ошибкой:

Соединение WebSocket с 'ws://localhost/the_socket/something/socket' не выполнено: Ошибка во время рукопожатия WebSocket: Неожиданный код ответа: 404

Что я делаю неправильно?

  • номера ip и портов изменены для защиты невинных
Теги:
nginx
proxy
websocket

1 ответ

1
Лучший ответ

Ваш прокси-оператор передаст URI для восходящего сервера без изменений. То есть текст /the_socket все равно будет прикреплен к началу URI.

Если вы хотите, чтобы proxy_pass URI и proxy_pass значение location вы должны добавить URI в оператор proxy_pass. Например:

location /the_socket/ {
    proxy_pass http://websocket/;
    ...
}

Подробнее см. В этом документе.

  • 0
    Спасибо, Ричард!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню