【问题标题】:PHP Websocket on LAMP UbuntuLAMP Ubuntu 上的 PHP Websocket
【发布时间】:2018-04-18 07:19:57
【问题描述】:

所以我已经搜索了很长一段时间,并尝试了很多东西,但就是不知道如何让它工作。我使用 XAMPP 和 angular (v5) 前端在本地机器上创建了一个 PHP WebSocket 服务器(棘轮),没有任何问题。

然后我尝试将两者部署在运行 LAMP 堆栈的 DigitalOcean 实例上,因为该应用程序不仅仅是 WebSocket 聊天,其余部分(RESTful API)工作正常,但是当 JavaScript 尝试连接到WS 我明白了

 WebSocket connection to 'ws://<ip-address>:8888/chat' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

所以我所做的是启用 apache2 mods proxyproxy_wstunnel 并为虚拟主机创建一个条目

<VirtualHost *:8080>
    DocumentRoot /var/www/html_backend/web

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory "/var/www/html_backend/web">
            AllowOverride All
            Allow from All
    </Directory>

    ProxyRequests Off
    ProxyPass "/chat/" "ws://localhost:8888/"
    # also tried 0.0.0.0 and 127.0.0.1 instead of localhost
</VirtualHost>

PHP服务器socket是这样启动的

public function actionStart() {
    $app = new App('localhost', 8888, '0.0.0.0');
    $app->route('/chat', new Chat());
    $app->run();
}

在 JS 中我尝试连接到这个

this._socket = new WebSocket('ws://<ip-address>:8888/chat');

我也在应该代理它的端口 8080 上尝试过,但是它返回了 404 错误。

在 80 端口上我有我的前端和在 8080 端口上我的后端,这是目前工作的。我可以在端口 8888 上启动 WebSocket,它没有给我检测到任何错误,但是当我尝试连接它时,我得到了上面的错误消息。这只是为了测试,我还没有 SSL 证书,但首先我想让它工作还是我需要一个?我尝试了很多在网上找到的 URL 组合,但到目前为止都没有。

就在写作时,我注意到套接字是从/var/www/html_backend 而不是/var/www/html_backend/web 启动的,DocumentRoot 可能会导致代理问题吗?

我希望有人能指出我正确的方向,因为到目前为止我发现的所有“有效”解决方案都没有那么有用。

最好的问候

【问题讨论】:

  • 检查你的端口是否打开。套接字服务器是一个痛苦......完全成熟,易于使用,畅销等。
  • @ArtisticPhoenix 不是我第一次听到关于套接字的... xD,但是端口是开放的。
  • 大约 3 年前我构建了一个作为实验,然后决定使用 RabbitMq,因为它具有比我希望构建或维护更多的功能。
  • 我会看看,但现在我很乐意让它工作,只是为了它
  • 您没有尝试::1,但我怀疑这是问题所在。你用的是什么浏览器,Chrome?我刚读到chrome不允许非SSL连接,你可以试试火狐。我永远不会建议尝试 IE 或 Edge,我经历了 IE6 的日子......哈哈

标签: php apache websocket mod-proxy ratchet


【解决方案1】:

我用 PHP Linux 和棘轮在 Digitalocean 构建 Websocket,它的工作中继很好,(我的例子是使用 wss,但你也可以使用 ws)。

我构建它的方式:

服务器端棘轮 websocket:

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

Apache httpd-ssl.conf:

<VirtualHost _default_:443>
ProxyPass /wss2/ ws://your.domain:8000

你的 js 文件:

wss://your.domain/wss2/

不仅仅是使用命令在棘轮中运行 php websocket:php server.php 你很高兴..

【讨论】:

  • 使用new WsServer(..);时,wss2是默认路由吗?您是否在非默认端口上尝试过它/wss://your.domain:8080/wss2/ 在 JS 中也能正常工作吗?
  • 它不是默认值,这就是我们配置 httpd-ssl 文件(默认值:your.domain)的原因。并且您必须在服务器和客户端中使用相同的端口
  • 好的,但我的意思是现在在我的代码中我有这个$app-&gt;route('/chat', new Chat()); 和我的虚拟主机ProxyPass "/chat/" "ws://localhost:8888/"。我是否必须连接到ws://your.domain:8080/chat/chat 才能完成该路线,或者它是如何工作的?但我稍后会尝试您的服务器创建代码。 =)
  • 将端口添加到路由中,并在您的 js 中将其更改为:ws://your.domain/chat(或尝试我的完整评论)
猜你喜欢
  • 1970-01-01
  • 2011-11-14
  • 2017-07-17
  • 2015-02-10
  • 2017-11-13
  • 2011-06-22
  • 2016-04-19
  • 1970-01-01
  • 2020-02-19
相关资源
最近更新 更多