1. Nginx的主要三個(gè)應(yīng)用場景
? ? 請求到達(dá) --> nginx:靜態(tài)資源服務(wù)望浩、API服務(wù)瀑晒、反向代理服務(wù)
? ? 1. 靜態(tài)資源服務(wù):通過本地文件系統(tǒng)提供服務(wù);
? ? 2. 反向代理服務(wù):緩存加速、負(fù)載均衡赚瘦;
? ? 3. API服務(wù):OpenResty
2. OpenResty:一種整合Nginx和lua的框架,由Nginx核心和很多第三方模塊組成奏寨;
? ? 1. 默認(rèn)集成了Lua開發(fā)環(huán)境起意,使得Nginx可以作為一個(gè)WebServer使用;
? ? 2. 借助于Nginx的事件驅(qū)動(dòng)模型和非阻塞IO服爷,可以實(shí)現(xiàn)高性能的Web應(yīng)用程序杜恰;
? ? 3. OpenResty提供了大量組件如Mysql、Redis仍源、Memcached等等心褐,使得在Nginx上開發(fā)Web應(yīng)用更方便、簡單笼踩。
3. lua
? ? 1. Lua 是一個(gè)小巧的腳本語言逗爹,作者是巴西人,目的是為了嵌入應(yīng)用程序中嚎于,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能掘而;
? ? 2. Lua腳本可以很容易被C/C++代碼調(diào)用,也可以反過來調(diào)用C/C++的函數(shù)于购,使得Lua在應(yīng)用程序中可以被廣泛應(yīng)用袍睡;
? ? 3. Lua不僅僅作為擴(kuò)展腳本,也可以作為普通的配置文件肋僧,代替XML, ini等文件格式斑胜,并且更容易理解和維護(hù);
? ? 4. Lua由標(biāo)準(zhǔn)C編寫而成嫌吠,代碼簡潔優(yōu)美止潘,幾乎在所有操作系統(tǒng)和平臺(tái)上都可以編譯,運(yùn)行辫诅;
? ? 5. 一個(gè)完整的Lua解釋器不過200KB凭戴,在目前所有腳本引擎中,Lua的速度是最快的炕矮,這一切都決定了Lua是作為嵌入式腳本的最佳選擇么夫。
4. Nginx的優(yōu)點(diǎn)
? ? 1. 輕量級,同樣起web服務(wù)比apache占用更少內(nèi)存及資源肤视;
? ? 2. Nginx 異步非阻塞的方式處理高并發(fā)請求魏割,能保持低資源、低消耗钢颂、高性能;
? ? 3. 高度模塊化設(shè)計(jì)拜银,編寫模塊相對簡單殊鞭,生態(tài)圈強(qiáng)大遭垛。
? ? 4. 核心有點(diǎn):高并發(fā)、高性能操灿、高可擴(kuò)展锯仪、高可靠性、熱部署趾盐、BSD許可證庶喜。
5. Nginx為什么性能高、占用內(nèi)存少救鲤?
? ? 1. Nginx采用多進(jìn)程模式久窟,對每個(gè)worker進(jìn)程來說,獨(dú)立的進(jìn)程不需要加鎖本缠,互不影響斥扛;
? ? 2. 一個(gè)進(jìn)程退出后,其他進(jìn)程繼續(xù)工作丹锹,服務(wù)不會(huì)中斷稀颁,master進(jìn)程則很快啟動(dòng)新的worker進(jìn)程;
? ? 3. worker進(jìn)程異常退出肯定是程序有bug導(dǎo)致楣黍,但也只會(huì)影響當(dāng)前worker上的請求匾灶,不會(huì)影響到其他進(jìn)程的請求,降低風(fēng)險(xiǎn)租漂;
? ? 4. Nginx采用異步非阻塞的方式去處理請求阶女,更加高效。
6. Nginx組成:
? ? 1. 二進(jìn)制可執(zhí)行文件:由各模塊源碼編出的一個(gè)文件窜锯;
? ? 2. 配置文件:控制Nginx的行為张肾;
? ? 3. 訪問日志:記錄每一條http請求信息;
? ? 4. 錯(cuò)誤日志:定位問題锚扎。
Nginx的編譯安裝(Linux)
1.下載nginx壓縮包:wget http://nginx.org/download/nginx-1.15.9.tar.gz2.解壓目錄結(jié)構(gòu):1.auto目錄:輔助編譯等功能吞瞪;2.conf目錄中是示例配置文件;3.configure腳本:生成中間文件驾孔,執(zhí)行編譯前的必備動(dòng)作芍秆;4.把contrib/vim下的文件移入~/.vim目錄下,讓vim識別nginx的配置文件節(jié)點(diǎn)翠勉;? ? ? cp -r contrib/vim/* ~/.vim? ---> vim conf/nginx.conf 打開配置文件 */5.html目錄:50x.html和index.html(Nginx歡迎頁)妖啥,發(fā)生500錯(cuò)誤會(huì)重定向到50x.html6.man目錄:Linux對nginx的幫助文件;7.src目錄:nginx的源代碼对碌;8.查看configure支持的參數(shù):./configure --help? ? ? --prefix=path:使用默認(rèn)參數(shù)荆虱,path表示nginx的安裝目錄2.編譯安裝1.開始編譯準(zhǔn)備:./configure --prefix=/home/develop/nginx2.生成 objs 目錄,存放生成的中間文件,其中 ngx_modules.c 決定了哪些模塊會(huì)被編譯進(jìn)nginx3.執(zhí)行編譯:make怀读,編譯完成后生成的中間文件和最終要運(yùn)行的nginx二進(jìn)制文件存放在 objs 目錄中诉位;4.如果是執(zhí)行nginx版本升級,不能執(zhí)行 make install 安裝菜枷,而是把 objs 中的目標(biāo)文件nginx 拷貝到安裝目錄中苍糠;5.C語言編譯生成的中間文件存放在 objs/src 中;6.如果使用了動(dòng)態(tài)模塊啤誊,其編譯生成的so文件也會(huì)存放在 objs 目錄中岳瞭;7.首次安裝時(shí),執(zhí)行 make install8.安裝目錄nginx:sbin(二進(jìn)制文件目錄)蚊锹,conf(配置文件目錄)瞳筏,logs(日志目錄),html(50x.html和index.html)
Nginx部署
1. 通用語法1. 配置文件由指令與指令塊構(gòu)成枫耳;2. 每條指令以 ; 結(jié)尾乏矾,指令與參數(shù)間以空格符分割;3. 指令塊以 {} 將多條指令組織在一起迁杨;4.include語句允許組合多個(gè)配置文件钻心,以提升可維護(hù)性;5. 使用# 添加注釋铅协,提高可閱讀性捷沸;6. 使用 $ 引用變量;7. 部分指令的參數(shù)支持正則表達(dá)式狐史。2. 配置參數(shù)1. 時(shí)間單位:ms(毫秒)痒给、s(秒)、m(分鐘)骏全、h(小時(shí))苍柏、d(天)、w(周)姜贡、M(月)试吁、y(年)2. 空間單位:不加任何單位表示bytes,k/K表示KB楼咳,m/M表示MB熄捍,g/G表示GB;3. http配置的指令塊:http母怜、server余耽、location、upstream4. nginx命令行1. 啟動(dòng)nginx:進(jìn)入nginx/sbin目錄苹熏,執(zhí)行 ./nginx2. 把nginx設(shè)置為全局命令:進(jìn)入sbin目錄犬钢,cp nginx /usr/sbin/? ? 訪問本機(jī)IP地址如http://192.168.181.128/,進(jìn)入Nginx的歡迎頁淮逊,則安裝成功3. nginx -h:幫助4. nginx -c 配置文件路徑:使用指定的配置文件5. nginx -g、-p:指定配置指令粱锐、指定運(yùn)行目錄6. nginx -t、-T:測試配置文件是否有語法錯(cuò)誤扛邑;7. nginx -v、-V:nginx的版本信息铐然、編譯信息等蔬崩;8. 發(fā)送信號 -s? ? ? ? nginx -s stop:立刻停止服務(wù)? ? ? ? nginx -s quit:優(yōu)雅的停止服務(wù)? ? ? ? nginx -s reload:在nginx不停止的情況下重載配置文件? ? ? ? nginx -s reopen:重新開始記錄日志文件5. 熱部署(熱升級)1. 備份當(dāng)前正在運(yùn)行的舊版本nginx/sbin下的二進(jìn)制文件nginx:cp nginx nginx.old2. 在把新版本的二進(jìn)制文件nginx拷貝到舊版本nginx/sbin目錄下:cp -r objs/nginx /home/dev/nginx/sbin/ -f3. 通知nginx的master進(jìn)程準(zhǔn)備進(jìn)行熱部署:kill -USR2 master進(jìn)程ID4. master進(jìn)程會(huì)使用新版二進(jìn)制文件nginx,啟動(dòng)一個(gè)新的master進(jìn)程搀暑,同時(shí)把請求都平滑過渡給新的master進(jìn)程沥阳;5. 舊的worker進(jìn)程也不再監(jiān)聽80、443這樣的端口了自点,新的請求都會(huì)交給新的worker進(jìn)程6. 通知舊的master進(jìn)程優(yōu)雅的關(guān)閉其worker進(jìn)程:kill -WINCH 舊master進(jìn)程ID7. 舊的master進(jìn)程不會(huì)自動(dòng)退出桐罕,以便于做版本回退,讓舊master進(jìn)程拉起其worker進(jìn)程桂敛。6. 日志切割1. 在nginx正常運(yùn)行的情況下功炮,備份日志2. 拷貝一份日志到其他文件,再執(zhí)行 nginx -s reopen术唬,nginx會(huì)重新生成一個(gè)日志文件薪伏;3. 往往會(huì)用一個(gè) shell 腳本,每隔一段時(shí)間粗仓,自動(dòng)執(zhí)行一次日志備份和 reopen命令嫁怀。7. GoAccess:圖形化實(shí)時(shí)監(jiān)控Nginx的Log日志的工具,基于websocket
Nginx的架構(gòu)
Nginx是多進(jìn)程結(jié)構(gòu)借浊,由一個(gè)Master進(jìn)程塘淑、多個(gè)子進(jìn)程構(gòu)成,子進(jìn)程又分為Worder進(jìn)程和Cache進(jìn)程
? ? 1. 多進(jìn)程結(jié)構(gòu)保證了高可用性蚂斤、高可靠性存捺,進(jìn)程間的獨(dú)立性不會(huì)引發(fā)災(zāi)難性問題;
? ? 2. 而多線程是共享內(nèi)存空間的橡淆,一旦引發(fā)內(nèi)存錯(cuò)誤召噩,會(huì)導(dǎo)致多線程所在的進(jìn)程掛掉;
? ? 3. Worker進(jìn)程有多個(gè)逸爵,負(fù)責(zé)處理請求具滴,Master進(jìn)程負(fù)責(zé)監(jiān)控Worker進(jìn)程;
? ? 4. Cache進(jìn)程又分為Cache manager和Cache loader师倔,各有一個(gè)進(jìn)程构韵;
? ? 5. 進(jìn)程間通信使用共享內(nèi)存,協(xié)同工作.
nginx進(jìn)程管理:信號
1. Master進(jìn)程? ? 1. 監(jiān)控worker進(jìn)程:CHLD,當(dāng)子進(jìn)程終止時(shí)疲恢,會(huì)向Master進(jìn)程發(fā)送 CHLD 信號凶朗;? ? 如果Worker進(jìn)程意外終止,Master進(jìn)程能通過 CHLD 信號重新拉起Worker進(jìn)程显拳;? ? 2. 管理worker進(jìn)程:通常不會(huì)直接向worker進(jìn)程發(fā)送信號棚愤,而是通過向Master進(jìn)程發(fā)送信號,管理Worker進(jìn)程杂数;? ? 3. nginx命令發(fā)送的信號:? ? ? ? TERM宛畦、INT(立刻停止Nginx進(jìn)程),QUIT(優(yōu)雅地停止Nginx進(jìn)程)揍移,? ? ? ? HUP(重載配置文件)次和,USR1(重新打開日志文件,做日志文件地切割)? ? 4. Linux命令kill發(fā)送的信號:USR2那伐,WINCH(nginx還沒有對應(yīng)的nginx命令)2. Worker進(jìn)程:TERM踏施、INT,QUIT罕邀,USR1畅形,WINCH? ? 1. nginx命令:? ? reload:HUP,reopen:USR1燃少,stop:TERM束亏,quit:QUIT3. 熱升級流程? ? 1. 將舊nginx二進(jìn)制文件備份,然后替換成新nginx二進(jìn)制文件阵具;? ? 2. 向master進(jìn)程發(fā)送USR2信號碍遍;? ? 3. master進(jìn)程修改pid文件名,加后綴.oldbin? ? 4. master進(jìn)程用新nginx二進(jìn)制文件啟動(dòng)新master進(jìn)程阳液;? ? 5. 向老master進(jìn)程發(fā)送WINCH信號怕敬,關(guān)閉老worker進(jìn)程;? ? 6. 回滾:向老master進(jìn)程發(fā)送HUP帘皿,向新master發(fā)送QUIT东跪。4. 優(yōu)雅的關(guān)閉Workder進(jìn)程? ? 1. 優(yōu)雅的關(guān)閉主要針對http請求,因?yàn)橹T如websocket連接鹰溜,nginx無法判定是否處于通信狀態(tài)虽填;? ? 2. Worker進(jìn)程可以識別當(dāng)前的進(jìn)程沒有http處理請求,盡可能不讓用戶接收到連接失敳芏斋日;? ? 3. 關(guān)閉過程:? ? ? ? 1. 設(shè)置定時(shí)器:worker_shutdown_timeout,加上標(biāo)志位? ? ? ? 2. 關(guān)閉監(jiān)聽句柄:不在接受新的請求連接? ? ? ? 3. 關(guān)閉空閑連接? ? ? ? 4. 在循環(huán)中等待全部連接關(guān)閉:如果定時(shí)時(shí)間到了墓陈,請求還沒有處理完成恶守,仍然強(qiáng)制關(guān)閉? ? ? ? 5. 退出進(jìn)程5. Nginx事件收集第献、分發(fā)器的驅(qū)動(dòng)模型:epoll6. Nginx中最常用的容器:紅黑樹