我有一个使用 nginx、php-fpm、postgresql 和 pgbouncer 的网站,它已经运行了一年多。昨天服务器没有响应,重启后它工作了 5 到 10 分钟,之后没有响应,并显示相同的错误消息:
2017/04/04 15:32:37 [错误] 2532#0: *31341 FastCGI 在 stderr 中发送:“PHP 消息:PHP 警告:pg_connect():无法连接到 PostgreSQL 服务器:无法连接到服务器:无法分配请求的地址服务器是否在主机“127.0.0.1”上运行并在端口 6432 上接受 TCP/IP 连接?位于 /usr/share/nginx/html/lib/postgresql.class.php 第 21 行
我甚至恢复到上一个工作配置,但情况仍然相同(当我启动 nginx 时,它工作了一两分钟,然后出现上述错误)。
我检查了 php-fpm 日志并遇到以下问题:
[2017 年 4 月 4 日 14:48:50] 警告:[pool www] 似乎很忙(您可能需要增加 pm.start_servers 或 pm.min/max_spare_servers),生成 8 个子进程,有 0 个空闲,总共 24 个子进程
和
[2017 年 4 月 4 日 14:48:59] 警告:[pool www] 服务器已达到 pm.max_children 设置 (50),请考虑提高该值
在 postgresql 日志中我发现了这一点:
提示:考虑增加配置参数“max_wal_size”。
到目前为止我已经改变了以下参数
在 php-fpm 中:
pm.max_childeren from 50 to 100
pm.start_servers from 5 to 10
pm-min_spare_servers from 5 to 10
pm-max_spare_servers from 35 to 100
在Postgresql中:
mac_wal_size from 1GB to 2GB
还是没有运气!我该怎么办?
答案1
这里有几个问题。所有问题都是由大量连接引起的。
您需要添加某种监控并检查收到的请求数。当您掌握一些数字后,您将能够正确调整所有与连接相关的设置:
- php-fpm
- 弹跳器
- PostgreSQL
- Linux操作系统
我找到了一个关于 pgbouncer 的好答案: https://dba.stackexchange.com/questions/59650/pgbouncer-works-great-but-occasionally-becomes-unavailable
我相信,这是解决您的问题的第二个缺失部分(第一个是监控和缺乏数字)。
简而言之 - 您现在获得的流量比以前多得多,并且以前的工作配置不足以处理它。