Позвольте мне подробно объяснить вам весь сценарий:
У нас есть два сервера: - один с общим хостингом - другой - VPS
Наше требование заключается в настройке веб-сокета в проекте.но для этого общий хостинг не позволяет открыть пользовательский порт.поэтому мы решили купить другой VPS-сервер.
проверьте изображение ниже:
Как вы можете видеть на изображении выше,наш веб-портал использует 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?
Я что-то упустил?
Ваша помощь будет очень важна для меня.
Большое спасибо, заранее с новым годом.