nginx под Windows и проксирование вебсокетов
Господа,
я пытаюсь разрабатывать react приложение, а чтобы оно могло общаться и с Node (котрая нужна на этапе отладки) и с rest - сервером - мне приходится ставить перед ним nginx в качестве прокси. Да, важное уточнение: всё это я делаю под Win 10.
Ну, nginx раскидывает запросы: те запросы, которые начинаются с /api/ - кидает на rest- сервер, а остальные - на node.
Но вот беда: при заходе на такой прокси у меня пояавляется в барузере ошибка:
webpackHotDevClient.js:60 WebSocket connection to 'ws://localhost/sockjs-node' failed: Error during WebSocket handshake: Unexpected response code: 404
Понятно, почему: не работает отладка react - приложений, которая реализована через websocket - соединение.
Ладно, думаю я. Дописываю в конфиг nginx'а секцию
location /sockjs-node/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 3600s;
}
и... получаю при старте nginx ошибку
nginx: [emerg] unknown "connection_upgrade" variable
Если же эту строку из конфига выкинуть, то при запуске nginx и попытке использовать отладку - возникает другая ошибка в браузере:
WebSocket connection to 'ws://localhost/sockjs-node' failed: Error during WebSocket handshake: Unexpected response code: 301
То есть, как я понимаю, клиент и сервер websocket не могут договориться о параметрах протокола. Хэндшейк не проиходит.
Попробовал обойтись без этих переменых, прописав всё руками:
location /sockjs-node/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade "Upgrade";
proxy_set_header Connection "Upgrade";
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Но ошибка остаётся той же самой:
WebSocket connection to 'ws://localhost/sockjs-node' failed: Error during WebSocket handshake: Unexpected response code: 301
Ладно, читаю на сайте nginx "возможные проблемы" при использовании nginx for windows: "Проксирование по UDP не поддерживается". Не могу понять, имеет ли это отношение к моей ситуации.
Означает ли это, что проксирование вебсокетов через nginx под виндой запустить так и не удастся? Или есть какой то обходной путь?
Спасибо заранее!
Дополнение. Конфиг nginx целиком:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location /api/ {
add_header 'Access-Control-Allow-Origin' "$http_origin" always;
proxy_redirect http://localhost:9000/ /api/;
proxy_pass_header Server;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 5;
proxy_read_timeout 240;
proxy_intercept_errors on;
proxy_pass http://localhost:9000;
}
location / {
proxy_redirect http://localhost:3000/ /;
proxy_pass_header Server;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 5;
proxy_read_timeout 240;
proxy_intercept_errors on;
proxy_pass http://localhost:3000;
}
location /sockjs-node/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}