sap abap开发从入门到精通_Nginx 开发从入门到精通《实战书籍》学会这些就够了...
緣起
nginx由于出色的性能,在世界范圍內(nèi)受到了越來(lái)越多人的關(guān)注,在淘寶內(nèi)部它更是被廣泛的使用,眾多的開(kāi)發(fā)以及運(yùn)維同學(xué)都迫切的想要了解nginx模塊的開(kāi)發(fā)以及它的內(nèi)部原理,但是國(guó)內(nèi)卻沒(méi)有一本關(guān)于這方面的書(shū),源于此我們決定自己來(lái)寫(xiě)一本。本書(shū)的作者為淘寶核心系統(tǒng)服務(wù)器平臺(tái)組的成員,本書(shū)寫(xiě)作的思路是從模塊開(kāi)發(fā)逐漸過(guò)渡到nginx原理剖析。書(shū)籍的內(nèi)容會(huì)定期在這里更新,歡迎大家提出寶貴意見(jiàn),不管是本書(shū)的內(nèi)容問(wèn)題,還是字詞錯(cuò)誤,都?xì)g迎大家提交issue(章節(jié)標(biāo)題的左側(cè)有評(píng)注按鈕),我們會(huì)及時(shí)的跟進(jìn)。
下面先說(shuō)說(shuō):正向代理和反向代理的區(qū)別:說(shuō)白了,反向代理就是負(fù)載均衡!!!為服務(wù)器分發(fā)請(qǐng)求,隱藏主服務(wù)器
Nginx 開(kāi)發(fā)從入門(mén)到精通
nginx 在啟動(dòng)后,會(huì)有一個(gè) master 進(jìn)程和多個(gè) worker 進(jìn)程。master 進(jìn)程主要用來(lái)管理 worker
進(jìn)程,包含:接收來(lái)自外界的信號(hào),向各 worker 進(jìn)程發(fā)送信號(hào),監(jiān)控 worker 進(jìn)程的運(yùn)行狀態(tài),當(dāng) worker
進(jìn)程退出后 (異常情況下),會(huì)自動(dòng)重新啟動(dòng)新的 worker 進(jìn)程。而基本的網(wǎng)絡(luò)事件,則是放在 worker 進(jìn)程中
來(lái)處理了。多個(gè) worker 進(jìn)程之間是對(duì)等的,他們同等競(jìng)爭(zhēng)來(lái)自客戶(hù)端的請(qǐng)求,各進(jìn)程互相之間是獨(dú)立的。一個(gè)
請(qǐng)求,只可能在一個(gè) worker 進(jìn)程中處理,一個(gè) worker 進(jìn)程,不可能處理其它進(jìn)程的請(qǐng)求。worker 進(jìn)程的
個(gè)數(shù)是可以設(shè)置的,一般我們會(huì)設(shè)置與機(jī)器 cpu 核數(shù)一致,這里面的原因與 nginx 的進(jìn)程模型以及事件處理模
型是分不開(kāi)的。nginx 的進(jìn)程模型,可以由下圖來(lái)表示:
上篇:nginx 模塊開(kāi)發(fā)篇
這里就簡(jiǎn)單和大家分享一下了 需要資料的大家可以私信資料,送大家
好現(xiàn)在我們說(shuō)說(shuō)
nginx 基礎(chǔ)概念 (100%)
在 nginx 中 connection 就是對(duì) tcp 連接的封裝,其中包括連接的 socket,讀事件,寫(xiě)事件。利用 nginx 封
裝的 connection,我們可以很方便的使用 nginx 來(lái)處理與連接相關(guān)的事情,比如,建立連接,發(fā)送與接受數(shù)
據(jù)等。而 nginx 中的 http 請(qǐng)求的處理就是建立在 connection 之上的,所以 nginx 不僅可以作為一個(gè) web
服務(wù)器,也可以作為郵件服務(wù)器。當(dāng)然,利用 nginx 提供的 connection,我們可以與任何后端服務(wù)打交道。
結(jié)合一個(gè) tcp 連接的生命周期,我們看看 nginx 是如何處理一個(gè)連接的。首先,nginx 在啟動(dòng)時(shí),會(huì)解析配置
文件,得到需要監(jiān)聽(tīng)的端口與 ip 地址,然后在 nginx 的 master 進(jìn)程里面,先初始化好這個(gè)監(jiān)控的 socket(創(chuàng)
建 socket,設(shè)置 addrreuse 等選項(xiàng),綁定到指定的 ip 地址端口,再 listen),然后再 fork 出多個(gè)子進(jìn)程出來(lái),
然后子進(jìn)程會(huì)競(jìng)爭(zhēng) accept 新的連接。此時(shí),客戶(hù)端就可以向 nginx 發(fā)起連接了。當(dāng)客戶(hù)端與 nginx 進(jìn)行三次
握手,與 nginx 建立好一個(gè)連接后,此時(shí),某一個(gè)子進(jìn)程會(huì) accept 成功,得到這個(gè)建立好的連接的 socket,
然后創(chuàng)建 nginx 對(duì)連接的封裝,即 ngx_connection_t 結(jié)構(gòu)體。接著,設(shè)置讀寫(xiě)事件處理函數(shù)并添加讀寫(xiě)事件
來(lái)與客戶(hù)端進(jìn)行數(shù)據(jù)的交換。最后,nginx 或客戶(hù)端來(lái)主動(dòng)關(guān)掉連接,到此,一個(gè)連接就壽終正寢了。
當(dāng)然,nginx 也是可以作為客戶(hù)端來(lái)請(qǐng)求其它 server 的數(shù)據(jù)的(如 upstream 模塊),此時(shí),與其它 server
創(chuàng)建的連接,也封裝在 ngx_connection_t 中。作為客戶(hù)端,nginx 先獲取一個(gè) ngx_connection_t 結(jié)構(gòu)體,
然后創(chuàng)建 socket,并設(shè)置 socket 的屬性(比如非阻塞)。然后再通過(guò)添加讀寫(xiě)事件,調(diào)用 connect/read/
write 來(lái)調(diào)用連接,最后關(guān)掉連接,并釋放 ngx_connection_t。
在 nginx 中,每個(gè)進(jìn)程會(huì)有一個(gè)連接數(shù)的最大上限,這個(gè)上限與系統(tǒng)對(duì) fd 的限制不一樣。在操作系統(tǒng)中,通過(guò)
ulimit -n,我們可以得到一個(gè)進(jìn)程所能夠打開(kāi)的 fd 的最大數(shù),即 nofile,因?yàn)槊總€(gè) socket 連接會(huì)占用掉一個(gè)
fd,所以這也會(huì)限制我們進(jìn)程的最大連接數(shù),當(dāng)然也會(huì)直接影響到我們程序所能支持的最大并發(fā)數(shù),當(dāng) fd 用完
后,再創(chuàng)建 socket 時(shí),就會(huì)失敗。不過(guò),這里我要說(shuō)的 nginx 對(duì)連接數(shù)的限制,與 nofile 沒(méi)有直接關(guān)系,可
以大于 nofile,也可以小于 nofile。nginx 通過(guò)設(shè)置 worker_connectons 來(lái)設(shè)置每個(gè)進(jìn)程可使用的連接最大
值。nginx 在實(shí)現(xiàn)時(shí),是通過(guò)一個(gè)連接池來(lái)管理的,每個(gè) worker 進(jìn)程都有一個(gè)獨(dú)立的連接池,連接池的大小
是 worker_connections。這里的連接池里面保存的其實(shí)不是真實(shí)的連接,它只是一個(gè) worker_connections
大小的一個(gè) ngx_connection_t 結(jié)構(gòu)的數(shù)組。并且,nginx 會(huì)通過(guò)一個(gè)鏈表 free_connections 來(lái)保存所有的
空閑 ngx_connection_t,每次獲取一個(gè)連接時(shí),就從空閑連接鏈表中獲取一個(gè),用完后,再放回空閑連接鏈表
里面。
在這里,很多人會(huì)誤解 worker_connections 這個(gè)參數(shù)的意思,認(rèn)為這個(gè)值就是 nginx 所能建立連接的最大
值。其實(shí)不然,這個(gè)值是表示每個(gè) worker 進(jìn)程所能建立連接的最大值,所以,一個(gè) nginx 能建立的最大連接
數(shù),應(yīng)該是 worker_connections * worker_processes。當(dāng)然,這里說(shuō)的是最大連接數(shù),對(duì)于 HTTP 請(qǐng)求本
地資源來(lái)說(shuō),能夠支持的最大并發(fā)數(shù)量是 worker_connections * worker_processes,而如果是 HTTP 作為
反向代理來(lái)說(shuō),最大并發(fā)數(shù)量應(yīng)該是 worker_connections * worker_processes/2。因?yàn)樽鳛榉聪虼矸?wù)
器,每個(gè)并發(fā)會(huì)建立與客戶(hù)端的連接和與后端服務(wù)的連接,會(huì)占用兩個(gè)連接
總結(jié);
我們就來(lái)說(shuō)說(shuō)最關(guān)鍵的,nginx到底有什么作用呢?今天先說(shuō)些大家都比較熟悉的。
說(shuō)反向代理之前,我們先看看正向代理,正向代理也是大家最常接觸的到的代理模式,我們會(huì)從兩個(gè)方面來(lái)說(shuō)關(guān)于正向代理的處理模式,分別從軟件方面和生活方面來(lái)解釋一下什么叫正向代理。
在如今的網(wǎng)絡(luò)環(huán)境下,我們?nèi)绻捎诩夹g(shù)需要要去訪問(wèn)國(guó)外的某些網(wǎng)站,此時(shí)你會(huì)發(fā)現(xiàn)位于國(guó)外的某網(wǎng)站我們通過(guò)瀏覽器是沒(méi)有辦法訪問(wèn)的,此時(shí)大家可能都會(huì)用一個(gè)操作FQ進(jìn)行訪問(wèn),FQ的方式主要是找到一個(gè)可以訪問(wèn)國(guó)外網(wǎng)站的代理服務(wù)器,我們將請(qǐng)求發(fā)送給代理服務(wù)器,代理服務(wù)器去訪問(wèn)國(guó)外的網(wǎng)站,然后將訪問(wèn)到的數(shù)據(jù)傳遞給我們!
總結(jié)
以上是生活随笔為你收集整理的sap abap开发从入门到精通_Nginx 开发从入门到精通《实战书籍》学会这些就够了...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python3.7知识点汇总
- 下一篇: Django 部署基础【使用 Nginx