morozovsk / websocket

simple php websocket server + demos + yii/yii2 integration + php 7 support
368 stars 74 forks source link

wss timeot #31

Closed ckjet closed 7 years ago

ckjet commented 7 years ago

При переезде на https получаю timeout, клиент соединяется через wss://

morozovsk commented 7 years ago

https://github.com/morozovsk/websocket/wiki/Together-with-nginx

ckjet commented 7 years ago

Опять таймаут У нас такой конфиг без ssl: location /websocket {

limit_conn perip 5; #set limit to 5 connection from 1 ip

    proxy_pass http://127.0.0.2:8004;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s; #increase timeout to 1 hour
}

с ssl: location /websocket {

limit_conn perip 5; #set limit to 5 connection from 1 ip

    proxy_pass https://127.0.0.2:8004;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s; #increase timeout to 1 hour
}

Вот ошибка в логе:upstream prematurely closed connection while reading response header from upstream

olegius88 commented 7 years ago

Здравствуйте. А вы не замеряли время, за которое отрабатывает ваш код на стороне сервера? может дело в том, что много времени уходит на работу php?

ckjet commented 7 years ago

Если использовать http, то все работает, но на https вот так. Не думаю что в этом дело.

olegius88 commented 7 years ago

а у вас в секции server { ssl_certificate .ssl/geotrust.amix24.com.crt; ssl_certificate_key .ssl/geotrust.amix24.com.key; } подобные записи есть? то есть, сам ssl сертификат подключили?

ckjet commented 7 years ago

Сертификат подключен и работает.

olegius88 commented 7 years ago

попробуйте в адресе прописать wss://.../websocket:443

ckjet commented 7 years ago

Не помогло

morozovsk commented 7 years ago

Вот ошибка в логе:upstream prematurely closed connection while reading response header from upstream

в логе чего? если в логе nginx, то у вас на указанном ip:port ничего не запущено возможно вы имели ввиду 127.0.0.1, а не 127.0.0.2 ?

В любом случае нужны полные конфиги для http и https, описать случай в котором всё работает иначе это гадание на кофейной гуще.

Update: в конфиге с ssl указано: proxy_pass https , а нужно http сама библиотека работает по http, а nginx делает необходимое шифрование.

olegius88 commented 7 years ago

вот наш рабочий конфиг location ws { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 3600s; proxy_pass http://127.0.0.1:8013; proxy_http_version 1.1; } у нас 127.0.0.1

morozovsk commented 7 years ago

ок. скиньте конфиг и опишите случай, в котором у вас работает. скиньте полный конфиг (с секцией sever и port), в неработающем случае скиньте полный конфиг (с секцией sever и port), в работающем случае кто выдаёт ошибку и какую в случае не работающего

ckjet commented 7 years ago

Решил через саму библиотеку, через nginx не получалось

olegius88 commented 7 years ago

поделитесь

ckjet commented 7 years ago

при инициализации я добавил опции:

'secure' => true,
'cert_file' => '/path/to/ssl.crt', //path to ssl ceritificate
'pk_file' => '/path/to/ssl.key', //path to private key file
'websocket' => 'ssl://0.0.0.0:8004',

Далее в файле Servver.php изменил код на:

if (!empty($this->config['websocket'])) {
            //open server socket
            if ($this->config['secure']) {
                $context = stream_context_create();
                if (!is_file($this->config['cert_file'])) {
                    die("Error open cert-file\n");
                }
                if (!is_file($this->config['pk_file'])) {
                    die("Error open key-file\n");
                }
                stream_context_set_option($context, 'ssl', 'local_cert', $this->config['cert_file']);
                stream_context_set_option($context, 'ssl', 'local_pk', $this->config['pk_file']);
                $server = stream_socket_server($this->config['websocket'], $errorNumber, $errorString, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context);
            } else {
                $server = stream_socket_server($this->config['websocket'], $errorNumber, $errorString);
                stream_set_blocking($server, 0);
            }
            if (!$server) {
                die("error: stream_socket_server: $errorString ($errorNumber)\r\n");
            }
        }

Долгое время не мог понять почему данные при использовании ssl приходят в виде похожем на бинарный, оказалось что дело было из-за этой строки: stream_set_blocking($server, 0); я ее убрал и все работает отлично.

borodatych commented 7 years ago

Здравствуйте.

Конфиг веб-сокет сервера:

$config = array(
    'class' => 'Backend\Chat\Handler',
    'pid' => '/tmp/websocket_chat.pid',
    'websocket' => 'tcp://80.xx.xx.82:8004',
    'localsocket' => 'tcp://127.0.0.1:8010',
    'eventDriver' => 'event'
);

Конфиг Nginx:

location /websocket {
        #limit_conn perip 5; #set limit to 5 connection from 1 ip
        proxy_pass http://127.0.0.1:8010;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 3600s; #increase timeout to 1 hour
}

Сейчас в консоле браузера:

WebSocket connection to 'ws://site.ru/websocket?userId=3r3f3b0l09geeevio4c6np55g1_255' failed: Error during WebSocket handshake: Unexpected response code: 404

Что, кстати, указывать в proxy_pass - адрес:порт с websocket или localsocket ?

morozovsk commented 7 years ago

Что, кстати, указывать в proxy_pass - адрес:порт с websocket или localsocket ?

websocket

borodatych commented 7 years ago

От себя хочу добавить, что если у кого то не заводится, то попробуйте это реализовать на другом домене/поддомене. У нас, к примеру, на основном куча всего накручено, и не заработало. На чистеньком поддомене, все гуд.