Подтвердить что ты не робот

Ratchet + nginx + SSL/secure websocket

Я пытаюсь запустить Ratchet.io через SSL (эта проблема: php ratchet websocket SSL connect?).

Мой веб-сервер работает на myhost.mobi, и я создал отдельный виртуальный хост для службы websocket "wws.myhost.mobi".

Мой веб-разъем:

$webSock = new React\Socket\Server($loop);
$webSock->listen(8080, '0.0.0.0');
$webServer = new Ratchet\Server\IoServer(
    new Ratchet\Http\HttpServer(
        new Ratchet\WebSocket\WsServer(
            new Ratchet\Wamp\WampServer(
                $pusher
            )
        )
    ),
    $webSock
);

My nginx config (я на nginx 1.5.8):

upstream websocketserver {
        server localhost:8080;
}

server {
    server_name wss.myapp.mobi;

    listen 443;
    ssl on;
    ssl_certificate /etc/ssl/myapp-mobi-ssl.crt;
    ssl_certificate_key /etc/ssl/myapp-mobi.key;

    access_log /var/log/wss-access-ssl.log;
    error_log /var/log/wss-error-ssl.log;
    location / {
                proxy_pass http://websocketserver;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
                proxy_read_timeout 86400; # neccessary to avoid websocket timeout disconnect
                proxy_redirect off;
        }
}

Моя клиентская сторона script:

var conn = new ab.Session('wss://wss.myapp.mobi', function(o) {

    // ...

}, function() {
    console.warn('WebSocket connection closed');
}, {
    skipSubprotocolCheck: true
});

Итак, когда я загружаю страницу в Firefox, я вижу исходящее соединение с wss://wss.myapp.mobi: 8080/, которое висит (прядильщик) и никогда не завершается или не умирает. Я не вижу никаких следов запроса, поступающего на бэкэнд в журналах.

Что мне там не хватает?

Спасибо!

EDIT Я понял, что должен подключаться к wss://wss.myapp.mobi, но теперь я получаю статус "101 Switching Protocols".

РЕДАКТИРОВАТЬ 2 Теперь все работает с приведенной выше конфигурацией. Статус "101 Switching Protocols" становится обычным сообщением. ПРОБЛЕМА РЕШЕНА!

4b9b3361

Ответ 1

Проверяя историю изменений вопроса, ясно, что конфигурация в вопросе была правильной, temuri пытался подключиться от клиента с установленным портом,

upstream websocketserver {
        server localhost:8080;
}

но этот блок кода сообщает Nginx, что на порту 8080 работает tcp-сервер, который представляет его как псевдоним websocketserver, но работающий сервер недоступен для публики.

Проверьте конфигурацию ниже,

server {
    server_name wss.myapp.mobi;

    listen 443;
    ssl on;
    ssl_certificate /etc/ssl/myapp-mobi-ssl.crt;
    ssl_certificate_key /etc/ssl/myapp-mobi.key;

    access_log /var/log/wss-access-ssl.log;
    error_log /var/log/wss-error-ssl.log;
    location / {
                proxy_pass http://websocketserver;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
                proxy_read_timeout 86400; # neccessary to avoid websocket timeout disconnect
                proxy_redirect off;
        }
}

эта конфигурация связывает домен wss.myapp.mobi с портом 443, разрешая ssl и proxy запросы к локальному серверу websocket с помощью директивы proxy_pass, директивы отдыха предназначены для обработки обновлений соединений.

Таким образом, сервер websocket можно получить через клиентский браузер с помощью

// connect through binded domain
// instead of wss.myapp.mobi:8080 which will not work
var url = 'wss://wss.myapp.mobi';