Привет. Я пытаюсь выяснить, как реверсировать прокси экспресс-сайт с socket.io под MAMP Pro 5 (Mac).Websockets работают, если на клиенте я указываю localhost: 3000 вместо настройки поддоменов в MAMP.Я знаю, что с сокетом socket.io работает обратный прокси-сервер в Apache (2.2.34), и я не могу понять, как это исправить.
Код сервера;
var host, server, io,
fs = require( 'fs' ),
https = require( 'https' ),
express = require( 'express' )( ),
middleware = require( 'socketio-wildcard' )( ),
redis = require( 'socket.io-redis' ),
emitter = require( '../private/emitter' ),
keys = [ 'disconnect', 'authenticate', 'join', 'leave', 'subscribe', 'subscribe', 'unsubscribe' ],
webPath = __dirname + '/',
viewPath = webPath + 'views/',
sessionPrefix = 'ci_session',
roomPrefix = 'py';
/* server */
host = '127.0.0.1';
server = https.createServer({
cert: fs.readFileSync( 'private/cert/emitter.test.com.crt' ),
key: fs.readFileSync( 'private/cert/emitter.test.com.key' )
}, express );
io = require( 'socket.io' )( server, {
transports: [ 'websocket', 'xhr-polling' ],
serveClient: false,
path: '/ws'
});
io.origins( '*:*' );
io.use( middleware );
io.adapter( redis({ host: host, port: '6379' }) );
server.listen( 3000, function( ) {
emitter.log( '\n==========================' );
emitter.log( 'server listening on *:3000' );
emitter.log( '==========================\n' );
});
/* express routes */
express.use(function( req, res, next ) {
res.header( 'Access-Control-Allow-Origin', '*' );
res.header( 'Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept' );
next( );
});
express.get( '/', function( req, res ) {
res.sendFile( viewPath + 'index.html' );
});
express.get( '/health', function( req, res ) {
res.sendFile( viewPath + 'health.html' );
});
/* socket.io events */
io.on( 'connection', function( socket ) {
emitter.log( 'client connected' );
...
Код клиента:
define( [ 'jclass', 'socketio' ], function( Class, io ) {
'use strict';
var Socket = Class._extend({
/**
* Method: init
* @param {Object} aOptions
*/
init: function( aOptions ) {
var options = aOptions || { };
this._parent = options.parent;
this._events = [ ];
this._connection = io( options.url, {
transports: [ 'websocket', 'xhr-polling' ],
path: '/ws'
});
},
...
options.url = emitter.test.com (не работает), изменив это значение на localhost: 3000 работ.
Хост MAMP:
Имя: emitter.test.com
SSL: сертификат / ключ, заданный для файлов, которые использует сервер.Разрешить HTTP-соединения проверяется
Директива виртуального хоста Apache:
ServerName Emitter
ServerAlias emitter.test.com
SSLProxyEngine On
SSLProxyCheckPeerCN Off
SSLProxyCheckPeerExpire Off
ProxyPass /ws ws://localhost:3000/ws
ProxyPassReverse /ws ws://localhost:3000/ws
ProxyPass /health https://localhost:3000/health
ProxyPassReverse /health https://localhost:3000/health
ProxyPass / https://localhost:3000
ProxyPassReverse / https://localhost:3000
При посещении сайта с помощью https://emitter.test.com отображается тестовая страница.Эта ошибка отображается в консоли JS в Chrome при сбое подключения веб-сокета:
WebSocket connection to 'wss://emitter.test.com/ws/?EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 500
Есть идеи, что я делаю неправильно?