Назад | Перейти на главную страницу

Пропуск прокси-сервера Apache и веб-сокеты

Я использую Apache с mod_proxy модуль для обратного прокси-сервера моего приложения Node.js через порт 80, чтобы мы могли получить к нему доступ как внутренний применение.

У меня есть файл в sites-enabled который содержит это:

VirtualHost *:80>
    DocumentRoot /var/www/internal/
    ServerName internal
    ServerAlias internal

    <Directory /var/www/internal/public/>
        Options All
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>

    ProxyRequests off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / http://localhost:8080/ retry=0
    ProxyPassReverse / http://localhost:8080/
    ProxyPreserveHost on
    ProxyTimeout 1200
    LogLevel debug

    AllowEncodedSlashes on
</VirtualHost>

Как я уже сказал, наше приложение написано на Node.js, и мы используем socket.io использовать веб-сокеты, так как наше приложение также содержит элементы реального времени. Проблема в, mod_proxy похоже, не обрабатывает веб-сокеты, и мы получаем ошибки при их использовании:

WebSocket connection to 'ws://bloot/socket.io/1/websocket/nHtTh6ZwQjSXlmI7UMua' failed: Unexpected response code: 502 

Как мы можем исправить эту проблему и сохранить работу сокетов, поскольку единственный способ заставить ее работать в настоящее время - это получить доступ к сайту через ip:port чего мы не хотим делать.

Также, как побочный вопрос, как я могу получить ErrorDocument правильно работать? Наши файлы ошибок хранятся в /var/www/internal/public/error/ а через прокси они вроде тоже проходят?

В Apache 2.2 веб-сокеты не поддерживаются обратным прокси, но я предполагаю, что Apache 2.4 поддерживает. У вас есть три варианта решения этой проблемы.

1) Либо переходите на 2.4

2) Вы можете использовать опрос (xhr-polling) вместо веб-сокетов. Все, что вам нужно сделать, это настроить метод транспорта в коде Node.js на стороне сервера, подобном этому.

var io = require('socket.io').listen(PORT);

io.configure(function () {
  io.set("transports", ["xhr-polling"]);
});

Таким образом, socket.io не будет пытаться определить лучший способ транспортировки. Он будет напрямую использовать xhr-polling, который представляет собой простой опрос на основе Ajax и без проблем работает в любом браузере и на веб-сервере.

3) Если вы все еще хотите использовать веб-сокеты, вы можете перекомпилировать Apache 2.2 с поддержкой веб-сокетов. Прочтите эту статью, чтобы узнать об этом подробнее: http://blog.cafarelli.fr/post/2013/04/26/Backporting-Apache-support-for-websockets-reverse-proxy-%28aka-getting-GateOne-to-work-behind-Apache%29