php-fpm参数优化让你的php-fpm(php5.3+)网站跑得更快

  1. /usr/local/php/etc/php-fpm.conf
  2. [global]
  3. pid = /usr/local/php/var/run/php-fpm.pid
  4. error_log = /usr/local/php/var/log/php-fpm.log
  5. log_level = notice
  6. [www]
  7. listen = /tmp/php-cgi.sock
  8. listen.backlog = -1
  9. listen.allowed_clients = 127.0.0.1
  10. listen.owner = www
  11. listen.group = www
  12. listen.mode = 0666
  13. user = www
  14. group = www
  15. pm = dynamic
  16. pm.max_children = 24
  17. pm.start_servers = 16
  18. pm.min_spare_servers = 12
  19. pm.max_spare_servers = 24
  20. request_terminate_timeout = 100
  21. request_slowlog_timeout = 0
  22. slowlog = var/log/slow.log

从php5.3以后php自带了php-fpm不是和php5.2一样以插件的方式存在了,这给我们带来一个好处502没有那么容易出现了,坛子里用linux的绝大多数应该还是在用小军的lnmp的那个包,但是配置优化却是不尽人意.

php-fpm的配置文件位置:

/usr/local/php/etc/php-fpm.conf

pid = run/php-fpm.pid

pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启:

error_log = log/php-fpm.log

错误日志,默认在安装目录中的var/log/php-fpm.log

log_level = notice

错误级别. 可用级别为:alert(必须立即处理),error(错误情况),warning(警告情况),notice(一般重要信息),debug(调试信息). 默认:notice.

emergency_restart_threshold = 60

emergency_restart_interval = 60s

表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启,这两个选项一般保持默认值.

process_control_timeout = 0

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

daemonize = yes

后台执行fpm,默认值为yes,如果为了调试可以改为no.

在FPM中,可以使用不同的设置来运行多个进程池,这些设置可以针对每个进程池单独设置.

listen = 127.0.0.1:9000

fpm监听端口,即nginx中php处理的地址,一般默认值即可.

可用格式为:‘ip:port’, ‘port’, ‘/path/to/unix/socket’. 每个进程池都需要设置.

listen.backlog = -1

backlog数,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:

listen.allowed_clients = 127.0.0.1

允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。

每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接

  1. listen.owner = www
  2. listen.group = www
  3. listen.mode = 0666

unix socket设置选项,如果使用tcp方式访问,这里注释即可.

user = www

group = www

启动进程的帐户和组

pm = dynamic

pm表示使用那种方式,有两个值可以选择,就是static(静态模式)或者dynamic(动态模式5.2的时候叫apache-like但是不好使)

如果选择static,则由pm.max_children指定固定的子进程数。

如果选择dynamic,则由下开参数决定:

pm.max_children,子进程最大数

pm.start_servers,启动时的进程数

pm.min_spare_servers,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程

pm.max_spare_servers,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理

对于专用服务器,pm可以设置为static。

pm.max_requests = 1000

设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 ’0′ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.

pm.status_path = /status

FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none.

ping.path = /ping

FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。

ping.response = pong

用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.

request_terminate_timeout = 0

设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中止运行的脚本有用. 设置为 ’0′ 表示 ‘Off’.

当经常出现502错误时可以尝试更改此选项。

request_slowlog_timeout = 10s

当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 ’0′ 表示 ‘Off’

slowlog = log/$pool.log.slow

慢请求的记录日志,配合request_slowlog_timeout使用

rlimit_files = 1024

设置文件打开描述符的rlimit限制. 默认值: 系统定义值

系统默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。

rlimit_core = 0

设置核心rlimit最大限制值. 可用值: ‘unlimited’ 、0或者正整数. 默认值: 系统定义值.

chroot =

启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.

chdir =

设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)

catch_workers_output = yes

重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空

下面已我的php配置例子:

  1. [global]pid = /usr/local/php/var/run/php-fpm.pid
  2. error_log = /home/wwwlogs/php-fpm.log
  3. log_level = notice
  4. rlimit_files = 65535
  5. rlimit_core = 0
  6. [www]
  7. listen = /tmp/php-cgi.sock

user = nobody nginx, php-fpm进程的权限不能以网站所有权运行安全有问题

group = nobody nginx, php-fpm进程的权限不能以网站所有权运行安全有问题

pm = dynamic

pm.max_children = 36 静态模式开启进程数

pm.start_servers = 9 动态模式默认开启进程 数

pm.min_spare_servers = 8 动态模式默认最低保留进程 数

pm.max_spare_servers = 36 动态模式默认最高 进程数具体通过netstat -napo |grep "php-fpm" | wc -l和系统负载确定

pm.max_requests = 4096 进程执行xxx后重启释放内存避免内存泄漏

request_terminate_timeout = 100 进程超时时间

request_slowlog_timeout = 3s 记录大于3秒的php执行命令

slowlog = /home/wwwlogs/php-fpm.log.slow

rlimit_files = 65535 这个值一定要改默认的太小不改日志会有错误但是要和全局文件数相同具体查看ulimit -n系统全局设置

rlimit_core = 0

php-fpm.conf有两个至关重要的参数:

一个是”max_children”,

另一个是”request_terminate_timeout”

我的两个设置的值一个是”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这个错误。

以上是网上找的,原来我的老是出现 504 也不知道什么原因反正重启一次得等待老久才能正常打开 后来搜索了下说把这个配置下

希望对于各位有帮助,老鸟们多多见谅别喷我,我才刚开始用这个 所以有啥不对的别喷我,我只是想对那些新手说下,还有论坛缺少这些帖子 ,所以我就发来分享给大家

附上数据库 PHP配置http://www.wdlinux.cn/bbs/thread-2838-1-2.html

本人的是独立服务器E5200 2G内存,日IP3W以内。原来刚弄得时候基本上一天挂好几次。自己也没有用过LINUX原来只是用的WIN 没有仔细配置过,这次换WD很惆怅 很想换成别的,但是对于咱们菜鸟来说,那些代码 更愁人。所以还是坚持,自己一遍遍的设置,终于弄得差不多了。 对于论坛来说 还是别用LAMP了 用LNMP 省很多内存。

我的配置不是说就是对你有用但是 你可以看着修改、。

数据库 配置文件

最大连接数max_connections 5000

连接时间wait_timeout 5

缓冲key_buffer_size 256M

查询缓存query_cache_size 16M

表缓存table_open_cache 512

临时表大小tmp_table_size 6M

  1. key_buffer_size = 256M
  2. max_allowed_packet = 1M
  3. table_open_cache = 512
  4. sort_buffer_size = 1M
  5. read_buffer_size = 1M
  6. read_rnd_buffer_size = 4M
  7. myisam_sort_buffer_size = 64M
  8. thread_cache_size = 8
  9. query_cache_size= 16M
  10. thread_concurrency = 8
  11. max_connections = 5000
  12. wait_timeout = 5
  13. interactive_timeout = 5
  14. max_connect_errors = 100
  15. long_query_time = 1
  16. tmp_table_size = 6M
  17. #log-bin=mysql-bin
  18. #binlog_format=mixed
  19. #server-id = 1
  20. [mysqldump]
  21. quick
  22. max_allowed_packet = 16M
  23. [mysql]
  24. no-auto-rehash
  25. [myisamchk]
  26. key_buffer_size = 128M
  27. sort_buffer_size = 128M
  28. read_buffer = 2M
  29. write_buffer = 2M

其实这些具体也没有明白到底是啥意思,就是如果256那里小点会出来很多碎片,论坛优化那里 一个小时就好几百MB,所以弄得大了点、

PHP配置:

使用内存量 memory_limit 128M

POST最大字节数 post_max_size 8M

允许最大上传文件 upload_max_filesize 2M

程序最长运行时间 max_execution_time 30

查找:output_buffering = Off

修改成:output_buffering = On

  1. disable_functions =passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen

缓存:

  1. extension_dir="/www/wdlinux/php/lib/php/extensions/no-debug-zts-20060613"
  2. extension="/eaccelerator.so"
  3. eaccelerator.shm_size="64"
  4. eaccelerator.cache_dir="/www/wdlinux/eaccelerator_cache"
  5. eaccelerator.enable="1" //phpfensi.com
  6. eaccelerator.optimizer="1"
  7. eaccelerator.check_mtime="1"
  8. eaccelerator.debug="0"
  9. eaccelerator.filter=""
  10. eaccelerator.shm_max="0"
  11. eaccelerator.shm_ttl="600"
  12. eaccelerator.shm_prune_period="600"
  13. eaccelerator.shm_only="0"
  14. eaccelerator.compress="1"
  15. eaccelerator.compress_level="9"

缓存那里建议小点,要不WEB的很浪费,我原来设置256WEB用的都上了四百多MB.

上面有不对的希望老鸟们 能够给指点下 有利于更多的兄弟用

还有管理员 大哥 为啥我的站 现在有时候卡的厉害,还得重启下 还有我安装的是LNMAP 可以随意切换的,有时候重启LNMP 不启动还得自己重启下什么原因, 用着是不错 不过配置不会啊,老是有问题,好几万的流量 希望老大能多出点教程,尤其是优化的,用最直观的教程来弄,毕竟小白还是多,技术的少啊。希望老大接受建议。还有希望老鸟们,不要自己光用,把自己的经验发给大家。让我们这些菜鸟 学习下。