У меня есть прокси-сервер apache для приложения Meteor, а Apache и Meteor находятся на двух разных машинах. Мне это нужно, так как apache должен обслуживать множество реальных веб-сайтов, и было бы не рекомендуется устанавливать приложение Meteor на этом компьютере из-за его ограниченных ресурсов.
Однако рукопожатие WebSocket не удается с кодом ответа 400 «Можно обновить только до веб-сокета», если я пытаюсь подключиться извне через прокси. Все работает нормально, когда я подключаюсь из локальной сети напрямую к метеорной машине. Когда WebSocket выходит из строя, SockJS / Meteor возвращается к XHR, но, к сожалению, это вызывает некоторые ошибки в рассматриваемом приложении. Так что мне действительно нужно, чтобы WebSocket работал в большинстве случаев.
Я исправил свою установку apache с помощью упомянутого здесь патча: https://stackoverflow.com/a/16998664 Похоже, все прошло хорошо но ничего не изменилось ...
Мои директивы прокси-сервера apache в настоящее время следующие:
ProxyRequests Off
ProxyPreserveHost On
ModPagespeed Off
<proxy>
Order deny,allow
Allow from all
</proxy>
ProxyPass / http://10.0.2.6:3000/
ProxyPassReverse / http://10.0.2.6:3000/
И я даже знаю, что вызывает проблему. Прокси-сервер apache возится с заголовком. Исходный заголовок запроса рассматриваемого пакета, покидающего мою машину, выглядит следующим образом:
GET /sockjs/430/minw4r_o/websocket HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: myKey
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
User-Agent: My Agent
Пока пакет пересылается прокси-сервером apache следующим образом:
GET /sockjs/430/minw4r_o/websocket HTTP/1.1
Host: example.com
Origin: http://example.com
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: myKey
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
User-Agent: My Agent
X-Forwarded-For: 24.xxx.xxx.xxx
X-Forwarded-Host: example.com
X-Forwarded-Server: example.com
Connection: Keep-Alive
Таким образом, «Обновление» удаляется, а «Соединение» изменяется, и поэтому рукопожатие веб-сокета не выполняется. Теперь я мог бы попытаться всегда устанавливать «Upgrade» на «websocket» с помощью директивы RequestHeader. Однако это кажется неправильным, и я предполагаю, что это вызовет другие проблемы, поэтому мне было интересно, есть ли реальное решение этой проблемы? Или это то, на что должен обратить внимание патч из https://stackoverflow.com/a/16998664, и что-то пошло не так на моем конце применения Это?
Из того, что я прочитал, переход на nginx может упростить эту настройку. Я подумаю об этом, но по возможности я хотел бы сделать это с помощью apache, поскольку nginx усложнит другие вещи и будет стоить мне много времени.