Nginx

`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)系作者
  • 序言:七十年代末百侧,一起剝皮案震驚了整個濱河市砰识,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佣渴,老刑警劉巖辫狼,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辛润,居然都是意外死亡膨处,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門砂竖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來真椿,“玉大人,你說我怎么就攤上這事乎澄⊥幌酰” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵置济,是天一觀的道長解恰。 經(jīng)常有香客問我,道長舟肉,這世上最難降的妖魔是什么修噪? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮路媚,結果婚禮上黄琼,老公的妹妹穿的比我還像新娘。我一直安慰自己整慎,他們只是感情好脏款,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裤园,像睡著了一般撤师。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拧揽,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天剃盾,我揣著相機與錄音腺占,去河邊找鬼。 笑死痒谴,一個胖子當著我的面吹牛衰伯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播积蔚,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼意鲸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尽爆?” 一聲冷哼從身側響起怎顾,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漱贱,沒想到半個月后槐雾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡饱亿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年蚜退,在試婚紗的時候發(fā)現(xiàn)自己被綠了闰靴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彪笼。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚂且,靈堂內(nèi)的尸體忽然破棺而出配猫,到底是詐尸還是另有隱情,我是刑警寧澤杏死,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布泵肄,位于F島的核電站,受9級特大地震影響淑翼,放射性物質(zhì)發(fā)生泄漏腐巢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一玄括、第九天 我趴在偏房一處隱蔽的房頂上張望冯丙。 院中可真熱鬧,春花似錦遭京、人聲如沸胃惜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽船殉。三九已至,卻和暖如春斯嚎,著一層夾襖步出監(jiān)牢的瞬間利虫,已是汗流浹背挨厚。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糠惫,地道東北人幽崩。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像寞钥,于是被迫代替她去往敵國和親慌申。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355