php - Websocket 不适用于 Apache 中的 WSS
问题描述
让我详细解释一下整个场景:
我们有两台服务器: - 一台共享主机 - 另一台是 VPS
我们的要求是在项目中设置 websocket。但要这样做,共享主机不允许打开自定义端口。所以我们决定购买另一台“VPS”服务器。
检查下图:
如上图所示,我们的门户网站使用 VPS 服务器进行 websocket 连接。
共享主机是 HTTPS。而且VPS服务器也有SSL。所以它也是HTTPS。
因此,如果我将门户网站与“ws”连接,如下所示:
var wsocket = new WebSocket("ws://DOMAIN_NAME_OF_VPS:PORT")
然后它给出如下错误:“混合内容:' https ://example.com' 的页面是通过 Https 加载的,但尝试连接到不安全的 websocket 端点'ws://DOMAIN_NAME_OF_VPS:PORT'。这个请求有已被阻止;此端点必须通过 WSS 可用。”
所以很明显我们不能在HTTPS中使用WS。
所以我们只需将 WS 替换为 WSS,如下所示(当然我们安装了 SSL 证书):
var wsocket = new WebSocket("wss://DOMAIN_NAME_OF_VPS:PORT")
现在我收到此错误:与 'wss://DOMAIN_NAME_OF_VPS:PORT' 的 websocket 连接失败:WebSocket 打开握手超时。
关于websocket服务器(vps服务器):
我正在使用 Ratchet 在 PHP 中进行 websocket 集成。 http://socketo.me/
我正在为 PHP 使用 Apache 引擎。
棘轮服务器代码:
<?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,并为 websocket 使用“ws”,那么一切正常。
所以我不明白为什么“wss”不能与“https”一起使用,而我已经在 VPS 中集成了 SSL。
有没有其他方法可以告诉 websocket 使用 SSL 文件?
我错过了什么吗?
你的帮助对我来说非常重要。
非常感谢,提前祝大家新年快乐。
解决方案
推荐阅读
- java - 为什么无法在jsp中显示两个输入
- visual-studio-code - Visual Studio Code,内联文件夹
- ios - 在 iOS 中使用 FFMPEG 进行流式传输时如何获取相机预览?
- grafana - 加载面板插件 TypeError 时出错:r.PanelPlugin 不是构造函数(Grafana)
- c# - 如何从命令提示符执行 Specflow 中的所有功能文件?以及如何执行多个特征文件(即 2 个特征文件)?
- mysql - mysqldump 不保留视图格式/结构
- java - 如何在文件中的行之间移动?
- javascript - html:创建与缺少必填字段时相同的弹出框
- php - 如何在 WooCommerce 中突出显示可变产品页面上的变体表单字段?
- javascript - JS New Date() 返回纪元 0