Как настроить прокси Apache для Meteor / Sockjs и Websocket?
Вопрос
У меня есть прокси Apache для приложения Meteor, а Apache и Meteor находятся на двух отдельных машинах. Мне это нужно, так как Apache должен служить много настоящих сайтов, и это не было бы хорошей идеей для установки приложения Meteor на этой машине из-за ограниченных ресурсов.
Однако рукопожатие Websocket не удается с ответом кода 400 «может обновить только для Websocket», если я пытаюсь подключиться снаружи через прокси. Все работает нормально, когда я подключаюсь к локальной сети непосредственно к машине Meteor. Когда 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/
.
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
.
Так что «обновление» удаляется и «соединение» изменено и поэтому рукопожатие WebSocket не удается. Теперь я мог бы попытаться всегда установить «обновление» на «Websocket» с директивой запросовой подголовники. Однако это не чувствует себя правильно, и я думаю, это приведет к другим проблемам, и поэтому мне было интересно, есть ли реальное решение этой проблемы? Или это что-то патч из https://stackoverflow.com/16998664 должен обратиться, и что-то пошло не так на моем конце применения Это?
Из того, что я прочитал переключение на Nginx, может облегчить эту настройку. Я рассмотрю это, но когда возможно, я хотел бы сделать это с Apache, так как Nginx сделает другие вещи более сложными и стоить мне много времени.
Решение
Мы используем это для Apache и приложения Sockjs за Apache.Apache - автоматически делать прокси Websocket Proxy, но вы должны переписать схему WS в обратных отношениях к XHR.Но только если подключение является рукопожатие WebSocket.Добавление следующего исправит вашу проблему :) (Примечание. Соответственно измените генеракодичеватель соответственно на ваш собственный URL-адрес Backend.
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^websocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]
. Другие советы
Этот ответ основан на ответе Фатиха.Его решение терпит неудачу для браузеров, которые отправляют заголовок запроса подключения, кроме «обновления», например, «Beach-Alive, обновление».Это было так для меня с Firefox 42.
Чтобы решить проблему для Firefox также, измените переписку Apache следующим образом:
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]
.
( ^ Обновление $ становится <сильным> модернизацией $ )
Я хотел поставить это как комментарий к ответу Фатиха, однако мне не хватает необходимой репутации.
После прочтения нескольких ответов, размещение на форуме METEOR, и многие испытания вот вся Enchilada, которая работала для меня.Другие ответы были несколько неполными, или, по крайней мере, не работали для меня.
Я должен был сделать:
sudo a2enmod proxy_wstunnel
.
Также пришлось добавить проксипасс и проксипустреное и измененное обновление $, чтобы обновить $ от другого, чтобы ответить.
<VirtualHost *:80>
ServerName some-domain.com
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
</VirtualHost>
.
Затем перезапустите Apache.
Я проверил на консоли, и сейчас нет ошибок и нет запросов XHR.Поэтому я предполагаю, что он работает правильно
Я хотел бы, чтобы я мог предоставить вам прямой ответ с инструкциями Apache, но с тех пор, как вы упомянули Nginx и что тот факт, это сложно настроить, я хотел бы взвесить с альтернативой, которая фактически использует NGINX, нозащищает вас от всех сложностей.
Учебник на https://github.com/phusion/Пассажирский / вики / Фюзия-пассажир: -Метер-учебник проходит через шаги, чтобы настроить Phance Passenger С Ninx или без Nginx (в любом случае, он внутренне использует Nginx) для многоэффективных развертываний Meteor Meteor, которые могут масштабировать, чтобы использовать все ядра на вашем сервере.
Это так просто, как:
$ cd meteor-app-directory
$ mkdir public tmp
$ passenger start
. Ответ Fatih-Arslan с поправка Дервиви работала как шарм. Одна вещь, которую я должен был использовать, была вкладывая WSS вместо ws , потому что мой сервис работает только в https.
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* wss://localhost:3000%{REQUEST_URI} [P]
.