`Nginx` 作為一個基于 `C` 實現(xiàn)的高性能 `Web` 服務器贮尖,具有高并發(fā)、高可靠性闷袒、高擴展性、開源等特點臂痕。
1. Nginx的主要三個應用場景
請求到達 --> nginx:靜態(tài)資源服務伯襟、API服務、反向代理服務
1. 靜態(tài)資源服務:通過本地文件系統(tǒng)提供服務握童;
2. 反向代理服務:緩存加速姆怪、負載均衡;
3. API服務:OpenResty
2. OpenResty:一種整合Nginx和lua的框架澡绩,由Nginx核心和很多第三方模塊組成稽揭;
1. 默認集成了Lua開發(fā)環(huán)境,使得Nginx可以作為一個WebServer使用肥卡;
2. 借助于Nginx的事件驅(qū)動模型和非阻塞IO溪掀,可以實現(xiàn)高性能的Web應用程序;
3. OpenResty提供了大量組件如Mysql步鉴、Redis揪胃、Memcached等等,使得在Nginx上開發(fā)Web應用更方便氛琢、簡單喊递。
3. lua
1. Lua 是一個小巧的腳本語言,作者是巴西人阳似,目的是為了嵌入應用程序中册舞,從而為應用程序提供靈活的擴展和定制功能;
2. Lua腳本可以很容易被C/C++代碼調(diào)用障般,也可以反過來調(diào)用C/C++的函數(shù)调鲸,使得Lua在應用程序中可以被廣泛應用;
3. Lua不僅僅作為擴展腳本挽荡,也可以作為普通的配置文件藐石,代替XML, ini等文件格式,并且更容易理解和維護定拟;
4. Lua由標準C編寫而成于微,代碼簡潔優(yōu)美,幾乎在所有操作系統(tǒng)和平臺上都可以編譯青自,運行株依;
5. 一個完整的Lua解釋器不過200KB,在目前所有腳本引擎中延窜,Lua的速度是最快的恋腕,這一切都決定了Lua是作為嵌入式腳本的最佳選擇。
4. Nginx的優(yōu)點
1. 輕量級逆瑞,同樣起web服務比apache占用更少內(nèi)存及資源荠藤;
2. Nginx 異步非阻塞的方式處理高并發(fā)請求伙单,能保持低資源、低消耗哈肖、高性能吻育;
3. 高度模塊化設計,編寫模塊相對簡單淤井,生態(tài)圈強大布疼。
4. 核心有點:高并發(fā)、高性能币狠、高可擴展缎除、高可靠性、熱部署总寻、BSD許可證器罐。
5. Nginx為什么性能高、占用內(nèi)存少渐行?
1. Nginx采用多進程模式轰坊,對每個worker進程來說,獨立的進程不需要加鎖祟印,互不影響肴沫;
2. 一個進程退出后,其他進程繼續(xù)工作蕴忆,服務不會中斷颤芬,master進程則很快啟動新的worker進程;
3. worker進程異常退出肯定是程序有bug導致套鹅,但也只會影響當前worker上的請求站蝠,不會影響到其他進程的請求,降低風險卓鹿;
4. Nginx采用異步非阻塞的方式去處理請求菱魔,更加高效。
6. Nginx組成:
1. 二進制可執(zhí)行文件:由各模塊源碼編出的一個文件吟孙;
2. 配置文件:控制Nginx的行為澜倦;
3. 訪問日志:記錄每一條http請求信息;
4. 錯誤日志:定位問題杰妓。
Nginx的編譯安裝(Linux)
1. 下載nginx壓縮包:wget http://nginx.org/download/nginx-1.15.9.tar.gz
2. 解壓目錄結構:
1. auto目錄:輔助編譯等功能藻治;
2. conf目錄中是示例配置文件;
3. configure腳本:生成中間文件巷挥,執(zhí)行編譯前的必備動作桩卵;
4. 把contrib/vim下的文件移入~/.vim目錄下,讓vim識別nginx的配置文件節(jié)點;
cp -r contrib/vim/* ~/.vim ---> vim conf/nginx.conf 打開配置文件 */
5. html目錄:50x.html和index.html(Nginx歡迎頁)吸占,發(fā)生500錯誤會重定向到50x.html
6. man目錄:Linux對nginx的幫助文件晴叨;
7. src目錄:nginx的源代碼凿宾;
8. 查看configure支持的參數(shù):./configure --help
--prefix=path:使用默認參數(shù)矾屯,path表示nginx的安裝目錄
2. 編譯安裝
1. 開始編譯準備:./configure --prefix=/home/develop/nginx
2. 生成 objs 目錄,存放生成的中間文件初厚,其中 ngx_modules.c 決定了哪些模塊會被編譯進nginx
3. 執(zhí)行編譯:make件蚕,編譯完成后生成的中間文件和最終要運行的nginx二進制文件存放在 objs 目錄中;
4. 如果是執(zhí)行nginx版本升級产禾,不能執(zhí)行 make install 安裝排作,而是把 objs 中的目標文件nginx 拷貝到安裝目錄中;
5. C語言編譯生成的中間文件存放在 objs/src 中亚情;
6. 如果使用了動態(tài)模塊妄痪,其編譯生成的so文件也會存放在 objs 目錄中;
7. 首次安裝時楞件,執(zhí)行 make install
8. 安裝目錄nginx:sbin(二進制文件目錄)衫生,conf(配置文件目錄),logs(日志目錄)土浸,html(50x.html和index.html)
Nginx部署
1. 通用語法
1. 配置文件由指令與指令塊構成罪针;
2. 每條指令以 ; 結尾,指令與參數(shù)間以空格符分割黄伊;
3. 指令塊以 {} 將多條指令組織在一起泪酱;
4. include 語句允許組合多個配置文件,以提升可維護性还最;
5. 使用 # 添加注釋墓阀,提高可閱讀性;
6. 使用 $ 引用變量拓轻;
7. 部分指令的參數(shù)支持正則表達式岂津。
2. 配置參數(shù)
1. 時間單位:ms(毫秒)、s(秒)悦即、m(分鐘)吮成、h(小時)、d(天)辜梳、w(周)粱甫、M(月)、y(年)
2. 空間單位:不加任何單位表示bytes作瞄,k/K表示KB茶宵,m/M表示MB,g/G表示GB宗挥;
3. http配置的指令塊:http乌庶、server种蝶、location、upstream
4. nginx命令行
1. 啟動nginx:進入nginx/sbin目錄瞒大,執(zhí)行 ./nginx
2. 把nginx設置為全局命令:進入sbin目錄螃征,cp nginx /usr/sbin/
訪問本機IP地址如http://192.168.181.128/,進入Nginx的歡迎頁透敌,則安裝成功
3. nginx -h:幫助
4. nginx -c 配置文件路徑:使用指定的配置文件
5. nginx -g盯滚、-p:指定配置指令、指定運行目錄
6. nginx -t酗电、-T:測試配置文件是否有語法錯誤魄藕;
7. nginx -v、-V:nginx的版本信息撵术、編譯信息等背率;
8. 發(fā)送信號 -s
nginx -s stop:立刻停止服務
nginx -s quit:優(yōu)雅的停止服務
nginx -s reload:在nginx不停止的情況下重載配置文件
nginx -s reopen:重新開始記錄日志文件
5. 熱部署(熱升級)
1. 備份當前正在運行的舊版本nginx/sbin下的二進制文件nginx:cp nginx nginx.old
2. 在把新版本的二進制文件nginx拷貝到舊版本nginx/sbin目錄下:cp -r objs/nginx /home/dev/nginx/sbin/ -f
3. 通知nginx的master進程準備進行熱部署:kill -USR2 master進程ID
4. master進程會使用新版二進制文件nginx,啟動一個新的master進程嫩与,同時把請求都平滑過渡給新的master進程寝姿;
5. 舊的worker進程也不再監(jiān)聽80、443這樣的端口了蕴纳,新的請求都會交給新的worker進程
6. 通知舊的master進程優(yōu)雅的關閉其worker進程:kill -WINCH 舊master進程ID
7. 舊的master進程不會自動退出会油,以便于做版本回退,讓舊master進程拉起其worker進程古毛。
6. 日志切割
1. 在nginx正常運行的情況下翻翩,備份日志
2. 拷貝一份日志到其他文件,再執(zhí)行 nginx -s reopen稻薇,nginx會重新生成一個日志文件嫂冻;
3. 往往會用一個 shell 腳本,每隔一段時間塞椎,自動執(zhí)行一次日志備份和 reopen命令桨仿。
7. GoAccess:圖形化實時監(jiān)控Nginx的Log日志的工具,基于websocket
Nginx的架構
Nginx是多進程結構案狠,由一個Master進程服傍、多個子進程構成,子進程又分為Worder進程和Cache進程
1. 多進程結構保證了高可用性骂铁、高可靠性吹零,進程間的獨立性不會引發(fā)災難性問題;
2. 而多線程是共享內(nèi)存空間的拉庵,一旦引發(fā)內(nèi)存錯誤灿椅,會導致多線程所在的進程掛掉;
3. Worker進程有多個,負責處理請求茫蛹,Master進程負責監(jiān)控Worker進程操刀;
4. Cache進程又分為Cache manager和Cache loader,各有一個進程婴洼;
5. 進程間通信使用共享內(nèi)存骨坑,協(xié)同工作.
nginx進程管理:信號
1. Master進程
1. 監(jiān)控worker進程:CHLD,當子進程終止時窃蹋,會向Master進程發(fā)送 CHLD 信號卡啰;
如果Worker進程意外終止静稻,Master進程能通過 CHLD 信號重新拉起Worker進程警没;
2. 管理worker進程:通常不會直接向worker進程發(fā)送信號,而是通過向Master進程發(fā)送信號振湾,管理Worker進程杀迹;
3. nginx命令發(fā)送的信號:
TERM、INT(立刻停止Nginx進程)押搪,QUIT(優(yōu)雅地停止Nginx進程)树酪,
HUP(重載配置文件),USR1(重新打開日志文件大州,做日志文件地切割)
4. Linux命令kill 發(fā)送的信號:USR2续语,WINCH(nginx還沒有對應的nginx命令)
2. Worker進程:TERM、INT厦画,QUIT疮茄,USR1,WINCH
1. nginx命令:
reload:HUP根暑,reopen:USR1力试,stop:TERM,quit:QUIT
3. 熱升級流程
1. 將舊nginx二進制文件備份排嫌,然后替換成新nginx二進制文件畸裳;
2. 向master進程發(fā)送USR2信號;
3. master進程修改pid文件名淳地,加后綴.oldbin
4. master進程用新nginx二進制文件啟動新master進程怖糊;
5. 向老master進程發(fā)送WINCH信號,關閉老worker進程颇象;
6. 回滾:向老master進程發(fā)送HUP伍伤,向新master發(fā)送QUIT。
4. 優(yōu)雅的關閉Workder進程
1. 優(yōu)雅的關閉主要針對http請求夯到,因為諸如websocket連接嚷缭,nginx無法判定是否處于通信狀態(tài);
2. Worker進程可以識別當前的進程沒有http處理請求,盡可能不讓用戶接收到連接失斣乃路幸;
3. 關閉過程:
1. 設置定時器:worker_shutdown_timeout,加上標志位
2. 關閉監(jiān)聽句柄:不在接受新的請求連接
3. 關閉空閑連接
4. 在循環(huán)中等待全部連接關閉:如果定時時間到了付翁,請求還沒有處理完成简肴,仍然強制關閉
5. 退出進程
5. Nginx事件收集、分發(fā)器的驅(qū)動模型:epoll
6. Nginx中最常用的容器:紅黑樹
最后編輯于 :
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者