增加php-websocket的最大连接数


Increase php websocket maximum connections

我目前正在运行一台Debian 8机器,上面有PHP和Apache

在这台机器上,我安装了一个棘轮websocket服务器,尽管我最近在运行的网站上有1000多名并发用户。这导致了棘轮插座的问题,因为在1020个连接时,它似乎会自动拒绝所有新的连接。

我已经为debian本身增加了ulimit -n和排序,但我开始怀疑问题是在我的php默认配置中还是在我使用的棘轮websocket中。

任何关于我应该改变什么配置的想法都将不胜感激。

您只需要阅读部署中的官方文档部分:据说:

libev和libevent项目实现了高性能异步事件驱动的C库。PHP扩展ev和事件可以与这些库接口。他们允许应用程序透明地使用最佳内核级事件I/O方法(select、poll、epoll、kqueue或事件端口)正在运行的操作系统。

ev PHP扩展将libev C库捆绑在其源代码和不需要事先设置。如果您想使用事件PHP扩展,您需要首先安装libevent库及其头文件适用于您的操作系统。例如Debian/Ubuuntu:

-$sudo apt-get-install libevent libevent-dev

然后,您可以通过安装ev或事件扩展您喜欢的软件包管理器,或直接使用pecl:

-$sudo pecl安装ev

-$sudo pecl安装事件

无需进一步设置;如果这些扩展中的任何一个目前,Ratchet使用的事件I/O循环工具包自动利用它们,这将大大提高并发性。以下是链接:http://socketo.me/docs/deploy

确保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

我也有过类似的经历,可能会对某人有所帮助。一个小时后,当并发套接字连接数达到700左右时,我的服务器停止响应。在尝试了所有可能的解决方案后,我意识到我在apache中有一个ProxyPass,它将端口443(SSL)重定向到8080(我的套接字端口),换句话说,从ws到ws,就像这里讨论的那样。

最后,我将Apache prefork配置中的ServerLimit从500增加到1700,问题暂时得到了解决。(你也应该增加MaxRequestWorkers

这表明,如果您在Apache(或其他Web服务器)中使用ReverseProxy,Apache将在客户端和WebSocket服务器之间卡住时变得繁忙。

我不建议增加最终解决方案的Apache配置,但我想指出的是,这是一个潜在的瓶颈。也许最好的解决方案是直接运行wss。(我任何人都知道一个好的教程,请评论)

我应该提到的第二件事是,有1024个连接的硬限制,在我的情况下,这是恰好1019个并发连接,将通过安装ev或事件来解决。我安装了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