增加PHP WebSocket的最大连接数。

10

我目前在一台安装了 PHP、Apache 的 Debian 8 机器上运行。

在这台机器上,我安装了一个 Ratchet WebSocket 服务器,但最近我的网站同时在线用户数超过了1000个。这导致 Ratchet socket 出现问题,因为它似乎会在1020个连接时自动拒绝所有新连接。

我已经增加了debian本身的ulimit -n等设置,但我开始想,问题可能出在我的 PHP 默认配置或我使用的 Ratchet WebSocket 上。

如果您有任何关于需要更改哪些配置的建议,我将非常感激。


有人可以确认一下,通过PHP和Ratchet实现WebSockets是否是个好主意吗?这种方法有什么不足之处吗? - Airy
老实说,对我来说选择 PHP 是错误的,可以尝试使用 NodeJS 中的 (socket.io 或 sockjs),Python 和 Go 也有一些很棒的框架/库可供选择。这只是我在那个项目之后的想法。 - mitchken
谢谢您的建议。您能告诉我为什么选择 PHP 作为 WebSockets 是错误的选择吗?从您的经验中学习会非常有帮助。 - Airy
缺乏文档、缺少事件处理选项以及使用 PHP 时遇到的更大障碍迫使我转向 NodeJS,它具有广泛使用和良好记录的 websocket 实现。 - mitchken
1
感谢您分享您的经验。 - Airy
3个回答

7
你只需要阅读部署章节中的官方文档,其中写道: libev和libevent项目实现了高性能异步事件驱动的C库。PHP扩展ev和event可用于与这些库进行接口。它们允许应用程序透明地使用最佳的内核级事件驱动I/O方法(select、poll、epoll、kqueue或事件端口),该方法适用于其运行的操作系统。
ev PHP扩展在其源代码中捆绑了libev C库,并且不需要任何先前的设置。如果您想使用event PHP扩展,您需要首先安装适用于您的操作系统的libevent库及其头文件。例如,在Debian / Ubuntu上:
- $ sudo apt-get install libevent libevent-dev
然后,您可以通过您喜欢的软件包管理器或直接使用pecl安装ev或event扩展:
- $ sudo pecl install ev - $ sudo pecl install event

不需要进一步的设置; 如果这两个扩展之一存在,Ratchet使用的事件驱动I/O循环工具包将自动利用它们,这将极大地提高并发性。 这里是链接: http://socketo.me/docs/deploy


我的服务器是Ubuntu 16.04,并且已经有了libevent-2.0-5,可能是默认安装的。没有叫做libevent的包。我安装了两个pecl扩展并将这些行添加到我的php.ini文件中,看起来一切都运行良好。 - RaisinBranCrunch

3

确保libevent工作正常

if (function_exists('event_base_new')) {
    echo "\033[0m We can use LibEventLoop!!" . PHP_EOL;
} elseif (class_exists('libev\EventLoop', false)) {
    echo "\033[0m We can use LibEvLoop!!" . PHP_EOL;
} elseif (class_exists('EventBase', false)) {
    echo "\033[0m We can use ExtEventLoop!!" . PHP_EOL;
} 
else 
{
    echo "\033[0m We can use StreamSelectLoop!!" . PHP_EOL;
}

php-fpm.conf:

rlimit_files = 65536
rlimit_core = unlimited

操作系统限制

https://rtcamp.com/tutorials/linux/increase-open-files-limit/

引用自https://github.com/ratchetphp/Ratchet/issues/376


1
我有一个类似的经验,可能对某些人有帮助。当并发套接字连接数达到约700个时,我的服务器在一小时后停止响应。尝试了所有可能的解决方案后,我意识到我在apache中有一个ProxyPass,它将端口443(SSL)重定向到8080(我的套接字端口),换句话说从ws到wss,就像这里所讨论的那样。
最后,我将Apache prefork配置中的ServerLimit从500增加到1700,问题暂时得到了解决。(您还应该增加MaxRequestWorkers
这表明,如果您在Apache(或其他Web服务器)中使用ReverseProxy,则Apache会变得繁忙,因为它被卡在客户端和WebSocket服务器之间。
我不建议增加Apache配置作为最终解决方案,但我想提到考虑这一点作为潜在的瓶颈。也许最好的解决方案是直接运行wss。(如果有人知道一个好的教程,请在评论中提出)
我应该提到的第二件事是,有1024个连接的硬限制,在我的情况下是恰好1019个并发连接,可以通过安装ev或event来解决。我安装了ev,但由于安装过程中出现问题,它没有正常工作。我不得不重新安装它,问题得到了解决(使用pecl uninstall ev卸载)。我在php8.0上使用以下行进行安装:
apt install php8.0-dev
pecl install ev
sudo echo 'extension=ev.so' > /etc/php/8.0/mods-available/ev.ini

sudo phpenmod -v 8.0 ev

# Check module (it will echo ev if installation is successful):
php8.0 -i | grep -i ev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接