摘要:關于過程中如何細節控制一致性,穩定性,信號控制,控制等等,敬請期待小拽的進一步探索處理流程和模塊啟動進程后,請求在內部是如何流轉的,內部包括哪些模塊處理過程請求到達后首先讀取,中初始時間便從此開始。
一、nginx現狀由于性能問題,需要將 apache + php5.2 升級到 nginx + php7,對于nginx的性能和熱加載早有耳聞,why nginx so diao。小拽進行了初探,有任何疑問或不準確的地方,歡迎直接開炮?。?!
nginx 是當前的使用最廣泛的webserver ,支持http正向/反向代理,支持TCP/UDP層代理,來看下netcraft的數據
nginx在全部網站中占比達到18%,在top millon busest 達到28%,而且一直在增加。當下最時尚的webserver非nginx莫屬
二、nginx的特點更全數據可以參考:【netcraft】
深入了解nginx之前,先泛泛的了解下nginx的幾個特點
性能好
非阻塞IO/高并發,支持文件IO
多worker,thread pool
基于rbtree的定時器
系統特性的持續支持
功能強大
webserver/cache/keepalive/pipeline等等
各種upstream的支持【fastcgi/http/...】
輸出靈活【chunk/zip/...】
在不斷的發展 http2,tcp,udp,proxy...
運維的友好【這個對于開發和部署很重要】
配置非常規范【個人認為:約定及規范是最好的實踐】
熱加載和熱更新【后文會詳細介紹,能在二進制的層面熱更新】
日志強大【真的很強的,很多變量支撐】
擴展強大
下圖是nginx、apache和lighttpd的一個對比。系統壓力,內存占用,upstream支持等多個方面都非常不錯
一句話簡述nginx的運行方式:master-worker多進程模式運行,單線程/非阻塞執行
如下官方圖:nginx 啟動后生成master,master會啟動conf數量的worker進程,當用戶的請求過來之后,由不同的worker調起執行線程,非阻塞的執行請求。這種運行方式相對于apache的進程執行相對輕量很多,支撐的并發性也會高很多。
nginx是master-worker進程工作模式,那么nginx是如何管理master啟程,怎么做到熱加載的?
3.2.1 配置熱加載官方圖很贊,在更換配置之后,master生成新的worker,直到原有的worker全部任務結束kill掉之后。從現象上作證,也就是在relaod配置之后,短時間可能出現超過conf數量的進程,更新完成后,進程會完全改變。
3.2.2 版本更新熱加載不更新、直接替換,這種設計思路在代碼部署中也很常見,包括mysql遷移,代碼更新,服務嘗試,很值的學習。
了解了worker的熱加載之后,理解master就非常簡單了,通過信號控制,同時存在兩個master,逐步替代。
關于replace過程中如何細節控制一致性,穩定性,信號控制,log控制等等,敬請期待小拽的進一步探索!
3.3 處理流程和模塊啟動進程后,請求在nginx內部是如何流轉的,nginx內部包括哪些模塊?
3.3.1 worker處理過程【post header】請求到達后首先讀取header,log中request time初始時間便從此開始。
【rewrite】請求相關的配置和參數
【pre-access】預處理階段,頻率控制,高頻絕句
【acess】權限控制,白名單,403,access deny ,靜態文件開放等均有這個模塊產生
【content】這個模塊會調用upstream產生內容,這個階段最重要此處調起了工作線程,調用fastcgi,http,以及各種操作產生內容均在此處。性能優化可能需要確認程序執行時間,對應access log中的upstream time 由此產生,記錄了nginx中程序運行的全量時間,而request - upstream 就是網絡傳輸和預處理時間。
【filter】內容過濾,包括gzip壓縮,返回等在此處
【log】日志的產生
【重定向】沒有這個模塊,所有的進行智能單向走,有了這個,在任何階段都可以產生返回,例如client主動階段產生499的log,過程可能就是1-》2-》8-》7 over
摘自某ppt的一個圖,如侵權,請盡快聯系小拽
各個階段的主要狀態機可以參考:【跳轉】
3.4 請求管理了解了worker的工作模式和worker的內部主要模塊,那么worker是如何管理請求的?
3.4.1 任務調度官方闡述:It’s well known that NGINX uses an asynchronous, event?driven approach to handling connections. This means that instead of creating another dedicated process or thread for each request (like servers with a traditional architecture), it handles multiple connections and requests in one worker process. To achieve this, NGINX works with sockets in a non?blocking mode and uses efficient methods such as epoll and kqueue.
核心詞:異步,事件驅動,鏈接控制
解釋的很清楚,nginx并不是通過每個請求都創建線程,而是通過內部管理的調度分配。
如下圖:此處不翻譯了,大家直接看原版
epoll詳解:【跳轉】
官方說明
Let’s return to our poor sales assistant who delivers goods from a faraway warehouse. But he has become smarter (or maybe he became smarter after being beaten by the crowd of angry clients?) and hired a delivery service. Now when somebody asks for something from the faraway warehouse, instead of going to the warehouse himself, he just drops an order to a delivery service and they will handle the order while our sales assistant will continue serving other customers. Thus only those clients whose goods aren’t in the store are waiting for delivery, while others can be served immediately.
小拽認為簡而言之:結合實際情況,除了空閑被動給,更多的通過事件驅動主動要,通過這種方式在執行資源緊缺的情況下,達到一個執行資源的優化部署,如下圖。
線程池官網詳解:【跳轉】
請求的具體調度基于事件,例如網絡IO,磁盤IO,定時器等均可以對事件進行阻塞,當阻塞的事件空閑時,發出調度請求,完成處理。
需要額外提一下,nginx的定時器基于rbtree,紅黑樹的快速插入和查詢保證了nginx事件調度的高效性
事件框架的處理模型
性能:nginx 工作模式是master-worker進程方式,執行請求是有更輕量線程完成。
熱加載:nginx 替換非更新的方式是nginx熱加載的本質
功能強大:nginx upstream是在線程層面調度,兼容多種,所以可以擴展很多功能強大
處理流程:主要的流程過程和模塊分離清晰。
請求處理:通過自身的管理,線程池,異步事件驅動等當來完成任務調度
再次強調:初探nginx,有疑問或不準確的地方,請直接開炮?。。?/p> 參考文章
netcraft:https://news.netcraft.com/arc...
nginx的線程調度設計:https://www.nginx.com/blog/in...
epoll詳述:http://man7.org/linux/man-pag...
http://yaocoder.blog.51cto.co...
線程池:https://www.nginx.com/blog/th...
【轉載請注明:【【nginx學習一】基本原理學習 | 靠譜崔小拽 】
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39492.html
摘要:一閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。等奶茶做好了,店員喊一聲小明,奶茶好了,然后小明去取奶茶。將響應結果發給相應的連接請求處理完成因為基于,所以每個可以處理無數個連接請求。如此,就輕松的處理了高并發。 一、閱前熱身 為了更加形象的說明同步異步、阻塞非阻塞,我們以小明去買奶茶為例。 1、同步與異步 ①同步與異步的理解 同步與異步的重點在消息通知的方式上...
摘要:一閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。等奶茶做好了,店員喊一聲小明,奶茶好了,然后小明去取奶茶。將響應結果發給相應的連接請求處理完成因為基于,所以每個可以處理無數個連接請求。如此,就輕松的處理了高并發。 一、閱前熱身 為了更加形象的說明同步異步、阻塞非阻塞,我們以小明去買奶茶為例。 1、同步與異步 ①同步與異步的理解 同步與異步的重點在消息通知的方式上...
摘要:語法缺省值指定工作進程數。語法缺省值制定錯誤日志的存放位置和級別。默認情況下會在時找出最適合系統的事件模型。語法默認值作用域指定的目錄是準確的,是指定目錄的上級目錄,并且該上級目錄要含有指定名稱的同名目錄。 特性 高并發連接: 官方稱單節點支持5萬并發連接數,實際生產環境能夠承受2-3萬并發 內存消耗少: 在3萬并發連接下,開啟10個nginx進程僅消耗150M內存 (15M*10=...
摘要:表示的是兩個,當其中任意一個計算完并發編程之是線程安全并且高效的,在并發編程中經??梢娝氖褂?,在開始分析它的高并發實現機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯網高并發場景。 干貨:深度剖析分布式搜索引擎設計 分布式,高可用,和機器學習一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...
閱讀 2492·2021-09-28 09:36
閱讀 1486·2021-09-22 15:33
閱讀 3636·2019-08-30 15:44
閱讀 1743·2019-08-29 13:14
閱讀 3132·2019-08-29 11:17
閱讀 1441·2019-08-29 11:03
閱讀 2905·2019-08-26 17:10
閱讀 681·2019-08-26 12:13