我希望得到有关可能导致以下情况的任何提示或想法。
该网站位于 Debian 服务器上,配备 nginx 1.6.2、php5 到 fpm。
对页面的 GET 请求应该会从服务器上的几个请求文件生成一个相当大的 ZIP 存档。这是一个资源要求很高的操作,大约需要 30 秒(假设)并消耗 ~500+MiB 的内存。
现在,如果客户端在该操作期间尝试打开另一个页面,PHP 的会话处理将对该页面的打开施加延迟,直到第一个 GET 请求完成。到目前为止,所有这些都在我的理解范围内。
但是:如果客户端(坚持)多次刷新浏览器(5-8 次),服务器将不会响应任何用户,而不仅仅是坚持的用户。这让我很烦,因为 nginx 配置设置为 2 worker_processes
,每个 1024 worker_connections
,这应该至少为我提供大约 1000 个连接,然后服务器就会崩溃。
Top 命令显示 CPU 负载很小。
请赐教。
答案1
看起来 PHP 的子节点已经用完了。对于你的情况,请尝试编辑:
/etc/php5/fpm/pool.d/www.conf
查找pm.max_children = 5
并将其更改为更高的值(10 或更大)
您还可以检查php_admin_value[memory_limit] = 32M
(每个孩子允许的最大内存消耗)
删除注释并将值更改为适合您设置的值。
答案2
答案3
我猜测是 CPU 耗尽了。你用过“top”来解决这个问题吗?
Nginx 允许你使用以下方式实施速率限制速率限制模块。有一个关于如何做到这一点的教程这里,但我认为它更多的是在资源层面而不是 IP 层面。此块应该限制请求和连接,这对您来说更合适 - 代码来自本网站。
http {
...
limit_conn_zone $binary_remote_addr zone=alpha:8m;
limit_req_zone $binary_remote_addr zone=delta:8m rate=30r/s;
...
server {
...
limit_conn alpha 5;
limit_req zone=delta burst=80 nodelay;
...
}
}