如何讓你的Nginx 提升10倍性能?
? ? ?
? ?正文? ?

負(fù)載均衡(參見(jiàn)“建議二”),反向代理服務(wù)器上運(yùn)行負(fù)載均衡服務(wù),把流量平均分配給幾臺(tái)應(yīng)用服務(wù)器。有了負(fù)載均衡,添加應(yīng)用服務(wù)器根本不需要修改應(yīng)用。 緩存靜態(tài)文件(參見(jiàn)“建議三”),圖片或代碼之類(lèi)的可以直接請(qǐng)求的文件,都可以保存在反向代理服務(wù)器中,以便直接發(fā)給客戶(hù)端。這樣不僅可以更快地響應(yīng)請(qǐng)求,還能減輕應(yīng)用服務(wù)器的負(fù)擔(dān),加快其運(yùn)行速度。 保證站點(diǎn)安全,可以配置反向代理服務(wù)器提升其安全級(jí)別,通過(guò)它監(jiān)控來(lái)快速識(shí)別和響應(yīng)攻擊,從而保存應(yīng)用服務(wù)器安全。


靜態(tài)內(nèi)容緩存,不常變化的文件,如圖片(JPEG、PNG)和代碼(CSS、JavaScript),可以保存在邊緣服務(wù)器中,以便快速?gòu)膬?nèi)容或磁盤(pán)中獲取。 動(dòng)態(tài)內(nèi)容緩存,很多Web應(yīng)用會(huì)為每個(gè)頁(yè)面請(qǐng)求生成全新的HTML,把生成的每個(gè)HTML都緩存一小段時(shí)間,可能顯著減少需要生成的頁(yè)面總數(shù),同時(shí)又可以保證交付的內(nèi)容足夠新鮮。
把內(nèi)容放到離用戶(hù)近的地方。離用戶(hù)近,傳輸時(shí)間少。 把內(nèi)容放到較快的機(jī)器上。機(jī)器快,檢索速度快。 把內(nèi)容從過(guò)度使用的機(jī)器中拿走。有時(shí)候機(jī)器會(huì)比在專(zhuān)注執(zhí)行特定任務(wù)時(shí)慢很多,那是因?yàn)樘嗳蝿?wù)讓它們分心。這時(shí)候把內(nèi)容拿到其他機(jī)器上,不僅對(duì)緩存的內(nèi)容有好處,對(duì)非緩存的內(nèi)容同樣有利,因?yàn)橥泄芩鼈兊闹鳈C(jī)的負(fù)擔(dān)減輕了。
注意: 緩存涉及開(kāi)發(fā)、決策和運(yùn)維,完善的緩存策略,比如本文提到的這些,能夠體現(xiàn)從DevOps角度考慮的價(jià)值。也說(shuō)是說(shuō),開(kāi)發(fā)人員、架構(gòu)師、運(yùn)維人員此時(shí)攜手,共同保障一個(gè)網(wǎng)站的功能、響應(yīng)時(shí)間、安全和業(yè)務(wù)目標(biāo)。


會(huì)話(huà)緩存。使用ssl_session_cache指令開(kāi)啟緩存,緩存每次SSL/STL連接時(shí)用到的參數(shù)。 會(huì)話(huà)票或ID。把特定SSL/TLS會(huì)話(huà)的信息保存為一個(gè)會(huì)話(huà)票或ID,以便連接重用,而不必重新握手。 OCSP封套。通過(guò)緩存SSL/TLS證書(shū)信息減少握手時(shí)間。

文件描述符。NGINX對(duì)每個(gè)連接最多使用兩個(gè)文件描述符。如果系統(tǒng)服務(wù)于很多連接,可能需要增大sys.fs.file_max這個(gè)對(duì)描述符的系統(tǒng)級(jí)限制,以及nofile這個(gè)用戶(hù)文件描述符限制,以支持增大后的負(fù)載。 臨時(shí)端口。在作為代理使用時(shí),NGINX會(huì)為每個(gè)上游服務(wù)器創(chuàng)建臨時(shí)端口??梢栽O(shè)置net.ipv4.ip_local_port_range,增大端口值的范圍,以增加可用的端口量。此外,還可以減小net.ipv4.tcp_fin_timeout的值,它控制非活動(dòng)端口釋放重用的等待時(shí)間,加快周轉(zhuǎn)。 對(duì)NGINX而言,請(qǐng)參考NGINX性能調(diào)優(yōu)指南,了解如何不費(fèi)吹灰之力將你的Linux系統(tǒng)優(yōu)化為能夠支持更大的吞吐量。
訪問(wèn)日志。不要每個(gè)請(qǐng)求的日志都馬上寫(xiě)到磁盤(pán),可以在內(nèi)存里做個(gè)緩存,然后批量定入。對(duì)NGINX而言,將buffer=_size_參數(shù)添加到access_log指令,等內(nèi)存緩沖區(qū)寫(xiě)滿(mǎn)后再把日志寫(xiě)到磁盤(pán)。如果你添加了**flush=_time_**參數(shù),那么緩沖區(qū)的內(nèi)容也會(huì)按照指定時(shí)間寫(xiě)入磁盤(pán)。 緩沖。緩沖用于在內(nèi)存里保存部分響應(yīng),直到緩沖區(qū)被填滿(mǎn),可以實(shí)現(xiàn)對(duì)客戶(hù)端更有效的響應(yīng)。無(wú)法寫(xiě)入內(nèi)存的響應(yīng)會(huì)被寫(xiě)到磁盤(pán),從而降低性能。在NGINX的緩沖啟用時(shí),可以使用proxy_buffer_size和proxy_buffers指令來(lái)管理它。 客戶(hù)端活動(dòng)連接?;顒?dòng)連接可以減少時(shí)間消耗,特別是在使用SSL/TLS的情下。對(duì)NGINX而言,可以針對(duì)客戶(hù)端提高keepalive_requests的數(shù)值,默認(rèn)值為100;也可以增大keepalive_timeout的值,讓活動(dòng)連接持續(xù)時(shí)間更長(zhǎng),從而讓后續(xù)請(qǐng)求得到更快響應(yīng)。 上游活動(dòng)連接。上游連接,即連接到應(yīng)用服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器的連接,同樣可以從活動(dòng)連接的設(shè)置中獲得好處。對(duì)上游連接來(lái)說(shuō),可以增加活動(dòng)連接,也就是每個(gè)工作進(jìn)程可用的空閑活動(dòng)連接的數(shù)量。這樣可以增進(jìn)連接重用,減少重開(kāi)連接。關(guān)于活動(dòng)連接的更多信息,請(qǐng)參考這篇博客。 限制。限制客戶(hù)端使用的資源可以提升性能和安全性。對(duì)NGINX而言,limit_conn和limit_conn_zone指令限制指定源的連接數(shù),而limit_rate限制帶寬。這些設(shè)置可以防止合法用戶(hù)“侵吞”資源,同時(shí)也有助于防止攻擊。limit_req和limit_req_zone指令限制客戶(hù)端請(qǐng)求。對(duì)于到上游服務(wù)器的連接,可以在上游配置區(qū)的服務(wù)器指令中使用max_conns參數(shù),它限制對(duì)上游服務(wù)器的連接,防止過(guò)載。相關(guān)的隊(duì)列指令會(huì)創(chuàng)建一個(gè)隊(duì)列,在max_conns限制到達(dá)后將指定的請(qǐng)求數(shù)保存指定的時(shí)間。 工作進(jìn)程。工作進(jìn)程負(fù)責(zé)處理請(qǐng)求。NGINX采用基于事件的模型和OS相關(guān)的機(jī)制有效地在工作進(jìn)程間分配請(qǐng)求。建議將worker_processes的值設(shè)置為每個(gè)CPU一個(gè)工作進(jìn)程。如果需要,大多數(shù)系統(tǒng)都支持提高worker_connections的值(默認(rèn)為512)。可以通過(guò)試驗(yàn)找到最適合你系統(tǒng)的這個(gè)值。 套接字分片。通常,一個(gè)套接字監(jiān)聽(tīng)器向所有工作進(jìn)程分發(fā)新連接。套按字分片則為每個(gè)工作進(jìn)程都創(chuàng)建一個(gè)套接字監(jiān)聽(tīng)器,由內(nèi)核在套接字監(jiān)聽(tīng)器可用時(shí)為其指定連接。這樣可以減少鎖爭(zhēng)用,提升多核系統(tǒng)上的性能。要啟用套接字分片,在listen指令中包含reuseport參數(shù)。 線(xiàn)程池。一個(gè)費(fèi)時(shí)的操作會(huì)阻塞任何計(jì)算機(jī)進(jìn)程。對(duì)Web服務(wù)器軟件來(lái)說(shuō),磁盤(pán)訪問(wèn)可能阻礙很多較快的操作,比如內(nèi)存中的計(jì)算和復(fù)制。在使用線(xiàn)程池的情況下,慢操作會(huì)被指定給一組獨(dú)立的任務(wù),而主處理循環(huán)會(huì)繼續(xù)運(yùn)行較快的操作。磁盤(pán)操作完成后,結(jié)果會(huì)返回到主處理循環(huán)。在NGINX中,read()系統(tǒng)調(diào)用和sendfile()被轉(zhuǎn)載到了線(xiàn)程池。


反向代理服務(wù)器及負(fù)載均衡。沒(méi)有負(fù)載均衡或池負(fù)載均衡,可能導(dǎo)致極低的性能。添加一個(gè)反向代理服務(wù)器,比如NGINX,可以減少Web應(yīng)用在內(nèi)存和磁盤(pán)之間的往返。負(fù)載均衡可以把任務(wù)從過(guò)載的服務(wù)器轉(zhuǎn)移到空閑的服務(wù)器,也便于擴(kuò)展。這些改變能極大地提升性能,與原有的部署方式最差的時(shí)候相比,10倍性能提升是很輕松的事,即使不到10倍那也在總體上有了質(zhì)的飛躍。 緩存動(dòng)態(tài)和靜態(tài)內(nèi)容。如果你的Web服務(wù)器同時(shí)又充當(dāng)了應(yīng)用服務(wù)器,那么通過(guò)緩存動(dòng)態(tài)內(nèi)容就可以達(dá)到高峰期10倍的性能提升。緩存靜態(tài)內(nèi)容也可以有幾倍的性能提升。 壓縮數(shù)據(jù)。使用JPEG、PNG、MPEG-4以及MP3等壓縮格式能顯著提升性能。如果這些手段都用上了,那么壓縮的文本數(shù)據(jù)(代碼及HTML)可以將初始頁(yè)面加載時(shí)間提升兩倍。 優(yōu)化SSL/TLS。安全握手對(duì)性能有很大影響,因此對(duì)其進(jìn)行優(yōu)化可以讓初次響應(yīng)加快兩倍,對(duì)于文本內(nèi)容較多的網(wǎng)站尤其如此。優(yōu)化SSL/TLS下的媒體文件帶來(lái)的性能提升很小。 實(shí)施HTTP/2和SPDY。在使用SSL/TLS的情況下,這兩個(gè)協(xié)議有可能提升網(wǎng)站的整體性能。 調(diào)優(yōu)Linux和Web服務(wù)器。使用優(yōu)化的緩沖策略、使用活動(dòng)連接,將耗時(shí)的任務(wù)轉(zhuǎn)載至獨(dú)立的線(xiàn)程池,可以顯著提升性能。比如線(xiàn)程池可以將磁盤(pán)操作密集性任務(wù)的性能提升至少一個(gè)數(shù)量級(jí)
來(lái)源:nginx.com/blog/10-tips-for-10x-application-performance/
版權(quán)申明:內(nèi)容來(lái)源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無(wú)法確認(rèn),我們都會(huì)標(biāo)明作者及出處,如有侵權(quán)煩請(qǐng)告知,我們會(huì)立即刪除并表示歉意。謝謝!

評(píng)論
圖片
表情
