温馨提示×

ubuntu php-fpm怎样负载

小樊
36
2026-10-13 04:25:53
栏目: 编程语言

在 Ubuntu 上,PHP-FPM 本身的“负载”通常指两件事:

  1. PHP-FPM 进程如何分配资源(进程池负载)
  2. 多 PHP-FPM 实例 / 反向代理层如何做负载均衡(请求负载)

下面按常见场景给你讲清楚。


一、PHP-FPM 进程池层面的“负载”(最重要)

PHP-FPM 通过 pool 配置控制并发能力,文件通常在:

/etc/php/8.1/fpm/pool.d/www.conf

(版本号按你实际来,如 7.4 / 8.2)

关键参数

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

pm 模式说明

  • static:固定进程数(性能最好,但吃内存)
  • dynamic:根据负载动态增减(常用)
  • ondemand:请求来了才起进程(省内存,但慢)

如何算 max_children(经验公式)

max_children ≈ 可用内存 / 单个 php-fpm 进程内存

例如:

  • 服务器 4G 内存
  • 每个 PHP 进程 ~40MB
  • 建议:max_children = 80~100

查看单个进程内存:

ps aux | grep php-fpm

二、Nginx + PHP-FPM 的负载均衡(多后端)

1️⃣ 单个 Nginx + 多个 PHP-FPM 池(不同端口)

例如:

; /etc/php/8.1/fpm/pool.d/www1.conf
listen = 127.0.0.1:9001

; /etc/php/8.1/fpm/pool.d/www2.conf
listen = 127.0.0.1:9002

Nginx:

upstream php_backend {
    server 127.0.0.1:9001;
    server 127.0.0.1:9002;
}

location ~ \.php$ {
    fastcgi_pass php_backend;
}

2️⃣ 多台服务器(真正负载均衡)

upstream php_cluster {
    server 10.0.0.1:9000;
    server 10.0.0.2:9000;
    server 10.0.0.3:9000;
}

⚠️ 注意:

  • PHP-FPM 要监听 0.0.0.0 或内网 IP
  • 防火墙放行 9000
  • Session 要外置(Redis / DB)

三、CPU 多核利用(容易忽略)

PHP-FPM 天然多进程,一个请求一个进程:

  • CPU 核数 = 8
  • pm.max_children 至少 ≥ 8
  • 高并发可 2~4 倍核数

查看 CPU:

nproc

四、监控 PHP-FPM 负载

开启 status 页

pm.status_path = /status

Nginx:

location = /status {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    include fastcgi_params;
}

访问:

http://your_ip/status

能看到:

  • active processes
  • idle processes
  • max children reached(很重要)

五、常见优化建议

✅ 使用 Unix Socket(比 TCP 快)

listen = /run/php/php8.1-fpm.sock

✅ 合理设置 request_terminate_timeout

✅ 用 OPcache

✅ 高负载时:

  • 减少 pm.max_requests
  • 拆分 pool(admin / api / web)

六、一句话总结

PHP-FPM 的“负载”= 进程池配置 + Nginx 分发 + 资源监控

如果你愿意,可以告诉我:

  • Ubuntu 版本
  • PHP 版本
  • 内存 / CPU
  • 并发量(QPS)

我可以直接帮你算一套 生产级 php-fpm 配置。

0 踩