У меня 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
Что я делаю неправильно?
Ваш прокси-оператор передаст URI для восходящего сервера без изменений. То есть текст /the_socket
все равно будет прикреплен к началу URI.
Если вы хотите, чтобы proxy_pass
URI и proxy_pass
значение location
вы должны добавить URI в оператор proxy_pass
. Например:
location /the_socket/ {
proxy_pass http://websocket/;
...
}
Подробнее см. В этом документе.