nginx原理了解
1乏悄、什么是nginx?
Nginx
是一款自由的、開源的陕凹、高性能的HTTP服務(wù)器和反向代理服務(wù)器悍抑;同時(shí)也是一個(gè)IMAP、POP3杜耙、SMTP代理服務(wù)器搜骡;Nginx
可以作為一個(gè)HTTP服務(wù)器進(jìn)行網(wǎng)站的發(fā)布處理,另外Nginx
可以作為反向代理進(jìn)行負(fù)載均衡的實(shí)現(xiàn)佑女。
1.1记靡、Nginx三個(gè)主要應(yīng)用場(chǎng)
1谈竿、靜態(tài)資源服務(wù)(通過本地文件系統(tǒng)提供服務(wù))
2、緩存摸吠、負(fù)載均衡服務(wù)器
3榕订、API服務(wù)(OpenResty)
2、為什么選擇nginx?
(1)更快
????這表現(xiàn)在兩個(gè)方面:一方面蜕便,在正常情況下,單次請(qǐng)求會(huì)得到更快的響應(yīng)贩幻;另一方面轿腺,
在高峰期(如有數(shù)以萬計(jì)的并發(fā)請(qǐng)求),Nginx
可以比其他Web服務(wù)器更快地響應(yīng)請(qǐng)求丛楚。
實(shí)際上族壳,
(2)高擴(kuò)展性
????Nginx
的設(shè)計(jì)極具擴(kuò)展性,它完全是由多個(gè)不同功能趣些、不同層次仿荆、不同類型且耦合度極
低的模塊組成。因此坏平,當(dāng)對(duì)某一個(gè)模塊修復(fù) Bug 或進(jìn)行升級(jí)時(shí)拢操,可以專注于模塊自身,無須
在意其他舶替。
而且在HTTP模塊中令境,還設(shè)計(jì)了HTTP
過濾器模塊:一個(gè)正常的HTTP
模塊在處理
完請(qǐng)求后,會(huì)有一串HTTP
過濾器模塊對(duì)請(qǐng)求的結(jié)果進(jìn)行再處理顾瞪。
這樣舔庶,當(dāng)我們開發(fā)一個(gè)新的HTTP
模塊時(shí),不但可以使用諸如 HTTP
核心模塊陈醒、events模塊惕橙、log模塊 等不同層次或者不同類型的模塊,還可以原封不動(dòng)地復(fù)用大量已有的HTTP
過濾器模塊钉跷。
這種低耦合度的優(yōu)秀設(shè)計(jì)弥鹦,造就了Nginx
龐大的第三方模塊,當(dāng)然爷辙,公開的第三方模塊也如官方發(fā)布的模塊一樣容易使用惶凝。
Nginx
的模塊都是嵌入到二進(jìn)制文件中執(zhí)行的,無論官方發(fā)布的模塊還是第三方模塊都
是如此犬钢。這使得第三方模塊一樣具備極其優(yōu)秀的性能苍鲜,充分利用Nginx
的高并發(fā)特性,因
此玷犹,許多高流量的網(wǎng)站都傾向于開發(fā)符合自己業(yè)務(wù)特性的定制模塊混滔。
(3)高可靠
????高可靠性是我們選擇Nginx
的最基本條件洒疚,因?yàn)?code>Nginx的可靠性是大家有目共睹的,很多家高流量網(wǎng)站都在核心服務(wù)器上大規(guī)模使用Nginx
坯屿。Nginx
的高可靠性來自于其核心框架代碼的優(yōu)秀設(shè)計(jì)油湖、模塊設(shè)計(jì)的簡(jiǎn)單性;另外领跛,官方提供的常用模塊都非常穩(wěn)定乏德,每個(gè)worker
進(jìn)程相對(duì)獨(dú)立,master進(jìn)程在1個(gè)worker
進(jìn)程出錯(cuò)時(shí)可以快速“拉起”新的worker
子進(jìn)程提供服務(wù)吠昭。
(4)低內(nèi)存消耗
????一般情況下喊括,10000個(gè)非活躍的HTTP Keep-Alive連接在Nginx
中僅消耗2.5MB的內(nèi)存,這是Nginx
支持高并發(fā)連接的基礎(chǔ)矢棚。
(5)單機(jī)支持10萬以上的并發(fā)連接
????這是一個(gè)非常重要的特性郑什!隨著互聯(lián)網(wǎng)的迅猛發(fā)展和互聯(lián)網(wǎng)用戶數(shù)量的成倍增長(zhǎng),各大公司蒲肋、網(wǎng)站都需要應(yīng)付海量并發(fā)請(qǐng)求蘑拯,一個(gè)能夠在峰值期頂住10萬以上并發(fā)請(qǐng)求的 Server,
無疑會(huì)得到大家的青睞兜粘。理論上申窘,Nginx支持的并發(fā)連接上限取決于內(nèi)存,當(dāng)然孔轴,能夠及時(shí)地處理更多的并發(fā)請(qǐng)求偶洋,是與業(yè)務(wù)特點(diǎn)緊密相關(guān)的
(6)熱部署
????master管理進(jìn)程與worker
工作進(jìn)程的分離設(shè)計(jì),使得worker
能夠提供熱部署功能距糖,即可以在7×24小時(shí)不間斷服務(wù)的前提下玄窝,升級(jí)worker
的可執(zhí)行文件。當(dāng)然悍引,它也支持不停止服務(wù)就更新配置項(xiàng)恩脂、更換日志文件等功能。
(7)最自由的BSD許可協(xié)議
????這是worker
可以快速發(fā)展的強(qiáng)大動(dòng)力趣斤。BSD許可協(xié)議不只是允許用戶免費(fèi)使用worker
俩块,它還允許用戶在自己的項(xiàng)目中直接使用或修改worker
源碼,然后發(fā)布浓领。這吸引了無數(shù)開發(fā)者繼續(xù)為worker
貢獻(xiàn)自己的智慧玉凯。
3、Nginx相關(guān)的開源版本
????1联贩、阿里巴巴Tengine
Tengine是由淘寶網(wǎng)發(fā)起的Web服務(wù)器項(xiàng)目漫仆。它在Nginx的基礎(chǔ)上,針對(duì)大訪問量網(wǎng)站的需求泪幌,添加了很多高級(jí)功能和特性盲厌。
????2署照、openresty
OpenResty? 是一個(gè)基于 Nginx 與 Lua 的高性能 Web 平臺(tái),其內(nèi)部集成了大量精良的 Lua 庫吗浩、第三方模塊以及大多數(shù)的依賴項(xiàng)建芙。用于方便地搭建能夠處理超高并發(fā)、擴(kuò)展性極高的動(dòng)態(tài) Web 應(yīng)用懂扼、Web 服務(wù)和動(dòng)態(tài)網(wǎng)關(guān)禁荸。
3、Nginx高效的原因及原理解析
前面已經(jīng)大概了解了worker
阀湿,接下來我們要了解下worker
的基本架構(gòu)赶熟。
3.1、服務(wù)器的網(wǎng)絡(luò)服務(wù)模型
web服務(wù)器和客戶端是一對(duì)多的關(guān)系炕倘,Web服務(wù)器必須有能力同時(shí)為多個(gè)客戶端提供服務(wù)。一般來說完成并行處理請(qǐng)求工作有三種方式
1翰撑、單進(jìn)程阻塞的網(wǎng)絡(luò)服務(wù)器
???? ????
說明:
1罩旋、創(chuàng)建一個(gè)socket,綁定服務(wù)器端口(bind)眶诈,監(jiān)聽端口(listen)涨醋,在PHP中用stream_socket_server一個(gè)函數(shù)就能完成上面3個(gè)步驟
2、進(jìn)入while循環(huán)逝撬,阻塞在accept操作上浴骂,等待客戶端連接進(jìn)入。此時(shí)程序會(huì)進(jìn)入睡眠狀態(tài)宪潮,直到有新的客戶端發(fā)起connect到服務(wù)器溯警,操作系統(tǒng)會(huì)喚醒此進(jìn)程。accept函數(shù)返回客戶端連接的socket
3狡相、利用fread讀取客戶端socket當(dāng)中的數(shù)據(jù)收到數(shù)據(jù)后服務(wù)器程序進(jìn)行處理然后使用fwrite向客戶端發(fā)送響應(yīng)梯轻。長(zhǎng)連接的服務(wù)會(huì)持續(xù)與客戶端交互,而短連接服務(wù)一般收到響應(yīng)就會(huì)close尽棕。
缺點(diǎn):
一次只能處理一個(gè)連接喳挑,不支持多個(gè)長(zhǎng)連接同時(shí)處理
2、多進(jìn)程方式
多進(jìn)程方式指滔悉,服務(wù)器每當(dāng)收到一個(gè)客戶端請(qǐng)求時(shí)伊诵,就有服務(wù)器主進(jìn)程生成一個(gè)子進(jìn)程出來和客戶端建立連接進(jìn)行交互,直到連接斷開該子進(jìn)程就結(jié)束了回官。
說明:
前面流程一致就不補(bǔ)充了
1曹宴、程序啟動(dòng)后就會(huì)創(chuàng)建N個(gè)進(jìn)程。每個(gè)子進(jìn)程進(jìn)入 Accept歉提,等待新的連接進(jìn)入浙炼。當(dāng)客戶端連接到服務(wù)器時(shí)份氧,其中一個(gè)子進(jìn)程會(huì)被喚醒,開始處理客戶端請(qǐng)求弯屈,并且不再接受新的TCP連接蜗帜。
當(dāng)此連接關(guān)閉時(shí),子進(jìn)程會(huì)釋放资厉,重新進(jìn)入 Accept厅缺,參與處理新的連接。
這個(gè)模型的優(yōu)勢(shì)是完全可以復(fù)用進(jìn)程宴偿,不需要太多的上下文切換湘捎,比如php-fpm基于此模型來處理解析php
多進(jìn)程方式的優(yōu)點(diǎn)是設(shè)計(jì)簡(jiǎn)單,各個(gè)子進(jìn)程相對(duì)獨(dú)立窄刘,處理客戶端請(qǐng)求時(shí)彼此不受干擾窥妇;
缺點(diǎn)是操作系統(tǒng)生成一個(gè)子進(jìn)程需要進(jìn)行內(nèi)存復(fù)制等操作,在資源和時(shí)間上會(huì)產(chǎn)生一定的開銷娩践;當(dāng)有大量請(qǐng)求時(shí)活翩,會(huì)導(dǎo)致系統(tǒng)性能下降;
例如:即時(shí)聊天程序翻伺,一臺(tái)服務(wù)器可能要維持?jǐn)?shù)十萬的連接材泄,那么就要啟動(dòng)數(shù)十萬的進(jìn)程來維持。這顯然不可能
2吨岭、多線程方式
多線程方式指每當(dāng)服務(wù)器接收到一個(gè)請(qǐng)求后拉宗,會(huì)由服務(wù)器主進(jìn)程派生出一個(gè)線程出來和客戶端進(jìn)行交互。由于操作系統(tǒng)產(chǎn)生出一個(gè)線程的開銷遠(yuǎn)遠(yuǎn)小于一個(gè)進(jìn)程的開銷辣辫。故多線程方式在很大程度上減輕了Web服務(wù)器對(duì)系統(tǒng)資源的要求旦事。
缺點(diǎn):穩(wěn)定性!假設(shè)某個(gè)進(jìn)程突然關(guān)閉會(huì)造成整個(gè)進(jìn)程中的所有線程都崩潰急灭。
基于上面的模式我們發(fā)現(xiàn)單個(gè)進(jìn)程每次只能通過每次(accept)處理單個(gè)請(qǐng)求族檬,沒辦法一次性連接多個(gè)請(qǐng)求,需要的時(shí)候再處理呢化戳?
3单料、單進(jìn)程IO復(fù)用方
說明:
1、保存所有的socket,通過select模型点楼,監(jiān)聽socket描述符的可讀事件
2扫尖、Select會(huì)在內(nèi)核空間監(jiān)聽一旦發(fā)現(xiàn)socket可讀,會(huì)從內(nèi)核空間傳遞至用戶空間掠廓,在用戶空間通過邏輯判斷是服務(wù)端socket可讀换怖,還是客戶端的socket可讀
3、如果是服務(wù)端的socket可讀蟀瞧,說明有新的客戶端建立沉颂,將socket保留到監(jiān)聽數(shù)組當(dāng)中
4条摸、如果是客戶端的socket可讀,說明當(dāng)前已經(jīng)可以去讀取客戶端發(fā)送過來的內(nèi)容了铸屉,通過fread讀取socket內(nèi)容钉蒲,然后fwrite響應(yīng)給客戶端。
優(yōu)點(diǎn):性能最好彻坛!一個(gè)進(jìn)程或線程處理多個(gè)請(qǐng)求顷啼,不需要額外開銷,性能最好昌屉,資源占用最低钙蒙。
缺點(diǎn):穩(wěn)定性!某個(gè)進(jìn)程或線程出錯(cuò)间驮,可能導(dǎo)致大量請(qǐng)求無法處理躬厌,甚至導(dǎo)致整個(gè)服務(wù)宕機(jī),單進(jìn)程對(duì)于大量任務(wù)處理乏力
4.多進(jìn)程的master-workerIO復(fù)用方式
?? 4.1、nginx的基本架構(gòu)
1.Nginx啟動(dòng)后竞帽,會(huì)產(chǎn)生一個(gè)主進(jìn)程扛施,主進(jìn)程執(zhí)行一系列的工作后會(huì)產(chǎn)生一個(gè)或者多個(gè)工作進(jìn)程
2.在客戶端請(qǐng)求動(dòng)態(tài)站點(diǎn)的過程中,Nginx服務(wù)器還涉及和后端服務(wù)器的通信抢呆。Nginx將接收到的Web請(qǐng)求通過代理轉(zhuǎn)發(fā)到后端服務(wù)器煮嫌,由后端服務(wù)器進(jìn)行數(shù)據(jù)處理和組織笛谦;
3.Nginx為了提高對(duì)請(qǐng)求的響應(yīng)效率抱虐,降低網(wǎng)絡(luò)壓力,采用了緩存機(jī)制饥脑,將歷史應(yīng)答數(shù)據(jù)緩存到本地恳邀。保障對(duì)緩存文件的快速訪問
master進(jìn)程主要用來管理worker
進(jìn)程,具體包括以下主要功能:
(1)接收來自外界的信號(hào)灶轰。
(2)處理配置文件讀取谣沸。
(3)創(chuàng)建,綁定和關(guān)閉套接字
(4)啟動(dòng)笋颤,終止和維護(hù)配置的工作(worker)進(jìn)程數(shù)
(5)當(dāng)woker進(jìn)程退出后(異常情況下)乳附,會(huì)自動(dòng)重新啟動(dòng)新的woker進(jìn)程。
worker
進(jìn)程的主要任務(wù)是完成具體的任務(wù)邏輯伴澄。其主要關(guān)注點(diǎn)是與客戶端或后端真實(shí)服務(wù)器(此時(shí)worker
作為中間代理)之間的數(shù)據(jù)可讀/可寫等I/O交互事件赋除。
(1)接收客戶端請(qǐng)求汹忠;
(2)將請(qǐng)求一次送入各個(gè)功能模塊進(jìn)行過濾處理婉刀;
(3)與后端服務(wù)器通信,接收后端服務(wù)器處理結(jié)果腌且;
(4)數(shù)據(jù)緩存
(5)響應(yīng)客戶端請(qǐng)求
案例:實(shí)現(xiàn)一個(gè)簡(jiǎn)單的php多進(jìn)程版本的nginx
1敞嗡、能夠接收http請(qǐng)求
2颁糟、能夠響應(yīng)http
3航背、能夠接收多個(gè)客戶端長(zhǎng)連接請(qǐng)求
安裝pcntl模塊
http://cn2.php.net/distributions/php-7.1.14.tar.xz
tar xf php-7.1.14.tar.xz
cd php-7.1.14
cd ext/pcntl
phpize
./configure --with-php-config=/usr/bin/php-config
make
make install
echo "extension=pcntl.so" >> /etc/php.ini
從上面的代碼當(dāng)中我們發(fā)現(xiàn),如果是多進(jìn)程的模式棱貌,也就意味著我們需要大量的進(jìn)程玖媚,才能支持更多的連接請(qǐng)求,那么有沒有一種技術(shù)可以在一個(gè)進(jìn)程內(nèi)處理所有并發(fā)IO呢键畴?答案是有最盅,這就是IO復(fù)用技術(shù)。
4起惕、IO復(fù)用/EventLoop
? 1涡贱、IO復(fù)用是什么
????IO多路復(fù)用是指內(nèi)核一旦發(fā)現(xiàn)進(jìn)程指定的一個(gè)或者多個(gè)IO條件準(zhǔn)備讀取,它就通知該進(jìn)程惹想,目前支持I/O多路復(fù)用的系統(tǒng)調(diào)用有 select
问词,poll
,epoll
嘀粱,I/O多路復(fù)用就是通過一種機(jī)制激挪,一個(gè)進(jìn)程可以監(jiān)視多個(gè)描述符(socket),一旦某個(gè)描述符就緒(一般是讀就緒或者寫就緒)锋叨,能夠通知程序進(jìn)行相應(yīng)的讀寫操作垄分。
? 2、select跟poll
Select介紹
????監(jiān)視并等待多個(gè)文件描述符的屬性變化(可讀娃磺、可寫或錯(cuò)誤異常)薄湿。select
函數(shù)監(jiān)視的文件描述符分 3 類,分別是writefds偷卧、readfds豺瘤、和 exceptfds。調(diào)用后 select
會(huì)阻塞听诸,直到有描述符就緒(有數(shù)據(jù)可讀坐求、可寫、或者有錯(cuò)誤異常)晌梨,或者超時(shí)( timeout 指定等待時(shí)間)桥嗤,函數(shù)才返回。當(dāng) select
()函數(shù)返回后仔蝌,可以通過遍歷 fdset泛领,來找到就緒的描述符,并且描述符最大不能超過1024
Poll 介紹:
????poll
的機(jī)制與select
類似掌逛,與select
在本質(zhì)上沒有多大差別师逸,管理多個(gè)描述符也是進(jìn)行輪詢,根據(jù)描述符的狀態(tài)進(jìn)行處理,但是poll
沒有最大文件描述符數(shù)量的限制篓像。poll
和select
同樣存在一個(gè)缺點(diǎn)就是动知,包含大量文件描述符的數(shù)組被整體復(fù)制于用戶態(tài)和內(nèi)核的地址空間之間,而不論這些文件描述符是否就緒员辩,它的開銷隨著文件描述符數(shù)量的增加而線性增大盒粮。
問題:
????select/poll
問題很明顯,它們需要循環(huán)檢測(cè)連接是否有事件奠滑。如果服務(wù)器有上百萬個(gè)連接丹皱,在某一時(shí)間只有一個(gè)連接向服務(wù)器發(fā)送了數(shù)據(jù),select/poll
需要做循環(huán)100萬次宋税,其中只有1次是命中的摊崭,剩下的99萬9999次都是無效的,白白浪費(fèi)了CPU資源杰赛。
epoll
????epoll
是在2.6內(nèi)核中提出的呢簸,是之前的 poll
和 poll
的增強(qiáng)版本。相對(duì)于 select
和 poll
來說乏屯,epoll
更加靈活根时,沒有描述符限制,無需輪詢。epoll
使用一個(gè)文件描述符管理多個(gè)描述符辰晕,將用戶關(guān)系的文件描述符的事件存放到內(nèi)核的一個(gè)事件表中蛤迎。
簡(jiǎn)單點(diǎn)來說就是當(dāng)連接有I/O流事件產(chǎn)生的時(shí)候,epoll
就會(huì)去告訴進(jìn)程哪個(gè)連接有I/O流事件產(chǎn)生含友,然后進(jìn)程就去處理這個(gè)進(jìn)程替裆。
這里可以多加一個(gè)選擇worker
的原因,因?yàn)?code>worker是基于epoll
的異步非阻塞的服務(wù)器程序唱较。自然扎唾,worker
能夠輕松處理10w+的并發(fā)連接召川,也就無可厚非了南缓。
實(shí)例
那么我們也可以基于 epoll
,實(shí)現(xiàn) IO復(fù)用異步非阻塞(eventloop
或者叫Reactor
),Event
是核心荧呐,Loop
是機(jī)制汉形,Loop
可以用 select|poll|epoll
中的任意方式實(shí)現(xiàn)。
IO復(fù)用異步非阻塞程序使用經(jīng)典的Reactor模型倍阐,Reactor顧名思義就是反應(yīng)堆的意思概疆,它本身不處理任何數(shù)據(jù)收發(fā)。只是可以監(jiān)視一個(gè)socket(也可以是管道峰搪、eventfd岔冀、信號(hào))句柄的事件變化。
注:什么是句柄概耻?句柄英文為handler使套,可以形象的比喻為鍋柄罐呼、勺柄。也就是資源的唯一標(biāo)識(shí)符侦高、資源的ID嫉柴。通過這個(gè)ID可以操作資源。
php要使用epoll機(jī)制需要安裝libevent依賴奉呛,或者是swoole當(dāng)中的event機(jī)制计螺,從使用角度上看swoole的event更加簡(jiǎn)單,這里編譯下swoole擴(kuò)展
安裝event依賴:
Swoole安裝方式跟普通擴(kuò)展安裝方式是一樣的瞧壮,下載解壓登馒、編譯
wget https://pecl.php.net/get/swoole-4.4.4.tgz
tar -zxf swoole-4.4.4.tgz
phpize
./configure
make
make install
五、進(jìn)程相
1咆槽、fork函
??fork函數(shù)將創(chuàng)建調(diào)用的進(jìn)程副本谊娇,并非根據(jù)完全不同的程序創(chuàng)建進(jìn)程,而是復(fù)制正在運(yùn)行的罗晕、調(diào)用fork函數(shù)的進(jìn)程济欢,但因?yàn)橥ㄟ^同一個(gè)進(jìn)程、復(fù)制相同的內(nèi)存空間小渊,之后需要根據(jù)返回值加以區(qū)分:
父進(jìn)程空間:fork函數(shù)會(huì)返回子進(jìn)程id
子進(jìn)程空間:fork函數(shù)返回0
如果小于0法褥,說明進(jìn)程創(chuàng)建失敗
2、處理僵尸進(jìn)程
對(duì)于多進(jìn)程程序而言酬屉,父進(jìn)程一般需要跟蹤子進(jìn)程的退出狀態(tài)半等。因此,當(dāng)子進(jìn)程結(jié)束運(yùn)行時(shí)呐萨,內(nèi)核不會(huì)立即釋放該進(jìn)程的進(jìn)程表表項(xiàng)杀饵,以滿足父進(jìn)程后續(xù)對(duì)該子進(jìn)程退出信息的查詢 (如果父進(jìn)程還在運(yùn)行)。
在子進(jìn)程結(jié)束運(yùn)行之后谬擦,父進(jìn)程讀取其退出狀態(tài)之前切距,我們稱該子進(jìn)程處于俚尸態(tài),另外一種使子進(jìn)程進(jìn)人僵尸狀態(tài)是:父進(jìn)程結(jié)束或者異常終止惨远,而子進(jìn)程繼續(xù)運(yùn)行谜悟。
由此可見,無論哪種情況北秽,如果父進(jìn)程沒有正確地處理子進(jìn)程的返冋信息葡幸,子進(jìn)程都將停留在僵尸態(tài),并占據(jù)若內(nèi)核資源.這是絕對(duì)不能容許的贺氓,畢競(jìng)內(nèi)核資源有限蔚叨,所以我們需要做的就是在父進(jìn)程中調(diào)用wait函數(shù)等待查詢子進(jìn)程的信息,回收子進(jìn)程。
六蔑水、nginx操作
6.1 nginx快速編譯安裝
yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel
wget http://nginx.org/download/nginx-1.14.1.tar.gz
tar -zxvf nginx-1.14.1.tar.gz
./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_gzip_static_module\
--with-http_realip_module\
--with-http_sub_module \
--with-http_ssl_module\
--with-http_realip_module \
--with-http_sub_module \
--with-http_gunzip_module\
--with-http_gzip_static_module\
--with-http_auth_request_module\
--with-http_random_index_module \
--with-http_slice_module \
--with-http_stub_status_module
make && make install
查看加載的模塊及版本信息
nginx -V
6.2 配置文件解釋
main
(全局設(shè)置)悄泥,main
部分設(shè)置的指令將影響其它所有部分的設(shè)置;
http(http服務(wù)器設(shè)置)肤粱,http標(biāo)準(zhǔn)核心模塊弹囚,http服務(wù)的相應(yīng)配置
server
(主機(jī)設(shè)置)
接收請(qǐng)求的服務(wù)器需要將不同的請(qǐng)求按規(guī)則轉(zhuǎn)發(fā)到不同的后端服務(wù)器上,在 nginx 中我們可以通過構(gòu)建虛擬主機(jī)(server
)的概念來將這些不同的服務(wù)配置隔離
location
(URL匹配特定位置后的設(shè)置)领曼,location
部分用于匹配網(wǎng)頁位置(比如鸥鹉,根目錄“/”,“/images”,等等),server
是對(duì)應(yīng)一個(gè)域名進(jìn)行的配置,而 location
是在一個(gè)域名下對(duì)更精細(xì)的路徑進(jìn)行配置.
[圖片上傳失敗...(image-e31ade-1571366341547)]
詳細(xì)解析
配置語法說明:
1庶骄、配置文件由指令與指令塊構(gòu)成
2毁渗、每條指令以;分號(hào)結(jié)尾,指令與參數(shù)間以空格符號(hào)分隔
3单刁、指令塊以{}大括號(hào)將多條指令組織在一起
4灸异、使用#符號(hào)添加注釋,提高可讀性
5羔飞、include語句允許組合多個(gè)配置文件以提升可維護(hù)性
6肺樟、使用$符號(hào)使用變量
7、部分指令的參數(shù)支持正則表達(dá)式
Nginx的各種指令以及配置繁多逻淌,有些配置可以在如下的鏈接 https://tengine.taobao.org/nginx_docs/cn/docs/ 或者在官方文檔上查看
6.3 nginx常用命令
1么伯、查看Nginx的版本號(hào):nginx -V
2、停止 nginx -s stop
3卡儒、退出 nginx -s quit
4田柔、重啟加載配置 nginx -s reload
5、配置文件啟動(dòng) nginx -c </path/to/config> 為 Nginx 指定一個(gè)配置文件骨望,來代替缺省的
6硬爆、nginx -t 不運(yùn)行,而僅僅測(cè)試配置文件擎鸠。nginx 將檢查配置文件的語法的正確性缀磕,并嘗試打開配置文件中所引用到的文件。
6.4糠亩、nginx控制信號(hào)
再次回過頭看看nginx的原理圖虐骑,我們還可以通過信號(hào)去操作 nginx
准验,默認(rèn)赎线,nginx
將其主進(jìn)程的 pid 寫入到 /usr/local/nginx/nginx.pid
文件中
命令 | 解釋 |
---|---|
TERM, INT | 快速關(guān)閉 |
QUIT | 從容關(guān)閉 |
HUP | 重載配置 用新的配置開始新的工作進(jìn)程 從容關(guān)閉舊的工作進(jìn)程 |
USR1 | 重新打開日志文件 |
USR2 | 平滑升級(jí)可執(zhí)行程序。 |
WINCH | 從容關(guān)閉工作進(jìn)程 |
nginx 停止命令糊饱,等所有請(qǐng)求結(jié)束后關(guān)閉服務(wù)
Kill -QUIT nginx
主進(jìn)程號(hào)
重新載入配置
kill -HUP nginx 主進(jìn)程號(hào)