@Teran123

PHP сокеты не работают по wss://. Как исправить?

Здравствуйте. Перевёл сайт на https и не могу понять, как перевести сокеты. На http к сокетам шло подключение через ws://sitename.com:3003., теперь нужно, чтобы они были доступны по wss://sitename.com:3003. Подскажите, пожалуйста, как это сделать.

PHP:
$loop   = React\EventLoop\Factory::create();
$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:3004');
$pull->on('message', array($pusher, 'onMessage'));

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

$loop->run();


JS:
window.phpSocket = new ab.Session('wss://sitename.com:3003',


NGINX:
server {
    listen   443 ssl;
    keepalive_timeout   70;

    client_max_body_size    500M;
    root /var/www/path/to/site/root;
    index index.php;
    server_name sitename.com;
    gzip_static on;
    gzip            on;
    gzip_min_length 1000;
    gzip_proxied    expired no-cache no-store private auth;
    gzip_types      text/plain application/xml text/css text/javascript application/javascript;


    ssl                     on;
    ssl_certificate         /etc/letsencrypt/live/sitename.com/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/sitename.com/privkey.pem;
    ssl_session_cache       shared:SSL:10m;
    ssl_session_timeout     10m;
  • Вопрос задан
  • 3075 просмотров
Решения вопроса 1
@Teran123 Автор вопроса
Проблему, к счастью, получилось решить самостоятельно через hproxy

Поэтапно:

Устанавливаем hproxy:
wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.3.tar.gz
tar -zxvf haproxy-1.5.3.tar.gz
cd haproxy-1.5.3
make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1
make install

При первом make мне выдало ошибку
fatal error: pcre.h: No such file or directory
Лично мне на Ubuntu помогло
sudo apt-get install libpcre3-dev
Источник: https://stackoverflow.com/questions/22555561/error...

Дальше создаем файл настроек(я создал его в /etc/hproxy.cfg):
Где
WSS_SOCKET_PORT - порт, по которому вы будете обращаться к сокетам через wss://(в моём случае - 3033 и обращаюсь я теперь по wss://sitename.com:3033)
SOCKET_SERVER_PORT - порт, который вы забиндили в php и который доступен по ws://(в моём случае - 3003)
/etc/path/to/full.pem - путь к сертификату, который должен содержать внутри себя и сертификат и ключ сертификата.
Если у вас ключ и сам сертификат отдельно друг от друга(как было у меня), то вам поможет простая команда(и соотв. в пути уже указывайте путь к объединенному .pem файлу)
cat /etc/path/to/crt.pem /etc/path/to/key.pem > /etc/path/to/full.pem


global
        log     127.0.0.1       local0
        maxconn 10000
        daemon

defaults
        mode                    http
        log                     global
        option                  httplog
        retries                 3
        backlog                 10000
        timeout client          30s
        timeout connect         30s
        timeout server          30s
        timeout tunnel          3600s
        timeout http-keep-alive 1s
        timeout http-request    15s

frontend public
        bind            *:WSS_SOCKET_PORT ssl crt /etc/path/to/full.pem
        acl             is_websocket hdr(Upgrade) -i WebSocket
        use_backend     ws if is_websocket
        default_backend www

backend ws
        server  ws1     127.0.0.1:SOCKET_SERVER_PORT

backend www
        timeout server  30s
        server  www1    127.0.0.1:8080


После этого в JS меням порт коннекта к сокету на тот, который указали в WSS_SOCKET_PORT
window.phpSocket = new ab.Session('wss://sitename.com:3033',

Затем запускаем haproxy с нашим конфигом
haproxy -f /etc/haproxy.cfg -p /var/run/haproxy.pid -D

И пробуем подключится.
У меня заработало)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы