溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

nginx+php的性能優(yōu)化設(shè)置是什么意思

發(fā)布時間:2021-06-25 11:20:40 來源:億速云 閱讀:201 作者:chen 欄目:編程語言

這篇文章主要介紹“nginx+php的性能優(yōu)化設(shè)置是什么意思”,在日常操作中,相信很多人在nginx+php的性能優(yōu)化設(shè)置是什么意思問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”nginx+php的性能優(yōu)化設(shè)置是什么意思”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

準(zhǔn)備工作

  • 一臺ECS服務(wù)器

  • 手動編譯nginx+php

  • 修改index.php ,輸出 ‘hello world’

  • 用ab工具,ab -c 100 -n 50000 ,連續(xù)5次,記錄壓測的qps平均值。

  • 想辦法去優(yōu)化,調(diào)整各種參數(shù)。每次調(diào)整一個參數(shù)有發(fā)現(xiàn)QPS提高,那就記錄下來,并思考qps瓶頸是在哪

Nginx 一些基本配置的描述

 user administrator administrators;  #配置用戶或者組,默認(rèn)為nobody nobody。
 worker_processes 2;  #允許生成的進(jìn)程數(shù),默認(rèn)為1
 pid /nginx/pid/nginx.pid;   #指定nginx進(jìn)程運行文件存放地址
 error_log log/error.log debug;  #制定日志路徑,級別。這個設(shè)置可以放入全局塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg
 events { accept_mutex on;   #設(shè)置網(wǎng)路連接序列化,防止驚群現(xiàn)象發(fā)生,默認(rèn)為on multi_accept on;  #設(shè)置一個進(jìn)程是否同時接受多個網(wǎng)絡(luò)連接,默認(rèn)為off #use epoll;      #事件驅(qū)動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections  1024;    #最大連接數(shù),默認(rèn)為512
 }
 http { include       mime.types;   #文件擴(kuò)展名與文件類型映射表 default_type  application/octet-stream; #默認(rèn)文件類型,默認(rèn)為text/plain #access_log off; #取消服務(wù)日志     log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式 access_log log/access.log myFormat;  #combined為日志格式的默認(rèn)值 sendfile on;   #允許sendfile方式傳輸文件,默認(rèn)為off,可以在http塊,server塊,location塊。 sendfile_max_chunk 100k;  #每個進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值,默認(rèn)為0,即不設(shè)上限。 keepalive_timeout 65;  #連接超時時間,默認(rèn)為75s,可以在http,server,location塊。
 upstream mysvr {   
       server 127.0.0.1:7878;   server 192.168.10.121:3333 backup;  #熱備 } error_page 404 https://www.baidu.com; #錯誤頁 server { keepalive_requests 120; #單連接請求上限次數(shù)。 listen       4545;   #監(jiān)聽端口 server_name  127.0.0.1;   #監(jiān)聽地址        location  ~^.+$ {       #請求的url過濾,正則匹配,~為區(qū)分大小寫,~為不區(qū)分大小寫。#root path;  #根目錄#index vv.txt;  #設(shè)置默認(rèn)頁proxy_pass  http://mysvr;  #請求轉(zhuǎn)向mysvr 定義的服務(wù)器列表deny 127.0.0.1;  #拒絕的ipallow 172.18.5.54; #允許的ip            } 
     }}

接下來我們開始吧

ECS配置
CPU: 1核
內(nèi)存: 1 GiB
操作系統(tǒng): CentOS 7 64位
當(dāng)前使用帶寬: 1Mbps

在高并發(fā)的情況下,內(nèi)核會認(rèn)為系統(tǒng)受到了SYN flood攻擊,會發(fā)送cookies(possible SYN flooding on port 80. Sending cookies),這樣會減慢影響請求的速度,所以在應(yīng)用服務(wù)器上設(shè)置下這個參數(shù)為0禁用系統(tǒng)保護(hù)就可以進(jìn)行大并發(fā)測試了:

 $ vim /etc/sysctl.conf  $ net.ipv4.tcp_syncookies = 0 $ sysctl -p $ net.ipv4.tcp_syncookies = 0

net.ipv4.tcp_syncookies = 0  #此參數(shù)是為了防止洪水攻擊的,但對于大并發(fā)系統(tǒng),要禁用此設(shè)置
net.ipv4.tcp_max_syn_backlog #參數(shù)決定了SYN_RECV狀態(tài)隊列的數(shù)量,一般默認(rèn)值為512或者1024,即超過這個數(shù)量,系統(tǒng)將不再接受新的TCP連接請求,一定程度上可以防止系統(tǒng)資源耗盡??筛鶕?jù)情況增加該值以接受更多的連接請求。
net.ipv4.tcp_tw_recycle #參數(shù)決定是否加速TIME_WAIT的sockets的回收,默認(rèn)為0。
net.ipv4.tcp_tw_reuse #參數(shù)決定是否可將TIME_WAIT狀態(tài)的sockets用于新的TCP連接,默認(rèn)為0。
net.ipv4.tcp_max_tw_buckets #參數(shù)決定TIME_WAIT狀態(tài)的sockets總數(shù)量,可根據(jù)連接數(shù)和系統(tǒng)資源需要進(jìn)行設(shè)置

默認(rèn)編譯測試,無修改:

ab -c 100 -n 50000 http://127.0.0.1/index.php
1、 7111 2、7233 3、7240 4、7187 5、7197 平均:7194

修改

worker_processes 1 => auto

worker_processes :工作進(jìn)程數(shù),調(diào)整一般為auto或者跟cpu核心一樣的數(shù)量。

一般一個進(jìn)程足夠了,你可以把連接數(shù)設(shè)得很大。(worker_processes: 1,worker_connections: 10,000)
如果有SSL、gzip這些比較消耗CPU的工作,而且是多核CPU的話,可以設(shè)為和CPU的數(shù)量一樣。(worker_processes: CPU核心數(shù))
或者要處理很多很多的小文件,而且文件總大小比內(nèi)存大很多的時候,也可以把進(jìn)程數(shù)增加,以充分利用IO帶寬(主要似乎是IO操作有block)

1、 7242 2、7228 3、7275 4、7234 5、7231 平均:7242

worker_connections 1020 => 65535

單個進(jìn)程允許的客戶端最大連接數(shù),一般來說,連接數(shù)可以設(shè)置和端口數(shù)一樣。

1、 7212 2、7236 3、7223 4、7260 5、7230 平均 7232

worker_rlimit_nofile 65535

worker進(jìn)程最大打開文件數(shù),一般可以優(yōu)化設(shè)置成和端口數(shù)一樣

1、 7243 2、7236 3、7146 4、7243 5、7196 平均 7212.8

use epoll;

使用epoll的I/O模型,事件處理模型優(yōu)化。

1、7265 2、7196 3、7227 4、7216 5、7253 平均 7231

multi_accept ON

multi_accept指令使得NGINX worker能夠在獲得新連接的通知時盡可能多的接受連接。 此指令的作用是立即接受所有連接放到監(jiān)聽隊列中。 如果指令被禁用,worker進(jìn)程將逐個接受連接。
1、 7273 2、7281 3、7308 4、7299 5、7290 平均 7290

accept_mutex ON

由于我們在NGINX中配置了多個workers,因此我們還應(yīng)配置影響worker的相關(guān)指令。 events區(qū)域下accept_mutex參數(shù)將使每個可用的worker進(jìn)程逐個接受新連接。設(shè)置網(wǎng)路連接序列化,防止驚群現(xiàn)象發(fā)生,默認(rèn)為on。
服務(wù)器是1核,所以影響不大
1、7268 2、7295 3、7308 4、7274 5、7261 平均 7281

tcp_nopush On

TCP_CORK作為Nagle算法的替代方案,Linux提供了TCP_CORK選項。 該選項告訴TCP堆棧附加數(shù)據(jù)包,并在它們已滿或當(dāng)應(yīng)用程序通過顯式刪除TCP_CORK指示發(fā)送數(shù)據(jù)包時發(fā)送它們。 這使得發(fā)送的數(shù)據(jù)分組是最優(yōu)量,并且因此提高了網(wǎng)絡(luò)的效率。
NGINX提供了tcp_nopush指令,在連接套接字時啟用TCP_CORK。 該指令可用于http,server和location區(qū)塊:
http{
     tcp_nopush on;
}
1、7309 2、7321 3、7292 4、7308 5、7322 平均 7310

tcp_nodelay on

TCP/IP網(wǎng)絡(luò)存在“小包”問題,其中單字符消息可能在高負(fù)載網(wǎng)絡(luò)上導(dǎo)致網(wǎng)絡(luò)擁塞。 例如分組大小為41字節(jié),其中40字節(jié)用于TCP報頭,只有1字節(jié)是有用信息。 這些小包占用了大約4000%的巨大開銷并且使得網(wǎng)絡(luò)飽和
ohn Nagle通過不立即發(fā)送小包來解決問題(Nagle的算法)。 所有這樣的分組被收集一定量的時間,然后作為單個分組一次發(fā)送。 這改進(jìn)了底層網(wǎng)絡(luò)的的效率。 因此,典型的TCP/IP協(xié)議棧在將數(shù)據(jù)包發(fā)送到客戶端之前需要等待200毫秒。
在打開套接字時可以使用TCP_NODELAY選項來禁用Nagle的緩沖算法,并在數(shù)據(jù)可用時立即發(fā)送。 NGINX提供了tcp_nodelay指令來啟用此選項。 該指令可用于http,server和location區(qū)塊:
http{
     tcp_nodelay on;
}

1、 7326 2、7316 3、7334 4、7274 5、7290 平均 7308

worker_priority -5

指明worker進(jìn)程的nice值
Linux系統(tǒng)中,優(yōu)先級高的進(jìn)程會占用更多的系統(tǒng)資源,這里配置的是進(jìn)程的靜態(tài)優(yōu)先級,取值范圍-20到+19,-20級別最高。因此可以把這個值設(shè)置小一點,但不建議比內(nèi)核進(jìn)程的值低(通常為-5)

測試中 0到-5的性能提升明顯 0可達(dá)到8000均值
1、 7982 2、8023 3、7932 4、7911 5、8052 平均 7980

php-fpm參數(shù)調(diào)優(yōu)

pm = dynamic; 
表示使用哪種進(jìn)程數(shù)量管理方式
    dynamic表示php-fpm進(jìn)程數(shù)是動態(tài)的,最開始是pm.start_servers指定的數(shù)量,如果請求較多,則會自動增加,保證空閑的進(jìn)程數(shù)不小于pm.min_spare_servers,如果進(jìn)程數(shù)較多,也會進(jìn)行相應(yīng)清理,保證多余的進(jìn)程數(shù)不多于pm.max_spare_servers
    static表示php-fpm進(jìn)程數(shù)是靜態(tài)的, 進(jìn)程數(shù)自始至終都是pm.max_children指定的數(shù)量,不再增加或減少
  1.pm.start_servers = 15; 動態(tài)方式下的起始php-fpm進(jìn)程數(shù)量
  2.pm.min_spare_servers = 5; 動態(tài)方式下的最小php-fpm進(jìn)程數(shù)量
3.pm.max_spare_servers = 25; 動態(tài)方式下的最大php-fpm進(jìn)程數(shù)量
4.pm.max_requests = 5000
設(shè)置每個子進(jìn)程重生之前服務(wù)的請求數(shù). 對于可能存在內(nèi)存泄漏的第三方模塊來說是非常有用的. 如果設(shè)置為 ’0′ 則一直接受請求. 等同于 PHP_FCGI_MAX_REQUESTS 環(huán)境變量. 默認(rèn)值: 0. 這段配置的意思是,當(dāng)一個 PHP-CGI 進(jìn)程處理的請求數(shù)累積到 5000 個后,自動重啟該進(jìn)程。
7934 2 、8107 3 、8013 4、8039 5、7990 均值 8016

opcache

opcache 絕對是優(yōu)化的利器,Opcache是字節(jié)碼緩存,也就是PHP在被編譯的時候,首先會把php代碼轉(zhuǎn)換為字節(jié)碼,字節(jié)碼然后被執(zhí)行。
php文件第二次執(zhí)行時,同樣還是會重新轉(zhuǎn)換為字節(jié)碼,但是很多時候,文件內(nèi)容幾乎是一樣的,比如靜態(tài)HTML文件,生成后內(nèi)容許久都不會改變,用戶訪問請求直接由服務(wù)器讀取響應(yīng)給客戶端瀏覽器。都不用經(jīng)過PHP進(jìn)行解析構(gòu)建了。
內(nèi)存中的字節(jié)碼數(shù)據(jù),可以直接緩存進(jìn)行二次編譯。這樣程序就會快一些,cpu的消耗也少了。

結(jié)論

php-fpm 采用 prefork的方式 (listen同一個地址,然后fork出若干子進(jìn)程),fast-cgi管理器實現(xiàn)的是多進(jìn)程模型。

但是在php運行時,每一個進(jìn)程只能處理一個請求,實際上,運行時是單進(jìn)程,單線程的。

php-fpm一個線程是阻塞模型,必須等待該客戶端請求php服務(wù)端返回數(shù)據(jù),下一個nginx發(fā)過來的請求才能被受理,這個時候FPM就需要增多進(jìn)程去應(yīng)付并發(fā),更高的qps 需要更多的進(jìn)程處理,當(dāng)處理請求的時候發(fā)生了時間較長阻塞,導(dǎo)致進(jìn)程內(nèi)存無法釋放,后續(xù)請求沒有足夠的子進(jìn)程去處理,更多的瓶頸在于 PHP-FPM 大量子進(jìn)程的處理和消耗內(nèi)存上面。

到此,關(guān)于“nginx+php的性能優(yōu)化設(shè)置是什么意思”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI