Вопрос

У меня есть прокси 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/
.

И я даже знаю, что вызывает проблему. Прокси 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
.

Так что «обновление» удаляется и «соединение» изменено и поэтому рукопожатие 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]
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top