Php 如何防止web套接字DDOS攻击?

Php 如何防止web套接字DDOS攻击?,php,nginx,ratchet,socketrocket,Php,Nginx,Ratchet,Socketrocket,我刚刚从我的计算机执行了一次基本DDOS: websocket-bench -a 2500 -c 200 wss://s.example.com 让我彻底失望的是,它使我的服务器崩溃了!WS通过连接到我的nginx代理来工作: location / { proxy_pass http://sock; proxy_http_version 1.1; proxy_set_header Upgrade $http_upg

我刚刚从我的计算机执行了一次基本DDOS:

websocket-bench -a 2500 -c 200 wss://s.example.com
让我彻底失望的是,它使我的服务器崩溃了!WS通过连接到我的nginx代理来工作:

    location / {
            proxy_pass http://sock;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header        X-Real-IP               $remote_addr;
            proxy_read_timeout 60;
    }

    upstream sock {
            server 127.0.0.1:1203 fail_timeout=1s;
    }
并在服务器上的本地端口
1203
is。ratchet的设置是允许任何连接,第一个
onMessage
执行身份验证,如果无效,则关闭连接

我还尝试过通过在第一个连接上传递头进行身份验证,如果无效,套接字将关闭,但这一点都没有帮助,nginx仍然达到100%的资源,然后崩溃

我应该分析什么来防止这些碰撞


将上游更改为另一个封闭端口(即禁用)时,服务器仍会崩溃。

请更改身份验证逻辑以便Nginx处理它,或者在Nginx内实现以控制接受并传递到上游服务器的连接数。

不幸的是,限制似乎不会影响任何事情。我真不敢相信是nginx让我的服务器崩溃了!我担心这可能是我的ratchet php脚本。嗯,好的。如果完全删除上游块并将proxypass指令更改为
proxy\u pass,会发生什么情况http://127.0.0.1:1203
?您通常使用上游指令定义一组服务器,如果ratchet实例失败,则
fail\u timeout=1s
将使Nginx将服务器标记为关闭10秒。通常,它会将请求路由到上游块中的其他服务器,但您没有任何请求。就我个人而言,虽然我会推荐Nchan websocket模块用于Nginx,但效果不错。你无法通过“调整”一些配置变量或安装预防DDOS的程序来防止DDOS。你的问题不是ddos,而是一旦崩溃,服务就无法恢复。这就是为什么我们使用
supervisord
。另外,使用nodejs而不是ratchet将产生显著的收益。是的,但我的问题是DDOS是在不应该的时候引起的。我的上传速度为6mb/s的网络不应该能够通过请求使千兆位服务器崩溃——这意味着我的配置有问题。如果现在有10000人访问我的http web服务器,它只会降低服务器的速度,而不会使服务器崩溃。对于nginx和node,10k不会是问题。您可以使用Cloudflare之类的服务来防止它。如果需要连接10000人,可以使用多个nginx实例(DNS指向处理域的多个IP地址),每个nginx负载平衡到处理web套接字的多个ratchet/nodejs实例。这就是缩放的方式。