Ответы пользователя по тегу PHP
  • PHP сокеты не работают по wss://. Как исправить?

    @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

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