怎么优化php+php-fom+nginx配置参数?下面本篇文章给大家详细介绍一下php+php-fom+nginx配置参数调优的方法,希望对大家有所帮助。
一、前言
对于一台新的服务器,安装LNMP
环境只是第一步,第二步当然是要修改默认的配置参数,让这些程序变得好用,性能也提升起来。这篇文章主要讲述php+php-fpm+nginx
的配置参数,机器是4GB
内存的服务器,相关配置都是按照4GB
内存的服务器来配置的。
1、mysql配置参数:
mysql配置参数调优(8GB内存和64GB内存)
mysql配置文件构成以及具体的配置demo
2、注意
下面给出的一些配置都是相对来说会影响性能或者必须要配置的地方,没有提及的配置都是按照默认的来。这三个程序的配置参数很多,咱们的服务器刚开始也着实用不到太复杂的配置,下面的配置主要是为了尽量提升高并发能力以及尽量提高程序的性能。
php和php-fpm都是5.6版本的。(一切都是为了兼容老项目,,苦逼)
二、php参数配置及讲解
1、phpini的基本设置
(1)safe_mode 这份的配置采用默认的 (2)disable_functions 在默认的基础上,加上eval()函数 (3)expose_php = off (4)register_globals和magic_quotes_gpc参数都在php5.4.0后被移除了 (5)错误提示以及日志部分采用默认的就行,现在大部分使用的都是框架, 查看框架的错误日志更方便
这几个参数是网上经常提及的,不过咱们这边并不是都要按照他们的配置来,毕竟年代已久,很多bug
或者性能问题都已经被修复。
2、php参数设置
(1)max_execution_time = 300
脚本运行的最长时间,超出规定时间,脚本会自动杀死这个请求,为了能上传大文件,所以这个值设置的大一些。这个值太小也会造成程序502错误。
(2)memory_limit = 128M
每个脚本使用的最大内存
(3)max_inpit_time = 300
每个脚本等待输入数据的最长时间
(4)upload_max_filesize = 20M
上传文件的最大许可大小
(5)allow_url_fopen = off
禁止打开远程地址
(6)post_max_size = 20M
post
上传的大小,要>=upload_max_filesize
(7);cgi.fix_pathinfo=1
默认打开,目前高版本的php
已经避免了这个漏洞,php-fpm
的security.limit_extensions
默认值早就是 .php
了。所以咱们这个参数使用默认的就行。
参考:php fpm 设置项 cgi.fix_pathinfo=1 漏洞不再出现
关于php.ini
,要设置的参数就是这些了,主要是增加程序的运行时间,增加上传文件大小等,可以方便我们平时的php
开发。
三、php-fpm设置
1、设置子进程数,增加并发量
log_level = notice //notice级别的日志,默认的 rlimit_files = 4048 //调整最大打开文件数量 pm选用动态变化的dynamic process.max = 150 // 最大子进程,设置成和max_children一样就行 pm = dynamic pm.max_children = 150 //最大子进程,假如一个进程30M,4G内存的话最大为:4048/30 = 135,取150 pm.start_servers = 20 pm.min_spare_servers = 6 pm.max_spare_serveres = 30 //计算公式是:min_spare_servers ≤ start_servers ≤ max_spare_servers ≤ max_children
这块很多人都建议,如果你的内存比较大,那么设置静态的pm = static
,这个时候,起作用的只有max_children
参数,初始的时候就有max_children
个进程,刚开始一个php-fpm
进程只占用3M
左右内存,我们4GB
的机器按照一个进程20M
计算,可以设置max_children
为200
或者150
。如果是专门的php
服务器,建议是设置为静态的,性能最佳。
如果设置成动态的也可以,这样的话是start_servers
等程序起作用,会随着业务的增加而不断新增进程,不过最大进程数是不能超过max_children
的。博主这边考虑到机器内存小而且机器上还跑了mysql
,redis
等,还是选用了动态的,这样一开始不会有很大的压力,等访问量上来了,可能会修改为静态的。
2、防止频繁出现502错误
(1)process_control_timeout = 20
php-fpm
给子进程分配的时间间隔
(2)request_terminate_timeout = 320s
表示等待320
秒后,结束那些没有自动结束的php
脚本,以释放占用的资源。设置320s
主要是因为php
的程序运行时间是300s
,所以对于php-fpm
来说,这个值应该是大于php
脚本规定的运行时间的(因为php
脚本的运行可能还会带有mysql
服务或者其他的一些服务,这个参数是杀掉这个进程,包括着纯php
脚本以及其他服务)。
(3)自动重启设置
#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果 #超过emergency_restart_threshold个php-fpm就会优雅重启。这两个选项一般保持默认值 emergency_restart_threshold = 30 emergency_restart_interval = 60s //一分钟内出现30次上述信号即重启php-fpm
(4)pm.max_requests = 1000
每一个子进程的最大请求服务数量,如果超过了这个值,该子进程会被自动重启。
比如max_requests
这个参数,如果设置很大的话,那这个子进程要运行很多次才会重启,假如这个请求发生了错误或者内存泄漏,那么这个值设置很大是不合适的。但如果请求没有问题,这个值设置小的话就会频繁的重启,这样也会碰到不少502
的问题,所以要仁者见仁,智者见智的设置了,这里初始化设置1000
,如果测试没有内存泄漏等问题,可以再大一些。
3、php-fpm中的慢日志设置
mysql
中有慢日志这个概念,可以记录查询速度比较慢的sql
,同样的,php-fpm
也可以开启慢日志,记录执行速度比较慢的php
请求,方便我们后续的调试和优化。
(1)慢日志的主要参数
request_slowlog_timeout : 默认是注释的,打开注释,设置为1,代表请求超过1s,就会记录这个脚本到慢日志文件中。也可以的更大,按照需求来。
slowlog : 默认也是注释的,可以打开注释使用默认的慢日志路径,也可以自定义路径。
这里开启慢日志,如下:
request_slowlog_timeout = 2 # 记录超过2s的请求 slowlog = /var/log/php-fpm/www-slow.log #慢日志路径
(2)利用sort/uniq命令分析汇总php-fpm慢日志:
grep -v “^$” www.log.slow.tmp | cut -d ” ” -f 3,2 | sort | uniq -c | sort -k1,1nr | head -n 50
参数解释:
sort: 对单词进行排序 uniq -c: 显示唯一的行,并在每行行首加上本行在文件中出现的次数 sort -k1,1nr: 按照第一个字段,数值排序,且为逆序 head -10: 取前10行数据
4、php-fpm中的backlog是干啥的?
如果worker
进程不够用,master
进程会prefork