怎麼最佳化php php-fom nginx設定參數?以下這篇文章為大家詳細介紹一下php php-fom nginx設定參數調優的方法,希望對大家有幫助。
對於新的伺服器,安裝LNMP
環境只是第一步,第二步當然是要修改預設的配置參數,讓這些程式變得好用,效能也提升起來。這篇文章主要講述php php-fpm nginx
的設定參數,機器是4GB
記憶體的伺服器,相關配置都是依照4GB
記憶體的伺服器來配置的。
mysql設定參數調優(8GB記憶體和64GB記憶體)
mysql設定檔構成以及具體的設定demo
下方給出的一些設定都是相對來說會影響效能或必須要設定的地方,沒有提及的設定都是依照預設的來。這三個程式的配置參數很多,咱們的伺服器剛開始也著實用不到太複雜的配置,下面的配置主要是為了盡量提升高並發能力以及盡量提高程式的效能。
php和php-fpm都是5.6版本的。 (一切都是為了相容舊項目,,苦逼)
(1)safe_mode 这份的配置采用默认的 (2)disable_functions 在默认的基础上,加上eval()函数 (3)expose_php = off (4)register_globals和magic_quotes_gpc参数都在php5.4.0后被移除了 (5)错误提示以及日志部分采用默认的就行,现在大部分使用的都是框架, 查看框架的错误日志更方便
這幾個參數是網路上常提及的,不過咱們這邊並不是都要按照他們的配置來,畢竟年代已久,很多bug
或效能問題都已經被修復。
(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
#上傳的大小,要>=upload_max_filesize
預設開啟,目前高版本的# php
已經避免了這個漏洞,php-fpm
的security.limit_extensions
預設值早就是.php
了。所以咱們這個參數使用預設的就行。 參考:php fpm 設定項目cgi.fix_pathinfo=1 漏洞不再出現
關於
,要設定的參數就是這些了,主要是增加程式的運行時間,增加上傳檔案大小等,可以方便我們平常的php
開發。 三、php-fpm設定
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這塊很多人都建議,如果你的記憶體比較大,那麼設定靜態的
,這個時候,起作用的只有max_children
參數,初始的時候就有max_children
個進程,剛開始一個php-fpm
進程只佔用3M
左右內存,我們4GB
的機器按照一個進程20M
計算,可以設定max_children
為200
或150
。如果是專門的php
伺服器,建議是設定為靜態的,效能最佳。 如果設定成動態的也可以,這樣的話是
等程序起作用,會隨著業務的增加而不斷新增進程,不過最大進程數是不能超過max_children
的。部落客這邊考慮到機器內存小而且機器上還跑了mysql
,redis
等,還是選用了動態的,這樣一開始不會有很大的壓力,等等訪問量上來了,可能會修改為靜態的。
php-fpm
#給子程序分配的時間間隔
# 表示等待 (3)自动重启设置 (4)pm.max_requests = 1000 每一个子进程的最大请求服务数量,如果超过了这个值,该子进程会被自动重启。 比如 request_slowlog_timeout : 默认是注释的,打开注释,设置为1,代表请求超过1s,就会记录这个脚本到慢日志文件中。也可以的更大,按照需求来。 这里开启慢日志,如下: 参数解释: 如果 也就说这个 参考: PHP参数调优 一般打开 答案是: 一个 我们配置的时候,各个 其次是如果在 参考: (1)worker_rlimit_nofile 更改worker进程的最大打开文件数限制。 查看当前进程可以打开的文件数: 查看当前系统可以打开的最大文件数: (2)log_format中的内容 参考官网:https://nginx.org/en/docs/http/ngx_http_core_module.html#var_status (3)gzip压缩相关解释 参考:https://www.jb51.net/article/95041.htm (4)client_max_body_size设置 这个参数规定客户端上传的 (1)配置实例代码 (2)主要是fastcgi的一些配置 这里不考虑负载均衡和反向代理,关于 https://www.jb51.net/article/145222.htm (3)关于send_timeout 这几个参数最好是再小一些,包括 返回 例如: 很明显配置文件是错的。 首先是 还有一种说法,在服务器正常运行的时候, 当程序运行时间大于规定的参数的时候, 假如設定 對於程式逾時時間來說,並不能單純的設定 以上是對於 後續我也會持續依照生產環境的回饋更新這些參數,如果各位大佬有好意見或不同的看法,歡迎溝通交流~ end 推薦學習:《PHP影片教學》320
秒后,结束那些没有自动结束的php
脚本,以释放占用的资源。设置320s
主要是因为php
的程序运行时间是300s
,所以对于php-fpm
来说,这个值应该是大于php
脚本规定的运行时间的(因为php
脚本的运行可能还会带有mysql
服务或者其他的一些服务,这个参数是杀掉这个进程,包括着纯php
脚本以及其他服务)。#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果
#超过emergency_restart_threshold个php-fpm就会优雅重启。这两个选项一般保持默认值
emergency_restart_threshold = 30
emergency_restart_interval = 60s //一分钟内出现30次上述信号即重启php-fpm
max_requests
这个参数,如果设置很大的话,那这个子进程要运行很多次才会重启,假如这个请求发生了错误或者内存泄漏,那么这个值设置很大是不合适的。但如果请求没有问题,这个值设置小的话就会频繁的重启,这样也会碰到不少502
的问题,所以要仁者见仁,智者见智的设置了,这里初始化设置1000
,如果测试没有内存泄漏等问题,可以再大一些。3、php-fpm中的慢日志设置
mysql
中有慢日志这个概念,可以记录查询速度比较慢的sql
,同样的,php-fpm
也可以开启慢日志,记录执行速度比较慢的php
请求,方便我们后续的调试和优化。(1)慢日志的主要参数
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
更多进程,如果prefork
达到了pm.max_children
上限,worker
进程又全都繁忙,这时master
进程会把请求挂起到连接队列backlog
里,而backlog
默认值是511
,除了加大pm.max_children
,调整backlog
也是有必要的。backlog
是在优化高并发的时候必须要设置的,这个值的大小和fpm
的qps
也有关。backlog
太大,fpm
处理不过来照样会报错504
(超时)。这个对于目前的机器来说,我设置的max_children = 150
,然而backlog
的默认值是511
,所以在短期内是完全够用的,不过也可以在php-fpm.conf
里面显式的制定backlog
的值,比如制定:listen.backlog = 1024 #2的n次幂
nginx报错502:connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory)
php-fpm进程数管理
关于PHP-FPM的backlog的默认值
PHP-FPM中backlog参数变更的一些思考
PHP-fpm四、nginx配置参数调优
1、nginx中的一些层级关系
nginx
配置文件,会发现有http
,server
,location
等,那么他们的层级关系是什么样的呢?http
里面可以有多个server
,一个server
里面可以有多个location
。server
共用的部分可以配置在http
模块里面。每个server
自己特有的一些部分,按照各自的需求配置在server
模块里面。同样的,对于location
是分的更细的,按照每个server
的每个location
需求来配置。conf.d
文件夹下有其他的配置文件,那么我们的nginx.conf
就是公用的配置文件了,一些公用的部分都可以配置在nginx.conf文件
中,各个站点特殊的配置就放在conf.d
文件下。
nginx短篇(4):模块、配置指令、块之间的关系2、nginx.conf 实例及解释
user www-data;
worker_processes auto; #自动检测CPU的核数
worker_rlimit_nofile 65535; #worker进程的最大打开文件数限制
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
pid /run/nginx.pid;
events {
worker_connections 10240; #子进程最大连接数,总连接数:worker_processes * worker_connections
use epoll; #使用epoll模型
}
http {
include mime.types; # #文件扩展名与文件类型映射表
default_type application/octet-stream; #这个类型会让浏览器认为响应是普通的文件流,并提示用户下载文件
#记录都有哪些变量可以记录到log_format
log_format main '$remote_addr $host $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_accept_language" "$request_time" '
'"$upstream_response_time" "$upstream_addr" "$upstream_status" "$http_x_real_ip" "$proxy_add_x_forwarded_for"';
sendfile on; #立即将数据从磁盘读到OS缓存
tcp_nopush on; #告诉nginx在一个数据包里发送所有头文件
tcp_nodelay on; # 告诉nginx不要缓存数据,而是一段一段的发送
keepalive_timeout 30; #服务器将在这个超时时间过后关闭链接
types_hash_max_size 2014;
#resolver xxx; #用于解析上游服务器名称的名称服务器配置到地址中
gzip_static on;
gzip on;
gzip_http_version 1.1;
gzip_vary off;
gzip_comp_level 4; #数据的压缩等级,9是最慢但是压缩比最大的
gzip_proxied off;
gzip_buffers 16 8k;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
#设置需要压缩的数据格式
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/hero-res;
client_max_body_size 20m; #设置网页上传文件的最大值,和php.ini中的上传设置保持一致
server_names_hash_max_size 2048; #保存服务器名字的hash表
include /etc/nginx/client.conf;
include /etc/nginx/conf.d/*.conf;
}
ulimit-n
//结果:65535
ljf@hx:cat /proc/sys/fs/file-max
813544
remote_addr:对应客户端的地址
remote_user:是请求客户端请求认证的用户名,如果没有开启认证模块的话是值为空。
time_local:表示nginx服务器时间
request:表示request请求头的行
status:表示response的返回状态
body_bytes_sent:表示从服务端返回给客户端的body数据大小
http_referer:表示请求的上一级页面
http_user_agent:表示agent信息
http_x_forwarded_for:会记录每一级请求中信息
body
的最大值,和php.ini
中的最大上传数保持一致,不然的话,就算php.ini
设置上传的最大文件是1G
,如果nginx
不设置这个参数的话,那么上传一样会报错的。3、对于conf.d文件夹中的配置
server{
listen IP:80;
server_name xxx;
access_log /var/log/nginx/access.log; #access日志
fastcgi_intercept_errors on; #支持nginx404重定向
index index.php index.html index.htm;
root /product/ucool/production/manage/htdocs/backend/web/;
send_timeout 15;
#客户端与服务器建立连接后发送request body的超时时间(小于keepalive_timeout)
client_body_timeout 20;
#客户端向服务器发送一个完整的request header的超时时间(小于keepalive_timeout)
client_header_timeout 20;
fastcgi_connect_timeout 300; #指定连接到后端FastCGI的超时时间
fastcgi_send_timeout 300; #指定向FastCGI传送请求的超时时间
fastcgi_read_timeout 300; #指定接收FastCGI应答的超时时间
fastcgi_buffer_size 64k; #指定读取FastCGI应答第一部分需要用多大的缓冲区
fastcgi_buffers 4 64k; #定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求
location ~* ^.+\.(git|svn|sql|bak|old|rar|tgz|7z|bz2|tar|idea)$ {
return 404;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ /\.git { deny all; }
}
fastcgi
的优化可以参考: send_timeout 15;
#客户端与服务器建立连接后发送request body的超时时间(小于keepalive_timeout)
client_body_timeout 20;
#客户端向服务器发送一个完整的request header的超时时间(小于keepalive_timeout)
client_header_timeout 20;
keepalive_timeout
,小一些的话,能处理更多的有效请求,有利于提升nginx
的处理性能,大佬们的设置如下:client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;
4、保存编辑之后检查配置文件的正确性
(1)检查配置文件是否正确
ljf@hx:/etc/nginx$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
successful
并且没有报错信息的话,说明配置文件里面的语法是没问题的,如果报错了那就是语法出错了,导致配置无法正常读取。(2)检查子级配置文件是否正确
nginx -t -c /etc/nginx/conf.d/xxx.conf
ljf@hx:/etc/nginx$ sudo nginx -t -c /etc/nginx/conf.d/api.conf
nginx: [emerg] "server" directive is not allowed here in /etc/nginx/conf.d/api.conf:1
nginx: configuration file /etc/nginx/conf.d/api.conf test failed
五、影响程序超时的参数
php.ini中有max_execution_time 参数。
php-fpm中有request_terminate_timeout参数
nginx.conf中有 fastcgi_connect_timeout 等参数。
1、关于php和php-fpm超时时间的设置
max_execution_time
这个值限定了脚本的最大执行时间,但是仅限于php
脚本,对于脚本中的流操作和数据库操作等耗费的时间是不算进去的。而php-fpm
的request_terminate_timeout
代表单个请求的超时中止时间,并不会受其他脚本影响,定义10s
结束,那么10s
就准时结束该php
脚本的运行。所以配置超时时间的时候,request_terminate_timeout
可以比max_execution_time
稍微大一些。php-fpm.conf
中的request_terminate_timeout
会覆盖php.ini
中的max_execution_time
,所以request_terminate_timeout
的值更代表我们对于脚本执行时间的预期。如果服务器性能足够好,可以设置request_terminate_timeout = 0
代表永不超时。php-fpm
会终止该php
子进程。2、nginx中的超时设置
nginx
的fastcgi_connect_timeout
操作影响的是ningx
的超时,一般来说,如果是php
或者php-fpm
超时,那么报错502 Bad Gateway(网关错误)
。如果是nginx
超时的话,报错是:504 Gateway Time-out (网关超时)
,到时候我们可以根据这个报错信息来定位问题。一般来说,为防止频繁的出现超时错误,设置fastcgi_connect_timeout
相关时间为300s
是合适的。fastcgi_read_timeout=10
,test.php
執行時間100
秒,則10
秒後webserver
會關閉和PHP
的連線。也就是說當程式運行時間大於規定的參數的時候,webserver
會關閉和PHP
的連接,出現逾時錯誤。所以這個fastcgi
的逾時時間最好是和php-fpm
中的request_terminate_timeout
保持一致。 3、nginx中的keepalive_timeout
keepalive_timeout
參數是一個請求完成之後還要保持連線多久,不是請求時間多久,目的是保持長連接,減少創建連接過程對系統帶來的效能損耗,類似於執行緒池,資料庫連接池。 4、總結
php
或設定#php-fpm
就能完全解決這個問題。因為它們是協調工作的,所以設定這幾個參數的時候是要相互考慮的,防止因為木桶原理,最低的那個板子影響系統的性能。 php php-fpm nginx
的參數調優,這些配置在我本地都是設定過的,並沒有什麼問題,修改的值也是盡可能的發揮咱們伺服器的效能。實際的效果還要放到生產環境來檢驗,不過一定是比預設的配置性能好滴。
以上是深入了解怎麼優化php+php-fom+nginx配置參數的詳細內容。更多資訊請關注PHP中文網其他相關文章!