FastCGI 进程管理器 (FPM)

目录

FPM (FastCGI Process Manager) 是一个主要的 PHP FastCGI 实现,包含一些对高负载网站(大部分)有用的特性。

这些特性包括

  • 优雅停止/启动的先进进程管理;

  • 池,可以启动具有不同 uid/gid/chroot/环境、监听不同端口以及使用不同 php.ini 的工作进程(取代 safe_mode);

  • 可配置的标准输出和标准错误日志;

  • 在意外 opcode 缓存销毁的情况下进行紧急重启;

  • 加速上传支持;

  • "慢日志" - 记录执行异常缓慢的脚本(不仅仅是脚本名称,还包括它们的 PHP 回溯信息,使用 ptrace 和类似的工具来读取远程进程的 execute_data);

  • fastcgi_finish_request() - 特殊函数,用于完成请求并刷新所有数据,同时继续执行一些耗时的操作(视频转换、统计处理等);

  • 动态/按需/静态子进程生成;

  • 基本和扩展状态信息(类似于 Apache mod_status),支持各种格式,如 json、xml 和 openmetrics;

  • 基于 php.ini 的配置文件。

添加注释

用户贡献的注释 11 个注释

ganlvtech at qq dot com
6 年前
php-fpm 在 Windows 上不可用,但您可以使用 IIS 或 Apache 作为 "FastCGI 进程管理器"。

如果您必须使用 Nginx,这里有一个解决方案。Nginx 提供了一个负载均衡模块。我们可以将请求分发到不同的 php-cgi.exe 进程。

<https://nginxserver.cn/en/docs/http/load_balancing.html>
<https://nginxserver.cn/en/docs/http/ngx_http_upstream_module.html>

这是原始的 nginx 配置。
```
location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
```

您可以用以下内容替换它
```
upstream php {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
}

location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass php;
fastcgi_index index.php;
include fastcgi.conf;
}
```

注意!!

php-cgi.exe 进程会在处理几个请求后死亡,因此您必须手动重启 php-cgi.exe 以保持进程监听端口。

不要在生产环境中使用此解决方案!!
kokushibyou at gmail dot com
11 年前
PHP-FPM 很快 - 但在代码库存储在 NFS 上时要谨慎使用 - 在平均负载下,您的 NFS 服务器将承受很大的压力。我还没有找到此错误的解决方法:https://bugs.php.net/bug.php?id=52312
info at f1-outsourcing dot eu
5 年前
看起来 php-fpm 守护进程无法使用它运行的组。

https://bugs.php.net/bug.php?id=77837
joel k
13 年前
fpm 进程支持 USER2 信号,用于重新加载配置文件。

kill -USR2 [pid]

应该可以解决问题。
dreamcat4 at gmail dot com
10 年前
无法正常工作?启用日志记录!

php-fpm.log 文件是查找错误和解决问题的绝佳位置。但请确保为您的特定工作进程池启用日志记录。否则您将看不到任何内容!

示例

要为默认的 [www] 工作进程池启用错误日志记录,请在 php-fpm.conf 文件的 [www] 部分添加以下行

[www]
catch_workers_output = yes
robin at robinwinslow dot co dot uk
13 年前
初始化脚本设置
===

您可能希望为您的新 php-fpm 创建一个初始化脚本。幸运的是,PHP 5.3.3 为您提供了一个,您应该将其复制到您的初始化目录并更改权限

$ cp <php-5.3.3-source-dir>/sapi/fpm/init.d.php-fpm.in /etc/init.d/php-fpm
$ chmod 755 /etc/init.d/php-fpm

它需要一些设置。首先,确保您的 php-fpm.conf 文件已设置为在 php-fpm 启动时创建一个 PID 文件。例如
----
pid = /var/run/php-fpm.pid
----
(还要确保您的 php-fpm 用户有权创建此文件)。

现在打开您的新初始化脚本(/etc/init.d/php-fpm)并将顶部的变量设置为它们的相关值。例如
---
prefix=
exec_prefix=
php_fpm_BIN=/sbin/php-fpm
php_fpm_CONF=/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid
---

您的初始化脚本现在已准备就绪。您现在应该能够启动、停止和重新加载 php-fpm

$ /etc/init.d/php-fpm start
$ /etc/init.d/php-fpm stop
$ /etc/init.d/php-fpm reload

您可能希望做的最后一件事是将您的新 php-fpm 初始化脚本添加到系统启动。例如在 CentOS 中

$ /sbin/chkconfig php-fpm on

===========

免责声明:虽然我刚刚在自己的服务器上完成了此操作(大约 20 分钟前),但我在这里写的所有内容都是凭空想象出来的,因此可能不完全正确。另外,请考虑系统设置的差异。假设您对正在做的事情有一定的了解。
user at NOSPAM dot example dot com
6 年前
需要注意的是,FPM 并非使用 Windows 二进制文件构建。您在网上找到的许多指南都依赖于 php-cgi.exe。不幸的是,它们称其为 FPM,但这是错误的!

与 Windows 二进制文件捆绑在一起的可执行文件 php-cgi.exe 是一个 FastCGI 接口,但它 *不是* FPM (Fastcgi Process Manager)。php-cgi.exe 不支持多线程或并发请求,也不支持任何 FPM 配置选项。

我收集到的关于 FPM 不可用性的唯一可靠信息是一个错误报告,解释了 FPM 是围绕 fork() 构建的,而 fork() 在 Windows 上不可用(https://bugs.php.net/bug.php?id=62447)。
ikrabbe dot ask at gmail dot com
6 年前
我对 php-fpm 处理请求的方式很不满意。
在 CGI 的 RFC 中甚至没有 SCRIPT_FILENAME,而那是我发现的唯一处理请求的标准。

实际上,您使用 PATH_TRANSLATED 所做的事情应该转换为路径,这被媒体维基破坏了,因为它们使用 PATH_INFO 来查找资源,而不是某个脚本。

在原始的 CGI 上下文中,PATH_INFO 被传递给 CGI 二进制文件以指定某个资源参数。因此实际上

SCRIPT_NAME ~ argv0
PATH_INFO ~ argv1

在命令上下文中。

结论:我们应该重写 php-fpm 以遵守 rfc3875 CGI 标准。
使 SCRIPT_NAME 指向 /something.php,必须转换为

CWD/something.php

CWD 是 php-fpm 启动(或配置为更改为)的工作目录。

在 chroot 情况下,CWD = ""。

在任何情况下,SCRIPT_NAME php 脚本都可以通过 ./SCRIPT_NAME 从 CWD 找到。因此,未记录的非标准化 SCRIPT_FILENAME 应该消失!它违反了 CGI 标准。
&#34;atesin&#34; at the free google mail service
10 个月前
针对 "ikrabbe dot ask at gmail dot com" 关于 SCRIPT_NAME 和 PATH_INFO 为空的问题,这可能与之相关...

在 Debian(实际上是树莓派)中使用 nginx 配置 php-fpm 时,.conf 文件中的一个注释行引起了我的注意

http://trac.nginx.org/nginx/ticket/321中大约 10 年前报告了一个 "功能"(更像是 bug)... 其中 "try_files" 会重置 $fastcgi_script_name 和 $fastcgi_path_info 的内容... 这是论坛中用户 "zakaria" 提到的一个解决方法

<?php /* 并非实际的 php 代码,而是 nginx .conf 文件 */
location ~ [^/]\.php(/|$)
{
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
# 在 try_files 清除 $fastcgi_path_info 之前保存它
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
try_files $fastcgi_script_name =404;

fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include
fastcgi_params;
}
?>
jpmkn.iki.fi
1 年前
@ ikrabbe 你可能需要看一下 mod_rewrite 来解决 cgi 和 cli php 之间的环境变量差异!
&#34;atesin&#34; 在免费的谷歌邮箱服务
10 个月前
回复“dreamcat4 在 gmail 点 com”关于在 php-fpm 中启用日志

我 *讨厌* 盲目行动,所以启用日志通常是我做的第一件事...

通过 dreamcat4 的建议,日志被启用,但与 php 进程日志混合在一起... 相反,这样做并从 [www] worker 池中将其日志隔离到自己的文件中,这些指令对我在“www”worker .ini 文件中有效(你需要先设置目录和权限)

php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
To Top