您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何優化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
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
開發。
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
等,還是選用了動態的,這樣一開始不會有很大的壓力,等訪問量上來了,可能會修改為靜態的。
(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
,如果測試沒有內存泄漏等問題,可以再大一些。
mysql
中有慢日志這個概念,可以記錄查詢速度比較慢的sql
,同樣的,php-fpm
也可以開啟慢日志,記錄執行速度比較慢的php
請求,方便我們后續的調試和優化。
request_slowlog_timeout : 默認是注釋的,打開注釋,設置為1,代表請求超過1s,就會記錄這個腳本到慢日志文件中。也可以的更大,按照需求來。
slowlog : 默認也是注釋的,可以打開注釋使用默認的慢日志路徑,也可以自定義路徑。
這里開啟慢日志,如下:
request_slowlog_timeout = 2 # 記錄超過2s的請求 slowlog = /var/log/php-fpm/www-slow.log #慢日志路徑
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行數據
如果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次冪
參考:
PHP參數調優
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
配置文件,會發現有http
,server
,location
等,那么他們的層級關系是什么樣的呢?
答案是: 一個http
里面可以有多個server
,一個server
里面可以有多個location
。
我們配置的時候,各個server
共用的部分可以配置在http
模塊里面。每個server
自己特有的一些部分,按照各自的需求配置在server
模塊里面。同樣的,對于location
是分的更細的,按照每個server
的每個location
需求來配置。
其次是如果在conf.d
文件夾下有其他的配置文件,那么我們的nginx.conf
就是公用的配置文件了,一些公用的部分都可以配置在nginx.conf文件
中,各個站點特殊的配置就放在conf.d
文件下。
參考:
nginx短篇(4):模塊、配置指令、塊之間的關系
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; }
(1)worker_rlimit_nofile
更改worker進程的最大打開文件數限制。
查看當前進程可以打開的文件數:
ulimit-n //結果:65535
查看當前系統可以打開的最大文件數:
ljf@hx:cat /proc/sys/fs/file-max 813544
(2)log_format中的內容
參考官網:https://nginx.org/en/docs/http/ngx_http_core_module.html#var_status
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:會記錄每一級請求中信息
(3)gzip壓縮相關解釋
參考:https://www.jb51.net/article/95041.htm
(4)client_max_body_size設置
這個參數規定客戶端上傳的body
的最大值,和php.ini
中的最大上傳數保持一致,不然的話,就算php.ini
設置上傳的最大文件是1G
,如果nginx
不設置這個參數的話,那么上傳一樣會報錯的。
(1)配置實例代碼
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; } }
(2)主要是fastcgi的一些配置
這里不考慮負載均衡和反向代理,關于fastcgi
的優化可以參考:
https://www.jb51.net/article/145222.htm
(3)關于send_timeout
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;
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
并且沒有報錯信息的話,說明配置文件里面的語法是沒問題的,如果報錯了那就是語法出錯了,導致配置無法正常讀取。
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 等參數。
首先是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
子進程。
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
保持一致。
keepalive_timeout
參數是一個請求完成之后還要保持連接多久,不是請求時間多久,目的是保持長連接,減少創建連接過程給系統帶來的性能損耗,類似于線程池,數據庫連接池。
關于“如何優化php+php-fom+nginx配置參數”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“如何優化php+php-fom+nginx配置參數”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。