PHP-FPM 详解

QQ20180605-105653@2x.png

PHP-FPM

FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。

它的功能包括:

  • 支持平滑停止/启动的高级进程管理功能;
  • 可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置);
  • stdout 和 stderr 日志记录;
  • 在发生意外情况的时候能够重新启动并缓存被破坏的 opcode;
  • 文件上传优化支持;
  • "慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢;
  • fastcgi_finish_request() - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等);
  • 动态/静态子进程产生;
  • 基本 SAPI 运行状态信息(类似Apache的 mod_status);
  • 基于 php.ini 的配置文件。

全局配置选项

  • pid

pid文件的位置

  • error_log

错误日志的位置

  • log_level

错误的级别 alert 、error、warning、notice、debug、默认是notice

  • syslog.facility

设置何种程序记录消息 默认daemon

  • syslog.ident

为每条消息 添加前缀

  • emergency_restart_interval

如果子进程在 emergency_restart_interval 设定的时间内收到该参数设定次数的 SIGSEGV 或者 SIGBUS退出信息号,则FPM会重新启动。0 表示“关闭该功能”。默认值:0(关闭)

  • process_control_timeout

设置子进程接受主进程复用信号的超时时间 可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:s(秒)。默认值:0(关闭)。

  • process_max

fork的最大的fpm的进程数

  • process.priority

设置master进程的nice(2) 优先级

  • daemonize

设置php-fpm后台运行。默认是yes

  • rlimit_core

设置master 进程打开的core最大的尺寸

  • events.mechaism

设置fpm的使用的事件机制 select、pool、epoll、kqueue (*BSD)、port (Solaris )

  • systemd_interval

使用systemd集成的fpm时,设置间歇秒数

运行时配置

  • listen

设置接受的fastcgi请求的地址可用格式为:'ip:port','port','/path/to/unix/socket'。每个进程池都需要设置

  • listen.backlog

设置backlog的最大值

  • listen.allowed_clients

设置允许链接到fastcgi的ip地址

  • listen.owner listen.group listen.mode

设置权限

  • user group

fpm运行的Unix用户 必须设置的

  • pm

设置进程管理器如何管理子进程

    • static 子进程是固定的 = pm.max_children
    • ondemand 进程在有需求时才产生
    • dynamic  子进程的数量在下面配置的基础上动态设置 pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers
    • pm.max_children

    pm设置为staic时。表示创建的子进程的数量。

    pm为dynamic时,表示最大可创建的进程数

    • pm.start_servers

    设置启动时创建的子进程的数目。仅在 pm 设置为 dynamic 时使用 。就是初始化创建的进程数

    • pm.min_spare_servers

    设置空闲进程的最大数目

    • pm.process_idle_timeout

    秒。多久之后结束空闲进程

    • pm.max_requests

    设置每个子进程重生之前的服务的请求数。

    • pm.status_path

    fpm状态的页面的地址

    • ping.path

    fpm监控页面的ping的地址

    • ping.resource

    用于定于ping请求的返回响应 默认是pong

    • request_terminate_timeout

    设置单个请求的超时中止时间。

    • request_slowlog_timeout

    当一个请求该设置的超时时间后,就会将对应的 PHP 调用堆栈信息完整写入到慢日志中

    • slowlog

    慢请求的记录日志

    • rlimit_files

    设置打开文件描述符的限制

    • access.log

    访问日志

    • access.format

    acces log的格式

    优化

    内核调优

    • 调整linux内核打开文件的数量。
    echo `ulimit -HSn 65536` >> /etc/profile
    echo `ulimit -HSn 65536` >> /etc/rc.local
    source /etc/profile 

    PHP-FPM配置调优

    • 进程数调整

    pm.max_children = 300; 静态方式下开启的php-fpm进程数量   

    pm.start_servers = 20; 动态方式下的起始php-fpm进程数量   

    pm.min_spare_servers = 5; 动态方式下的最小php-fpm进程数量   

    pm.max_spare_servers = 35; 动态方式下的最大php-fpm进程数量

    request_slowlog_timeout = 2; 开启慢日志
    slowlog = log/$pool.log.slow; 慢日志路径

    rlimit_files = 1024; 增加php-fpm打开文件描述符的限制

    一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右 。

    用内存/20 就大概算出最大的进程数。

    一般初始化的进程有一个类似的公式

    start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) / 2;

    如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误

    • 最大请求数

    最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。

    这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。

    ​ pm.max_requests = 10240

    • 最长执行时间

    最大执行时间在php.ini和php-fpm.conf里都可以配置,配置项分别为max_execution_time和request_terminate_timeout。

    添加新评论