PHP-FPM pm.max_children设置依据

本文介绍如何通过调整PHP-FPM的配置参数解决进程不足的问题,包括如何计算合适的pm.max_children等值,确保服务器稳定运行。
原文:http://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/

Problem:

The following warning message appears in the logs:

[26-Jul-2012 09:49:59] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 8 idle, and 58 total children
[26-Jul-2012 09:50:00] WARNING: [pool www] server reached pm.max_children setting (50), consider raising it

It means that there are not enough PHP-FPM processes.

Solution:

We need to calculate and change these values based on the amount of memory on the system:

/etc/php-fpm.d/www.conf

pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

- the following command will help us to determine the memory used by each (PHP-FPM) child process:

ps -ylC php-fpm --sort:rss

The RSS column shows non-swapped physical memory usage by PHP-FPM processes in kilo Bytes.

On an average each PHP-FPM process took ~75MB of RAM on my machine.

Appropriate value for pm.max_children can be calculated as:

pm.max_children = Total RAM dedicated to the web server / Max child process size - in my case it was 85MB

The server has 8GB of RAM, so:

pm.max_children = 6144MB / 85MB = 72

I left some memory for the system to breath. You need to take into account any other services running on the machine while calculating memory usage.

I’ve changed the settings as follow:

pm.max_children = 70
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500

Please note that very high values does not mean necessarily anything good.

You can check an average memory usage by single PHP-FPM process with this handy command:

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

You can use the same steps above to calculate the value for MaxClients for Apche web server - just substitute thephp-fpm with httpd.

<think>我们面临的问题是在 `/etc/php-fpm.d/zabbix.conf` 配置文件中出现了未知配置项 `listen.acl_users`,导致 PHP-FPM 无法启动。根据错误日志,这个错误发生在配置文件的第7行。 ### 原因分析 1. **配置项错误**:`listen.acl_users` 可能是拼写错误,或者是该版本的 PHP-FPM 不支持这个配置项。 2. **版本兼容性**:不同版本的 PHP-FPM 支持的配置项有所不同。例如,在较早的 PHP 5.4 版本中,`listen.allowed_clients` 已被弃用[^4],而新版本可能使用不同的配置项。 3. **配置文件包含关系**:主配置文件 `/etc/php-fpm.conf` 包含 `/etc/php-fpm.d/` 目录下的所有配置文件,其中一个文件的错误会导致整个配置加载失败[^1]。 ### 解决方案 #### 步骤1:检查并修正配置项 打开配置文件: ```bash vim /etc/php-fpm.d/zabbix.conf ``` 找到第7行(根据错误提示),查看是否存在 `listen.acl_users` 配置项。考虑以下两种修正方式: **修正方案A(推荐)**: 将 `listen.acl_users` 替换为正确的配置项。根据 PHP-FPM 官方文档,控制访问权限的配置项通常是: - `listen.acl_users` 并不是标准配置项,正确的可能是 `listen.acl_groups` 或 `listen.acl_mask`。但更常见的是使用 `listen.allowed_clients`(在旧版本)或使用文件系统权限控制。 然而,在较新的 PHP 版本中(如 PHP 7.0+),访问控制通常通过 `listen.acl` 或 `listen.mode` 和 `listen.owner`/`listen.group` 来实现。如果您的 PHP 版本较旧(如 PHP 5.4),则可能不支持这些配置项。 如果您的本意是设置允许访问的客户端IP,那么正确的配置项是 `listen.allowed_clients`(但注意该配置项在 PHP 5.4 中已被弃用[^4])。例如: ```ini ; 允许的客户端IP(逗号分隔) listen.allowed_clients = 127.0.0.1 ``` **修正方案B(兼容旧版本)**: 如果您的 PHP 版本较旧(如 PHP 5.4),则建议完全移除该配置项,改为使用文件系统权限控制 Unix Socket 的访问。具体步骤: 1. 修改 `zabbix.conf` 中的 `listen` 指令,指定一个 Socket 文件: ```ini listen = /run/php-fpm/zabbix.sock ``` 2. 设置 Socket 文件的权限,使其仅允许特定用户/组访问: ```bash # 创建目录(如果不存在) mkdir -p /run/php-fpm chown nginx:zabbix /run/php-fpm/zabbix.sock # 根据实际用户修改 chmod 660 /run/php-fpm/zabbix.sock ``` 3. 在 Web 服务器(如 Nginx)配置中,设置 FastCGI 传递时使用该 Socket 并指定权限: ```nginx location ~ \.php$ { ... fastcgi_pass unix:/run/php-fpm/zabbix.sock; } ``` #### 步骤2:验证配置 在重启 PHP-FPM 之前,使用以下命令测试配置文件的正确性: ```bash php-fpm -t ``` 如果输出 `Configuration file is valid` 则表示配置正确。 #### 步骤3:重启 PHP-FPM ```bash systemctl restart php-fpm ``` #### 步骤4:检查服务状态 ```bash systemctl status php-fpm ``` ### 版本兼容性说明 - 如果您的 PHP 版本非常旧(如 PHP 5.4),建议升级到 PHP 7+ 版本,因为旧版本不仅缺少新特性,而且存在安全风险。 - 在升级 PHP 后,Zabbix 的配置可能需要调整,具体请参考 Zabbix 官方文档关于 PHP 要求的章节[^3]。 ### 相关问题 §§相关问题§§ 1. 如何查看当前系统中 PHP-FPM 的版本? 2. 在 Nginx 中如何配置 FastCGI 以使用 PHP-FPM 的 Unix Socket? 3. 升级 PHP 版本后,Zabbix 前端需要做哪些调整? </think>### 解决 PHP-FPM "unknown entry 'listen.acl_users'" 错误方案 #### 问题分析 根据错误日志和引用文档[^1][^2][^4],该问题通常由以下原因导致: 1. **配置项不兼容**:`listen.acl_users` 在旧版 PHP-FPM(如 PHP 5.4)中无效 2. **语法错误**:配置项拼写错误或位置不当 3. **版本差异**:新配置项在旧版 PHP 中不可用 #### 解决方案 ##### 步骤 1:修正配置项(推荐方案) 编辑 `/etc/php-fpm.d/zabbix.conf`: ```bash vim /etc/php-fpm.d/zabbix.conf ``` 修改错误配置项: ```diff - listen.acl_users = user1,user2 + ; 兼容替代方案(选择一种): + ; 方案1:使用标准配置项 + listen.owner = nginx + listen.group = nginx + + ; 方案2:使用旧版语法 + listen.mode = 0660 ``` ##### 步骤 2:替代访问控制方法 若需客户端访问控制,改用以下方式: ```ini ; 基于IP的访问控制(推荐) listen.allowed_clients = 127.0.0.1,192.168.1.0/24 ; 基于文件权限控制 listen.owner = apache listen.group = zabbix listen.mode = 0660 ``` ##### 步骤 3:验证并重启服务 ```bash # 测试配置文件 php-fpm -t # 完全停止进程(引用[2]方案) pkill -9 php-fpm # 重启服务 systemctl restart php-fpm # 验证状态 systemctl status php-fpm ``` #### 配置示例(兼容旧版 PHP) ```ini [zabbix] user = zabbix group = zabbix listen = /var/run/php-fpm/zabbix.sock listen.owner = nginx listen.group = zabbix listen.mode = 0660 ; 访问控制替代方案 listen.allowed_clients = 127.0.0.1 pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 ``` #### 关键说明 1. **版本兼容性**:`acl_users` 是 PHP 7.3+ 新增特性,旧版需用 `listen.mode` + 文件权限替代[^4] 2. **权限设置**:Socket 文件权限必须匹配 Web 服务器用户组 ```bash chown nginx:zabbix /var/run/php-fpm/zabbix.sock chmod 0660 /var/run/php-fpm/zabbix.sock ``` 3. **错误排查**:使用 `php-fpm -tt` 可显示详细配置错误位置[^2] #### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值