Socket.io + Express под MAMP Pro 5 - PullRequest
       78

Socket.io + Express под MAMP Pro 5

0 голосов
/ 19 октября 2018

Привет. Я пытаюсь выяснить, как реверсировать прокси экспресс-сайт с 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

Есть идеи, что я делаю неправильно?

...