Я использую 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