面試官:我想用Nginx提升系統(tǒng)10倍性能,你有哪些建議?


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

傳統(tǒng)服務器與NGINX Worker的比較

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


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

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


反向代理服務器及負載均衡。沒有負載均衡或池負載均衡,可能導致極低的性能。添加一個反向代理服務器,比如NGINX,可以減少Web應用在內(nèi)存和磁盤之間的往返。負載均衡可以把任務從過載的服務器轉(zhuǎn)移到空閑的服務器,也便于擴展。這些改變能極大地提升性能,與原有的部署方式最差的時候相比,10倍性能提升是很輕松的事,即使不到10倍那也在總體上有了質(zhì)的飛躍。 緩存動態(tài)和靜態(tài)內(nèi)容。如果你的Web服務器同時又充當了應用服務器,那么通過緩存動態(tài)內(nèi)容就可以達到高峰期10倍的性能提升。緩存靜態(tài)內(nèi)容也可以有幾倍的性能提升。 壓縮數(shù)據(jù)。使用JPEG、PNG、MPEG-4以及MP3等壓縮格式能顯著提升性能。如果這些手段都用上了,那么壓縮的文本數(shù)據(jù)(代碼及HTML)可以將初始頁面加載時間提升兩倍。 優(yōu)化SSL/TLS。安全握手對性能有很大影響,因此對其進行優(yōu)化可以讓初次響應加快兩倍,對于文本內(nèi)容較多的網(wǎng)站尤其如此。優(yōu)化SSL/TLS下的媒體文件帶來的性能提升很小。 實施HTTP/2和SPDY。在使用SSL/TLS的情況下,這兩個協(xié)議有可能提升網(wǎng)站的整體性能。 調(diào)優(yōu)Linux和Web服務器。使用優(yōu)化的緩沖策略、使用活動連接,將耗時的任務轉(zhuǎn)載至獨立的線程池,可以顯著提升性能。比如線程池可以將磁盤操作密集性任務的性能提升至少一個數(shù)量級。
---END--- 重磅!碼農(nóng)突圍-技術交流群已成立 掃碼可添加碼農(nóng)突圍助手,可申請加入碼農(nóng)突圍大群和細分方向群,細分方向已涵蓋:Java、Python、機器學習、大數(shù)據(jù)、人工智能等群。 一定要備注:開發(fā)方向+地點+學校/公司+昵稱(如Java開發(fā)+上海+拼夕夕+猴子),根據(jù)格式備注,可更快被通過且邀請進群 ▲長按加群 推薦閱讀
? ?干掉 "try catch " ???華為天才計劃開出201萬年薪招應屆生,我卻在小公司拿20w年薪,差距太TM大了! ???那些還在外包公司干的程序員們,快醒醒吧! ???面試官:為什么 HashMap 的加載因子是0.75? ?? 特朗普要求字節(jié)跳動放棄TikTok所有權,微軟考慮收購,網(wǎng)友:流氓,明搶哇? ?? 阿里一p7員工為了證明自己確實年入百萬,曬出了他的工資 最近面試BAT,整理一份面試資料《Java面試BAT通關手冊》,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數(shù)據(jù)庫、數(shù)據(jù)結構等等。 獲取方式:點“在看”,關注公眾號并回復?BAT?領取,更多內(nèi)容陸續(xù)奉上。 如有收獲,點個在看,誠摯感謝 明天見(??ω??)??
評論
圖片
表情

