Nginx是由俄羅斯軟件工程師Igor Sysoev(塞索耶夫)開(kāi)發(fā)的一個(gè)高性能的HTTP和反向代理服務(wù)器,基于C語(yǔ)言編寫(xiě)姜贡。
Nginx最大的特點(diǎn)是對(duì)高并發(fā)的支持和高效的負(fù)載均衡猾漫,在高并發(fā)的需求場(chǎng)景下蚣抗,是Apache服務(wù)器不錯(cuò)的替代品锉走。
Nginx用于WEB服務(wù)器吩谦,相較于Apache扇售,Nginx使用更少的資源前塔,支持更多的并發(fā)鏈接嚣艇,體現(xiàn)更高的效率。
能夠支持高達(dá)50000個(gè)并發(fā)的連接數(shù)的響應(yīng)华弓。(理論上Nginx支持的并發(fā)鏈接上限取決于你的內(nèi)存)
Nginx用于負(fù)載均衡服務(wù)器時(shí)食零,可以通過(guò)其負(fù)載均衡的內(nèi)置策略和擴(kuò)展實(shí)現(xiàn)。
將負(fù)載分?jǐn)偟讲煌姆?wù)單元寂屏,既保證服務(wù)的可用性贰谣,又保證響應(yīng)足夠快,給用戶(hù)良好的體驗(yàn)迁霎。
Nginx最早開(kāi)發(fā)這個(gè)產(chǎn)品的目的之一是作為郵件代理服務(wù)器吱抚。
Nginx的特性:
模塊化設(shè)計(jì)。較好的擴(kuò)展性考廉。
高可靠性:一個(gè)master process(監(jiān)控進(jìn)程)啟動(dòng)一或多個(gè)工作線(xiàn)程秘豹,每個(gè)線(xiàn)程響應(yīng)多個(gè)請(qǐng)求。
低內(nèi)存消耗:10000個(gè)keepalive連接在Nginx中僅消耗2.5MB內(nèi)存(官方數(shù)據(jù))
支持熱部署:不停機(jī)更新配置文件昌粤、更新日志文件憋肖、更新服務(wù)器程序版本
處理響應(yīng)請(qǐng)求快:在正常的情況下,單次請(qǐng)求會(huì)得到更快的響應(yīng)婚苹。在高峰期岸更,Nginx可以比其他的Web服務(wù)器更快的響應(yīng)請(qǐng)求。
Nginx的內(nèi)部結(jié)構(gòu)是由核心部分和一系列的功能模塊所組成膊升。
模塊化的優(yōu)點(diǎn):
使得每個(gè)模塊的功能相對(duì)簡(jiǎn)單怎炊,便于開(kāi)發(fā)和對(duì)系統(tǒng)進(jìn)行功能擴(kuò)展。
增強(qiáng)了Nginx源碼的可讀性廓译、可擴(kuò)充性和可維護(hù)性评肆。
Nginx的模塊:
從功能上分:
Handlers(處理器模塊)。此類(lèi)模塊直接處理請(qǐng)求非区,并進(jìn)行輸出內(nèi)容和修改headers信息等操作瓜挽。
Handlers處理器模塊一般只能有一個(gè)。
Filters (過(guò)濾器模塊)征绸。此類(lèi)模塊主要對(duì)其他處理器模塊輸出的內(nèi)容進(jìn)行修改操作久橙,最后由Nginx輸出。
Proxies (代理類(lèi)模塊)管怠。此類(lèi)模塊是Nginx的HTTP Upstream之類(lèi)的模塊
主要與后端一些服務(wù)比如FastCGI等進(jìn)行交互淆衷,實(shí)現(xiàn)服務(wù)代理和負(fù)載均衡等功能。
工作過(guò)程:
HTTP發(fā)出請(qǐng)求給Nginx內(nèi)核渤弛,Nginx內(nèi)核將請(qǐng)求發(fā)送給一個(gè)Handler處理器模塊祝拯,Handler處理HTTP請(qǐng)求,產(chǎn)生輸出給Filter
過(guò)濾器模塊她肯,過(guò)濾器模塊將內(nèi)容進(jìn)行處理產(chǎn)生新的輸出佳头,將輸出發(fā)送給HTTP鹰贵,HTTP響應(yīng)請(qǐng)求。
從結(jié)構(gòu)上分:
核心模塊:構(gòu)建nginx基礎(chǔ)服務(wù)康嘉,管理其他模塊砾莱。HTTP模塊、EVENT模塊和MAIL模塊
基礎(chǔ)模塊(HTTP核心模塊):HTTP Access模塊凄鼻、HTTP FastCGI模塊腊瑟、HTTP Proxy模塊和HTTP Rewrite模塊,
第三方模塊:HTTP Upstream Request Hash模塊块蚌、Notice模塊和HTTP Access Key模塊闰非。
核心模塊:
ngx_mail_module(定義mail模塊)————————→Mail模塊
ngx_http_module(定義http模塊)————————→Http模塊
ngx_openssl_module
ngx_events_module(定義事件event模塊)——→Event模塊
ngx_errlog_module
ngx_core_module
配置模塊:ngx_conf_module
Nginx的策略
內(nèi)置策略有3種,輪詢(xún)峭范、加權(quán)輪詢(xún)财松、IP hash
Nginx 默認(rèn)提供輪詢(xún)(round robin)作為負(fù)載均衡策略。
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器纱控,如果后端服務(wù)器down掉辆毡,能自動(dòng)剔除。
加權(quán)輪詢(xún)(weighted round robin)
指定輪詢(xún)幾率甜害,weight和訪(fǎng)問(wèn)比率成正比舶掖,用于后端服務(wù)器性能不均的情況。
IP Hash
每個(gè)請(qǐng)求按訪(fǎng)問(wèn)ip的hash結(jié)果分配尔店,這樣每個(gè)訪(fǎng)客固定訪(fǎng)問(wèn)一個(gè)后端服務(wù)器眨攘,可以解決session的問(wèn)題。
擴(kuò)展策略有2種嚣州,url hash鲫售、fair
Fair
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配该肴。
url_hash
按訪(fǎng)問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求情竹,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效匀哄。
tips:
upstream bakend{? #定義負(fù)載均衡設(shè)備的Ip及設(shè)備狀態(tài)
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用負(fù)載均衡的server中增加
proxy_pass http://bakend/;
每個(gè)設(shè)備的狀態(tài)設(shè)置為:
1.down 表示單前的server暫時(shí)不參與負(fù)載
2.weight 默認(rèn)為1.weight越大秦效,負(fù)載的權(quán)重就越大。
3.max_fails :允許請(qǐng)求失敗的次數(shù)默認(rèn)為1.當(dāng)超過(guò)最大次數(shù)時(shí)拱雏,返回proxy_next_upstream 模塊定義的錯(cuò)誤
4.fail_timeout:max_fails次失敗后棉安,暫停的時(shí)間底扳。
5.backup: 其它所有的非backup機(jī)器down或者忙的時(shí)候铸抑,請(qǐng)求backup機(jī)器。所以這臺(tái)機(jī)器壓力會(huì)最輕衷模。
Nginx的進(jìn)程詳解
主進(jìn)程主要完成如下工作:
讀取并驗(yàn)證配置信息鹊汛;
創(chuàng)建蒲赂、綁定及關(guān)閉套接字;
啟動(dòng)刁憋、終止及維護(hù)worker進(jìn)程的個(gè)數(shù)滥嘴;
無(wú)須中止服務(wù)而重新配置工作特性;
控制非中斷式程序升級(jí)至耻,啟用新的二進(jìn)制程序并在需要時(shí)回滾至老版本若皱;
重新打開(kāi)日志文件,實(shí)現(xiàn)日志滾動(dòng)尘颓;
編譯嵌入式perl腳本走触;
worker進(jìn)程主要完成的任務(wù)包括:
接收、傳入并處理來(lái)自客戶(hù)端的連接疤苹;
提供反向代理及過(guò)濾功能互广;
nginx任何能完成的其它任務(wù);
cache loader進(jìn)程主要完成的任務(wù)包括:
檢查緩存存儲(chǔ)中的緩存對(duì)象卧土;
使用緩存元數(shù)據(jù)建立內(nèi)存數(shù)據(jù)庫(kù)惫皱;
cache manager進(jìn)程的主要任務(wù):
緩存的失效及過(guò)期檢驗(yàn);
進(jìn)程和線(xiàn)程的區(qū)別
一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程尤莺。