PHP-FPM(PHP FastCGI Process Manager)的配置文件通常位于特定的路径,具体位置可能因操作系统和 PHP 版本的不同而有所差异。
1. 配置文件位置
1.1 主配置文件
-
Debian/Ubuntu:
- 主配置文件:
/etc/php/7.x/fpm/php-fpm.conf
- 池配置文件:
/etc/php/7.x/fpm/pool.d/
目录下的.conf
文件(例如www.conf
)
- 主配置文件:
-
CentOS/RHEL:
- 主配置文件:
/etc/php-fpm.conf
- 池配置文件:
/etc/php-fpm.d/
目录下的.conf
文件(例如www.conf
)
- 主配置文件:
-
macOS(Homebrew安装):
- 主配置文件:
/usr/local/etc/php/7.x/php-fpm.conf
- 池配置文件:
/usr/local/etc/php/7.x/php-fpm.d/
目录下的.conf
文件
- 主配置文件:
1.2 示例配置文件
-
主配置文件 (
php-fpm.conf
):[global] pid = /run/php/php7.4-fpm.pid error_log = /var/log/php7.4-fpm.log log_level = notice [www] listen = 127.0.0.1:9000 user = www-data group = www-data pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35
-
池配置文件 (
www.conf
):[www] listen = 127.0.0.1:9000 user = www-data group = www-data pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35
2. 使用场景
2.1 高并发网站
- 大型网站:对于高并发访问的大型网站,PHP-FPM 可以有效管理 PHP 进程,提高系统的性能和稳定性。
- API 服务:对于提供 RESTful API 服务的应用,PHP-FPM 可以快速处理大量请求,确保服务的高可用性。
2.2 动态内容生成
- Web 应用:对于需要动态生成内容的 Web 应用,如 CMS、论坛、电子商务平台等,PHP-FPM 可以高效处理 PHP 脚本,生成动态页面。
- 微服务架构:在微服务架构中,PHP-FPM 可以作为后端服务的一部分,处理业务逻辑和数据处理。
2.3 开发和测试环境
- 开发环境:在开发环境中,PHP-FPM 可以快速启动和停止,方便开发者进行调试和测试。
- 持续集成:在持续集成环境中,PHP-FPM 可以自动化启动和配置,确保测试环境的一致性。
3. 底层原理
3.1 FastCGI 协议
FastCGI 协议定义了 Web 服务器和后端应用程序之间的通信方式。协议的核心思想是通过持久连接和多路复用来提高性能。
3.2 PHP-FPM 架构
- 主进程:PHP-FPM 的主进程负责管理和监控子进程,处理配置文件和日志。
- 子进程:PHP-FPM 的子进程负责处理具体的 PHP 请求。主进程根据负载情况动态调整子进程的数量。
3.3 工作流程
- 客户端请求:
- 客户端通过浏览器向 Nginx 发送HTTP请求。
- Nginx 接收请求:
- Nginx 接收到请求后,根据请求的URL和配置文件确定请求类型。
- 静态内容处理:
- 如果请求的是静态内容(如 HTML、CSS、JavaScript 文件),Nginx 直接读取文件并返回响应。
- 动态内容处理:
- 如果请求的是动态内容(如 PHP 文件),Nginx 将请求转发给 PHP-FPM 处理。
- 请求转发:
- Nginx 使用
fastcgi_pass
指令指定的地址,将请求数据通过 FastCGI 协议发送给 PHP-FPM。请求数据包括HTTP头、请求体等。
- Nginx 使用
- 设置环境变量:
- Nginx 使用
fastcgi_param
指令设置传递给 PHP-FPM 的环境变量。其中,fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
设置了脚本文件的完整路径。
- Nginx 使用
- 请求处理:
- PHP-FPM 从进程池中选择一个可用的子进程,将请求传递给该子进程。
- 子进程根据
SCRIPT_FILENAME
环境变量找到并执行相应的 PHP 脚本,生成响应内容。
- 响应返回:
- 子进程将响应内容通过 PHP-FPM 返回给 Nginx。
- Nginx 将响应内容返回给客户端。
4. 配置文件详解
4.1 主配置文件 (php-fpm.conf
)
-
全局设置:
pid
:指定 PHP-FPM 的 PID 文件路径。error_log
:指定错误日志文件路径。log_level
:设置日志级别,如notice
、warning
等。
-
池配置:
include
:包含其他配置文件,通常指向池配置文件目录。include=/etc/php/7.x/fpm/pool.d/*.conf
4.2 池配置文件 (www.conf
)
-
监听地址:
listen
:指定 PHP-FPM 监听的地址,可以是 IP 地址和端口号,也可以是 Unix 域套接字。listen = 127.0.0.1:9000
或listen = /run/php/php7.4-fpm.sock
-
用户和组:
user
和group
:指定运行 PHP-FPM 子进程的用户和组。user = www-data
group = www-data
-
进程管理:
pm
:指定进程管理方式,如dynamic
、static
、ondemand
。pm.max_children
:最大子进程数。pm.start_servers
:启动时的子进程数。pm.min_spare_servers
:最小空闲子进程数。pm.max_spare_servers
:最大空闲子进程数。
-
请求限制:
request_terminate_timeout
:请求超时时间。request_slowlog_timeout
:慢请求日志超时时间。slowlog
:慢请求日志文件路径。
-
其他设置:
catch_workers_output
:是否捕获子进程的输出。php_admin_value
和php_admin_flag
:设置 PHP 配置项。
5. 示例
5.1 Nginx 配置
假设你使用 Nginx 作为 Web 服务器,并配置 PHP-FPM 来处理 PHP 请求。
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params; # 包含默认的 FastCGI 参数
fastcgi_pass 127.0.0.1:9000; # 指定 PHP-FPM 服务器的地址
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 设置脚本文件路径
# 自定义环境变量
fastcgi_param MY_CUSTOM_VAR "my_value";
}
}
5.2 PHP-FPM 配置
PHP-FPM 的配置文件通常位于 /etc/php/7.4/fpm/php-fpm.conf
和 /etc/php/7.4/fpm/pool.d/www.conf
。
主配置文件 (/etc/php/7.4/fpm/php-fpm.conf
):
[global]
pid = /run/php/php7.4-fpm.pid
error_log = /var/log/php7.4-fpm.log
log_level = notice
include=/etc/php/7.4/fpm/pool.d/*.conf
池配置文件 (/etc/php/7.4/fpm/pool.d/www.conf
):
[www]
listen = 127.0.0.1:9000
user = www-data
group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
request_terminate_timeout = 30s
request_slowlog_timeout = 10s
slowlog = /var/log/php7.4-fpm-slow.log
catch_workers_output = yes
6. 总结
PHP-FPM 的配置文件通常位于特定的路径,具体位置因操作系统和 PHP 版本而异。通过合理配置 PHP-FPM,可以提高系统的性能和稳定性,适用于高并发网站、动态内容生成、开发和测试环境等多种场景。