zoukankan      html  css  js  c++  java
  • php-fpm 优化

    首先先理解一下 CGI 、FASTCGI 、PHP-FPM的概念

    CGI 是用来接收HTTP请求的一个程序,例如[127.0.0.1/index.php?c=article&id=11,这个请求通过apahce、nginx等等过来,然后http服务器发送给php-cgi(就是php用来接收http的程序),这个玩意儿每次新建一个进程的时候都要读取和加载php.ini的一堆参数,然后才能开始接收请求,比较慢。

    FASTCGI的工作原理是首先启动一个master,这个master加载了所有的配置信息等等,master会新建很多个worker,然后每次有请求的时候master负责把请求分配给相应的worker,这样避免了重复加载和启动,就是一个提交cgi程序效能的东西,fastcgi这个东西只是一个协议(你可以理解为是一个没实现的想法),并不是一个程序。

    PHP-FPM就是实现这个想法的程序,CGI很蠢,不会管理进程,而PHP-FPM会根据实际情况,创建worker或者关掉worker进程,保持一定量的worker,请求多了,worker就多了,请求少了,worker就会被关掉一部分,你可以理解为它是一个高效CGI的进程管理器。

    ——————————————————————————————————————————————————————————————————————————————————————————————————

    修改 /usr/local/php/etc 目录下的php-fpm.conf文件

    手动启动 php-fpm
    [root@user]#/usr/local/php/sbin
    [root@user]#./php-fpm

    1、php-fpm优化参数介绍
    他们分别是:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。

    pm:表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。
    在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件的说明。

    ———————————————————————————————————

    pm = dynamic
    pm.max_children:静态方式下开启的php-fpm进程数量
    pm.start_servers:动态方式下的起始php-fpm进程数量
    pm.min_spare_servers:动态方式下的最小php-fpm进程数
    pm.max_spare_servers:动态方式下的最大php-fpm进程数量

    ———————————————————————————————————

    区别:
    如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。
    如果dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。
    系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程,
    然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数

    ——————————————————————————————————————————————————————————————————————

    php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout

    像这种全php的网站,每个连接都需要apache+php-fpm协同运作。即便php-fpm中的request_terminate_timeout时间设置很长,apache中的timeout时间设置略短,只要apache的timeout到了,php-fpm照样在后面杀进程……

    如果网站的访问者比较多,php-fpm的child是被许多访问者共用的,杀一个child,就有可能导致几个用户同时http 503 Service Unavailable。所以,我的建议是——php-fpm中的request_terminate_timeout最好不要设置,只给apache一个timeout就够了。

    • php-fpm设置request_terminate_timeout后,php.ini中的max_execution_time和max_input_time都会失效,以php-fpm中的设置为准;
    • apache+mod_php在timeout后,只会在日志中记录一下,仅此而已。php-fpm中的request_terminate_timeout超时之后,日志中记录http 503的同时,最要命的,它还会直接杀死造成这个http 503的php-fpm child,并生成新的child。

    ——————————————————————————————————————————————————————————————————————
    我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。
    计算的方式如下:
    如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没 有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有 时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那 么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越 高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉 而出现502 Bad gateway这个错误。
    而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多 了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php- cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI 所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很 累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

    —————————————————————————————————————————————————————————————————————————————————————————————————————

    php-fpm.conf 示例文件

    [global]
    pid = /usr/local/php/var/run/php-fpm.pid
    error_log = /usr/local/php/var/log/php-fpm.log
    log_level = notice

    [www]
    listen = /tmp/php-cgi.sock
    listen.backlog = 2048
    listen.allowed_clients = 127.0.0.1
    listen.owner = www
    listen.group = www
    listen.mode = 0666
    user = www
    group = www
    pm = dynamic
    pm.max_children = 50
    pm.start_servers = 25
    pm.min_spare_servers = 5
    pm.max_spare_servers = 50
    request_terminate_timeout = 900
    request_slowlog_timeout = 100
    slowlog = var/log/slow.log

    文章来源:微笔记_博客

  • 相关阅读:
    调用Config.ini类
    winform用AForge拍照功能
    winform导出csv
    winform导出excel
    net里面using的使用
    DBNULL与null的区别
    mui app在线更新
    redux-thunk初步使用
    初步使用Web Notification 实现浏览器消息通知
    ios唤起键盘后,页面不收回导致元素错位的问题.(譬如固定在底部的自定义键盘等)
  • 原文地址:https://www.cnblogs.com/www-vnote-net/p/5807456.html
Copyright © 2011-2022 走看看