新聞中心
怎么優(yōu)化php+php-fom+nginx配置參數(shù)?下面本篇文章給大家詳細(xì)介紹一下php+php-fom+nginx配置參數(shù)調(diào)優(yōu)的方法,希望對大家有所幫助。

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)馬尾免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
對于一臺新的服務(wù)器,安裝LNMP環(huán)境只是第一步,第二步當(dāng)然是要修改默認(rèn)的配置參數(shù),讓這些程序變得好用,性能也提升起來。這篇文章主要講述php+php-fpm+nginx的配置參數(shù),機(jī)器是4GB內(nèi)存的服務(wù)器,相關(guān)配置都是按照4GB內(nèi)存的服務(wù)器來配置的。
1、mysql配置參數(shù):
mysql配置參數(shù)調(diào)優(yōu)(8GB內(nèi)存和64GB內(nèi)存)
mysql配置文件構(gòu)成以及具體的配置demo
2、注意
下面給出的一些配置都是相對來說會影響性能或者必須要配置的地方,沒有提及的配置都是按照默認(rèn)的來。這三個(gè)程序的配置參數(shù)很多,咱們的服務(wù)器剛開始也著實(shí)用不到太復(fù)雜的配置,下面的配置主要是為了盡量提升高并發(fā)能力以及盡量提高程序的性能。
php和php-fpm都是5.6版本的。(一切都是為了兼容老項(xiàng)目,,苦逼)
二、php參數(shù)配置及講解
1、phpini的基本設(shè)置
(1)safe_mode 這份的配置采用默認(rèn)的 (2)disable_functions 在默認(rèn)的基礎(chǔ)上,加上eval()函數(shù) (3)expose_php = off (4)register_globals和magic_quotes_gpc參數(shù)都在php5.4.0后被移除了 (5)錯(cuò)誤提示以及日志部分采用默認(rèn)的就行,現(xiàn)在大部分使用的都是框架, 查看框架的錯(cuò)誤日志更方便
這幾個(gè)參數(shù)是網(wǎng)上經(jīng)常提及的,不過咱們這邊并不是都要按照他們的配置來,畢竟年代已久,很多bug或者性能問題都已經(jīng)被修復(fù)。
2、php參數(shù)設(shè)置
(1)max_execution_time = 300
腳本運(yùn)行的最長時(shí)間,超出規(guī)定時(shí)間,腳本會自動殺死這個(gè)請求,為了能上傳大文件,所以這個(gè)值設(shè)置的大一些。這個(gè)值太小也會造成程序502錯(cuò)誤。
(2)memory_limit = 128M
每個(gè)腳本使用的最大內(nèi)存
(3)max_inpit_time = 300
每個(gè)腳本等待輸入數(shù)據(jù)的最長時(shí)間
(4)upload_max_filesize = 20M
上傳文件的最大許可大小
(5)allow_url_fopen = off
禁止打開遠(yuǎn)程地址
(6)post_max_size = 20Mpost上傳的大小,要>=upload_max_filesize
(7);cgi.fix_pathinfo=1
默認(rèn)打開,目前高版本的php已經(jīng)避免了這個(gè)漏洞,php-fpm的security.limit_extensions 默認(rèn)值早就是 .php了。所以咱們這個(gè)參數(shù)使用默認(rèn)的就行。
參考:php fpm 設(shè)置項(xiàng) cgi.fix_pathinfo=1 漏洞不再出現(xiàn)
關(guān)于php.ini,要設(shè)置的參數(shù)就是這些了,主要是增加程序的運(yùn)行時(shí)間,增加上傳文件大小等,可以方便我們平時(shí)的php開發(fā)。
三、php-fpm設(shè)置
1、設(shè)置子進(jìn)程數(shù),增加并發(fā)量
log_level = notice //notice級別的日志,默認(rèn)的 rlimit_files = 4048 //調(diào)整最大打開文件數(shù)量 pm選用動態(tài)變化的dynamic process.max = 150 // 最大子進(jìn)程,設(shè)置成和max_children一樣就行 pm = dynamic pm.max_children = 150 //最大子進(jìn)程,假如一個(gè)進(jìn)程30M,4G內(nèi)存的話最大為:4048/30 = 135,取150 pm.start_servers = 20 pm.min_spare_servers = 6 pm.max_spare_serveres = 30 //計(jì)算公式是:min_spare_servers ≤ start_servers ≤ max_spare_servers ≤ max_children
這塊很多人都建議,如果你的內(nèi)存比較大,那么設(shè)置靜態(tài)的pm = static,這個(gè)時(shí)候,起作用的只有max_children參數(shù),初始的時(shí)候就有max_children個(gè)進(jìn)程,剛開始一個(gè)php-fpm進(jìn)程只占用3M左右內(nèi)存,我們4GB的機(jī)器按照一個(gè)進(jìn)程20M計(jì)算,可以設(shè)置max_children 為200或者150。如果是專門的php服務(wù)器,建議是設(shè)置為靜態(tài)的,性能最佳。
如果設(shè)置成動態(tài)的也可以,這樣的話是start_servers等程序起作用,會隨著業(yè)務(wù)的增加而不斷新增進(jìn)程,不過最大進(jìn)程數(shù)是不能超過max_children的。博主這邊考慮到機(jī)器內(nèi)存小而且機(jī)器上還跑了mysql,redis等,還是選用了動態(tài)的,這樣一開始不會有很大的壓力,等訪問量上來了,可能會修改為靜態(tài)的。
2、防止頻繁出現(xiàn)502錯(cuò)誤
(1)process_control_timeout = 20
php-fpm給子進(jìn)程分配的時(shí)間間隔
(2)request_terminate_timeout = 320s
表示等待320秒后,結(jié)束那些沒有自動結(jié)束的php腳本,以釋放占用的資源。設(shè)置320s主要是因?yàn)?code>php的程序運(yùn)行時(shí)間是300s,所以對于php-fpm來說,這個(gè)值應(yīng)該是大于php腳本規(guī)定的運(yùn)行時(shí)間的(因?yàn)?code>php腳本的運(yùn)行可能還會帶有mysql服務(wù)或者其他的一些服務(wù),這個(gè)參數(shù)是殺掉這個(gè)進(jìn)程,包括著純php腳本以及其他服務(wù))。
(3)自動重啟設(shè)置
#表示在emergency_restart_interval所設(shè)值內(nèi)出現(xiàn)SIGSEGV或者SIGBUS錯(cuò)誤的php-cgi進(jìn)程數(shù)如果 #超過emergency_restart_threshold個(gè)php-fpm就會優(yōu)雅重啟。這兩個(gè)選項(xiàng)一般保持默認(rèn)值 emergency_restart_threshold = 30 emergency_restart_interval = 60s //一分鐘內(nèi)出現(xiàn)30次上述信號即重啟php-fpm
(4)pm.max_requests = 1000
每一個(gè)子進(jìn)程的最大請求服務(wù)數(shù)量,如果超過了這個(gè)值,該子進(jìn)程會被自動重啟。
比如max_requests這個(gè)參數(shù),如果設(shè)置很大的話,那這個(gè)子進(jìn)程要運(yùn)行很多次才會重啟,假如這個(gè)請求發(fā)生了錯(cuò)誤或者內(nèi)存泄漏,那么這個(gè)值設(shè)置很大是不合適的。但如果請求沒有問題,這個(gè)值設(shè)置小的話就會頻繁的重啟,這樣也會碰到不少502的問題,所以要仁者見仁,智者見智的設(shè)置了,這里初始化設(shè)置1000,如果測試沒有內(nèi)存泄漏等問題,可以再大一些。
3、php-fpm中的慢日志設(shè)置
mysql中有慢日志這個(gè)概念,可以記錄查詢速度比較慢的sql,同樣的,php-fpm也可以開啟慢日志,記錄執(zhí)行速度比較慢的php請求,方便我們后續(xù)的調(diào)試和優(yōu)化。
(1)慢日志的主要參數(shù)
request_slowlog_timeout : 默認(rèn)是注釋的,打開注釋,設(shè)置為1,代表請求超過1s,就會記錄這個(gè)腳本到慢日志文件中。也可以的更大,按照需求來。
slowlog : 默認(rèn)也是注釋的,可以打開注釋使用默認(rèn)的慢日志路徑,也可以自定義路徑。
這里開啟慢日志,如下:
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
參數(shù)解釋:
sort: 對單詞進(jìn)行排序 uniq -c: 顯示唯一的行,并在每行行首加上本行在文件中出現(xiàn)的次數(shù) sort -k1,1nr: 按照第一個(gè)字段,數(shù)值排序,且為逆序 head -10: 取前10行數(shù)據(jù)
4、php-fpm中的backlog是干啥的?
如果worker進(jìn)程不夠用,master進(jìn)程會prefork更多進(jìn)程,如果prefork達(dá)到了pm.max_children上限,worker進(jìn)程又全都繁忙,這時(shí)master進(jìn)程會把請求掛起到連接隊(duì)列backlog里,而backlog默認(rèn)值是511,除了加大pm.max_children,調(diào)整backlog也是有必要的。
也就說這個(gè)backlog是在優(yōu)化高并發(fā)的時(shí)候必須要設(shè)置的,這個(gè)值的大小和fpm的qps也有關(guān)。backlog太大,fpm處理不過來照樣會報(bào)錯(cuò)504(超時(shí))。這個(gè)對于目前的機(jī)器來說,我設(shè)置的max_children = 150,然而backlog的默認(rèn)值是511,所以在短期內(nèi)是完全夠用的,不過也可以在php-fpm.conf里面顯式的制定backlog的值,比如制定:listen.backlog = 1024 #2的n次冪
參考:
PHP參數(shù)調(diào)優(yōu)
nginx報(bào)錯(cuò)502:connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory)
php-fpm進(jìn)程數(shù)管理
關(guān)于PHP-FPM的backlog的默認(rèn)值
PHP-FPM中backlog參數(shù)變更的一些思考
PHP-fpm
四、nginx配置參數(shù)調(diào)優(yōu)
1、nginx中的一些層級關(guān)系
一般打開nginx配置文件,會發(fā)現(xiàn)有http,server,location等,那么他們的層級關(guān)系是什么樣的呢?
答案是: 一個(gè)http里面可以有多個(gè)server,一個(gè)server里面可以有多個(gè)location。
我們配置的時(shí)候,各個(gè)server共用的部分可以配置在http模塊里面。每個(gè)server自己特有的一些部分,按照各自的需求配置在server模塊里面。同樣的,對于location是分的更細(xì)的,按照每個(gè)server的每個(gè)location需求來配置。
其次是如果在conf.d文件夾下有其他的配置文件,那么我們的nginx.conf就是公用的配置文件了,一些公用的部分都可以配置在nginx.conf文件中,各個(gè)站點(diǎn)特殊的配置就放在conf.d文件下。
參考:
nginx短篇(4):模塊、配置指令、塊之間的關(guān)系
2、nginx.conf 實(shí)例及解釋
user www-data;
worker_processes auto; #自動檢測CPU的核數(shù)
worker_rlimit_nofile 65535; #worker進(jìn)程的最大打開文件數(shù)限制
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
pid /run/nginx.pid;
events {
worker_connections 10240; #子進(jìn)程最大連接數(shù),總連接數(shù):worker_processes * worker_connections
use epoll; #使用epoll模型
}
http {
include mime.types; # #文件擴(kuò)展名與文件類型映射表
default_type application/octet-stream; #這個(gè)類型會讓瀏覽器認(rèn)為響應(yīng)是普通的文件流,并提示用戶下載文件
#記錄都有哪些變量可以記錄到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; #立即將數(shù)據(jù)從磁盤讀到OS緩存
tcp_nopush on; #告訴nginx在一個(gè)數(shù)據(jù)包里發(fā)送所有頭文件
tcp_nodelay on; # 告訴nginx不要緩存數(shù)據(jù),而是一段一段的發(fā)送
keepalive_timeout 30; #服務(wù)器將在這個(gè)超時(shí)時(shí)間過后關(guān)閉鏈接
types_hash_max_size 2014;
#resolver xxx; #用于解析上游服務(wù)器名稱的名稱服務(wù)器配置到地址中
gzip_static on;
gzip on;
gzip_http_version 1.1;
gzip_vary off;
gzip_comp_level 4; #數(shù)據(jù)的壓縮等級,9是最慢但是壓縮比最大的
gzip_proxied off;
gzip_buffers 16 8k;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
#設(shè)置需要壓縮的數(shù)據(jù)格式
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; #設(shè)置網(wǎng)頁上傳文件的最大值,和php.ini中的上傳設(shè)置保持一致
server_names_hash_max_size 2048; #保存服務(wù)器名字的hash表
include /etc/nginx/client.conf;
include /etc/nginx/conf.d/*.conf;
}
(1)worker_rlimit_nofile
更改worker進(jìn)程的最大打開文件數(shù)限制。
查看當(dāng)前進(jìn)程可以打開的文件數(shù):
ulimit-n //結(jié)果:65535
查看當(dāng)前系統(tǒng)可以打開的最大文件數(shù):
ljf@hx:cat /proc/sys/fs/file-max 813544
(2)log_format中的內(nèi)容
參考官網(wǎng):https://nginx.org/en/docs/http/ngx_http_core_module.html#var_status
remote_addr:對應(yīng)客戶端的地址 remote_user:是請求客戶端請求認(rèn)證的用戶名,如果沒有開啟認(rèn)證模塊的話是值為空。 time_local:表示nginx服務(wù)器時(shí)間 request:表示request請求頭的行 status:表示response的返回狀態(tài) body_bytes_sent:表示從服務(wù)端返回給客戶端的body數(shù)據(jù)大小 http_referer:表示請求的上一級頁面 http_user_agent:表示agent信息 http_x_forwarded_for:會記錄每一級請求中信息
(3)gzip壓縮相關(guān)解釋
參考:https://www.jb51.net/article/95041.htm
(4)client_max_body_size設(shè)置
這個(gè)參數(shù)規(guī)定客戶端上傳的body的最大值,和php.ini中的最大上傳數(shù)保持一致,不然的話,就算php.ini設(shè)置上傳的最大文件是1G,如果nginx
不設(shè)置這個(gè)參數(shù)的話,那么上傳一樣會報(bào)錯(cuò)的。
3、對于conf.d文件夾中的配置
(1)配置實(shí)例代碼
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;
#客戶端與服務(wù)器建立連接后發(fā)送request body的超時(shí)時(shí)間(小于keepalive_timeout)
client_body_timeout 20;
#客戶端向服務(wù)器發(fā)送一個(gè)完整的request header的超時(shí)時(shí)間(小于keepalive_timeout)
client_header_timeout 20;
fastcgi_connect_timeout 300; #指定連接到后端FastCGI的超時(shí)時(shí)間
fastcgi_send_timeout 300; #指定向FastCGI傳送請求的超時(shí)時(shí)間
fastcgi_read_timeout 300; #指定接收FastCGI應(yīng)答的超時(shí)時(shí)間
fastcgi_buffer_size 64k; #指定讀取FastCGI應(yīng)答第一部分需要用多大的緩沖區(qū)
fastcgi_buffers 4 64k; #定本地需要用多少和多大的緩沖區(qū)來緩沖FastCGI的應(yīng)答請求
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; }
}
(2)主要是fastcgi的一些配置
這里不考慮負(fù)載均衡和反向代理,關(guān)于fastcgi的優(yōu)化可以參考:
https://www.jb51.net/article/145222.htm
(3)關(guān)于send_timeout
send_timeout 15;
#客戶端與服務(wù)器建立連接后發(fā)送request body的超時(shí)時(shí)間(小于keepalive_timeout)
client_body_timeout 20;
#客戶端向服務(wù)器發(fā)送一個(gè)完整的request header的超時(shí)時(shí)間(小于keepalive_timeout)
client_header_timeout 20;
這幾個(gè)參數(shù)最好是再小一些,包括keepalive_timeout,小一些的話,能處理更多的有效請求,有利于提升nginx的處理性能,大佬們的設(shè)置如下:
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并且沒有報(bào)錯(cuò)信息的話,說明配置文件里面的語法是沒問題的,如果報(bào)錯(cuò)了那就是語法出錯(cuò)了,導(dǎo)致配置無法正常讀取。
(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
很明顯配置文件是錯(cuò)的。
五、影響程序超時(shí)的參數(shù)
php.ini中有max_execution_time 參數(shù)。 php-fpm中有request_terminate_timeout參數(shù) nginx.conf中有 fastcgi_connect_timeout 等參數(shù)。
1、關(guān)于php和php-fpm超時(shí)時(shí)間的設(shè)置
首先是max_execution_time 這個(gè)值限定了腳本的最大執(zhí)行時(shí)間,但是僅限于php腳本,對于腳本中的流操作和數(shù)據(jù)庫操作等耗費(fèi)的時(shí)間是不算進(jìn)去的。而php-fpm的request_terminate_timeout 代表單個(gè)請求的超時(shí)中止時(shí)間,并不會受其他腳本影響,定義10s結(jié)束,那么10s就準(zhǔn)時(shí)結(jié)束該php腳本的運(yùn)行。所以配置超時(shí)時(shí)間的時(shí)候,request_terminate_timeout 可以比max_execution_time 稍微大一些。
還有一種說法,在服務(wù)器正常運(yùn)行的時(shí)候,php-fpm.conf中的request_terminate_timeout 會覆蓋php.ini中的max_execution_time,所以request_terminate_timeout 的值更代表我們對于腳本執(zhí)行時(shí)間的預(yù)期。如果服務(wù)器性能足夠好,可以設(shè)置request_terminate_timeout = 0代表永不超時(shí)。
當(dāng)程序運(yùn)行時(shí)間大于規(guī)定的參數(shù)的時(shí)候,php-fpm會終止該php子進(jìn)程。
2、nginx中的超時(shí)設(shè)置
nginx的fastcgi_connect_timeout 操作影響的是ningx的超時(shí),一般來說,如果是php或者php-fpm超時(shí),那么報(bào)錯(cuò)502 Bad Gateway(網(wǎng)關(guān)錯(cuò)誤) 。如果是nginx超時(shí)的話,報(bào)錯(cuò)是:504 Gateway Time-out (網(wǎng)關(guān)超時(shí)) ,到時(shí)候我們可以根據(jù)這個(gè)報(bào)錯(cuò)信息來定位問題。一般來說,為防止頻繁的出現(xiàn)超時(shí)錯(cuò)誤,設(shè)置fastcgi_connect_timeout 相關(guān)時(shí)間為300s是合適的。
假如設(shè)置fastcgi_read_timeout=10,test.php執(zhí)行時(shí)間100秒,則10秒后webserver會關(guān)閉和PHP的連接。也就是說當(dāng)程序運(yùn)行時(shí)間大于規(guī)定的參數(shù)的時(shí)候,webserver會關(guān)閉和PHP的連接,出現(xiàn)超時(shí)錯(cuò)誤。所以這個(gè)fastcgi的超時(shí)時(shí)間最好是和php-fpm中的request_terminate_timeout 保持一致。
3、nginx中的keepalive_timeout
keepalive_timeout參數(shù)是一個(gè)請求完成之后還要保持連接多久,不是請求時(shí)間多久,目的是保持長連接,減少創(chuàng)建連接過程給系統(tǒng)帶來的性能損耗,類似于線程池,數(shù)據(jù)庫連接池。
4、總結(jié)
對于程序超時(shí)時(shí)間來說,并不能單純的設(shè)置php或者設(shè)置php-fpm就能完全解決這個(gè)問題。因?yàn)樗鼈兪菂f(xié)調(diào)工作的,所以設(shè)置這幾個(gè)參數(shù)的時(shí)候是要相互考慮的,防止因?yàn)槟就霸?,最低的那個(gè)板子影響系統(tǒng)的性能。
以上就是對于php+php-fpm+nginx的參數(shù)調(diào)優(yōu),這些配置在我本地都是設(shè)置過的,并沒有什么問題,修改的值也是盡可能的發(fā)揮咱們服務(wù)器的性能。實(shí)際的效果還要放到生產(chǎn)環(huán)境來檢驗(yàn),不過肯定是比默認(rèn)的配置性能好滴。
后續(xù)我也會不斷根據(jù)生產(chǎn)環(huán)境的反饋來更新這些參數(shù),如果各位大佬有好意見或者不同的看法,歡迎溝通交流~
end
當(dāng)前名稱:深入了解怎么優(yōu)化php+php-fom+nginx配置參數(shù)
瀏覽路徑:http://www.dlmjj.cn/article/codpedg.html


咨詢
建站咨詢
