Websocket не работает с WSS в Apache - PullRequest
0 голосов
/ 29 декабря 2018

Позвольте мне подробно объяснить вам весь сценарий:

У нас есть два сервера: - один с общим хостингом - другой - VPS

Наше требование заключается в настройке веб-сокета в проекте.но для этого общий хостинг не позволяет открыть пользовательский порт.поэтому мы решили купить другой VPS-сервер.

проверьте изображение ниже:

enter image description here

Как вы можете видеть на изображении выше,наш веб-портал использует VPS-сервер для подключения к веб-сокету.

Общий хостинг - HTTPS.И VPS сервер имеет также SSL.таким образом, это также HTTPS.


, поэтому, если я подключаю веб-портал с помощью "ws", как показано ниже:

var wsocket = new WebSocket("ws://DOMAIN_NAME_OF_VPS:PORT")

, тогда выдается ошибка, как показано ниже: "Смешанное содержимое: страницав 'https://example.com' был загружен по протоколу Https, но ему было предложено подключиться к небезопасной конечной точке веб-сокета' ws: // DOMAIN_NAME_OF_VPS: PORT '. Этот запрос был заблокирован; эта конечная точка должна быть доступна через WSS. "

, поэтому очевидно, что мы не можем использовать WS в HTTPS.

, поэтому мы просто заменим WS на WSS, как показано ниже (конечно, мы устанавливаем SSL-сертификат):

var wsocket = new WebSocket("wss://DOMAIN_NAME_OF_VPS:PORT")

Теперь яполучение этой ошибки: сбой подключения веб-сокета к 'wss: // DOMAIN_NAME_OF_VPS: PORT': сбой тайм-аута открытия WebSocket.


О сервере веб-сокетов (vps-сервер):

Я использую Ratchet для интеграции websocket в PHP.http://socketo.me/

Я использую движок Apache для PHP.


Код сервера храповика:

<?php

require __DIR__ . "/../vendor/autoload.php";

use Chat\Chat;

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;

$server = IoServer::factory(new HttpServer(new WsServer(new Chat)), 19994);

$server->run();

?>

000-файл по умолчанию:

  • Я уже попробовал какой-нибудь ProxyPass, который прокомментирован в коде.Пожалуйста, помогите, если я сделал неправильный код.

    # ServerAdmin vps-server-domain ServerName vps-server-domain

    DocumentRoot /var/www/ 
    SSLEngine on 
    SSLCertificateKeyFile /etc/ssl/private/vps-server-domain_private.key 
    SSLCertificateFile  /etc/ssl/certs/vps-server-domain.crt 
    SSLCertificateChainFile /etc/ssl/certs/vps-server-domain.ca-bundle
    
    # SSLProxyEngine On
    # ProxyRequests Off 
    
    # ProxyPass "/wss/"  "ws://vps-server-domain:19994/"
    # ProxyPass "/wss2/"  "ws://vps-server-domain:19994/"
    # ProxyPass /wss2/  "ws://vps-server-domain:19994/"
    # ProxyPass /ws/ wss://vps-server-domain:19994/
    
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    # RewriteEngine on
    # RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    # RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
    # RewriteRule .* wss://vps-server-domain:19994%{REQUEST_URI} [P]
    


Если я использую http на веб-портале и использую «ws» для веб-сокета, то все работает нормально.

, поэтому я не понимаю, почему «wss» не работает с «https», хотя я имеювстроенный SSL в VPS.

Есть ли другой способ сообщить websocket об использовании файлов SSL?

Я что-то упустил?

Ваша помощь будет очень важна для меня.

Большое спасибо, заранее с новым годом.

...