1. 程式人生 > >2-1-http服務及IO事件模型講解

2-1-http服務及IO事件模型講解

不可 digest ast reverse 消息 監控 傳遞 quest 後端

web服務的事務過程:客戶端通過user agent(瀏覽器)發起請求,服務端響應(httpd、apache)

web服務的核心協議是應用層的http或https協議
Nginx:
engine X=Nginx
http協議:web服務器(類似httpd)、http reverse proxy(類似於httpd)、imap/pop3 reverse proxy---更多的是應用在reverse proxy
NGINX is a free,open-source,high-performance HTTP server and reverse proxy,as well as an IMAP/POP3 proxy server.

C10K(10K Connections)一萬個並發請求Tengine,OpenResty
http協議:URL(統一資源定位符)
URL:shceme://username:password@host:port/path;params?query#frag
br/>Tengine,OpenResty
http協議:URL(統一資源定位符)
URL:shceme://username:password@host:port/path;params?query#frag
shceme:協議http(80)、https(443)、ftp
username:password:獲取資源有可能需要認證
host:port:主機地址及進程,端口是用來標識進程的
path:資源路徑,通常與文件系統加以映射
DocumentRoot:通常把url叫做location,完成映射以後,url的起始根是你自己定義的本地路徑(/path/to/somedir---這是你自己定義的documentroot)---對用戶進行限制訪問可以基於url來定義(也就是location),也可以基於文件系統路徑來定義
Alias:別名,也能來定義路徑映射
params:有些路徑是動態的,需要添加一些參數(比如附加自己的用戶名)
格式:key=value&key=value多個可以用&連接起來
query:傳遞的查詢條件,如果需要從數據庫中獲取某些數據,需要用到查詢條件
格式:filed=value
#frag:定義網頁的位置
http事務:
request:
<method><URL><VERSION>---請求方法(get、post),請求資源的url,協議的版本
HEADERS---name:value格式

        <body>---請求報文的主體部分,根據方法不同內容會有所變化
    response:
        <VERSION><STATUS><REASON-PHRASE>---版本、狀態碼、原因短語
        HEADERS---name:value格式

        <body>
    Method:GET/HEAD(請求資源只希望獲得首部)/POST(提交表單),PUT(上傳文件)/DELETE(刪除文件),TRACE(追蹤代理服務器)/OPTIONS(獲取一個資源支持的請求方法列表)
    Status Code:
        1xx:基本響應碼,沒有太大意義
        2xx:成功類響應碼,200
        3xx:重定向類的響應碼,301,302,304(內容未修改)
        4xx:客戶端錯誤,403,404(未找到)
        5xx:服務器端錯誤,502
    認證:---http協議也支持認證
        基於IP認證:哪個ip能不能訪問,有兩種一種是協議自帶一種是iptables
        基於用戶認證:basic/digest---說的是認證信息在網上傳輸的格式和認證過程當中,可以簡單理解為basic是明文的digest做了校驗碼認證(有些瀏覽器支持不完整)
        還有一種表單認證:跟協議沒有關系,而是服務器端的應用程序認證
    httpd MPM:---並發響應模型,這三種並非是全部
        prefork:進程模型,兩級結構,主進程master負責預先生成子進程(空閑進程),每個子進程負責響應一個請求;一個請求用一個進程來響應---用的就是select()模型
        worker:線程模型,三級結構,主進程master負責生成work子進程,每個子進程負責生成線程,每個線程響應一個請求;對於linux而言,進程線程都是輕量級的。
        event:線程模型,但是沒有線程實體,二級結構,主進程master負責生成子進程,每個子進程響應多個請求;

IO模型:
阻塞型、非阻塞型、復用型、(前邊3個都是同步的)信號驅動型、異步(這兩個是異步的)
同步/異步:
關註消息通知機制;
消息通知:
同步:等待對方返回消息,才能往後走
異步:被調用者通過狀態、通知或回調機制通知調用者被調用者的運行狀態;不用等待了,繼續處理別的事情
阻塞/非阻塞
關註調用者在等待結果返回之前所處的狀態;
阻塞:blocking,調用結果返回之前,調用者被掛起---不可中斷的睡眠
非阻塞:nonblocking,調用結果返回之前,調用者不會被掛起,會不定時詢問
調用有哪些?
程序自己的函數調用,系統調用,用戶調用,遠程調用(跨主機),同步調用
用戶空間調用內核空間的函數(內核級的代碼上有很多函數被寫成代碼庫了)被稱作系統調用,例如:網絡報文發送、硬盤讀寫

    一次系統IO請求(以磁盤為例),都會由兩階段組成:
        第一步:等待數據,即數據從磁盤到內核內存---最消耗時間
        第二步:復制數據,即數據從內核內存到進程內存
    阻塞型io:兩個步驟都阻塞
    非阻塞型io:第一步非阻塞,第二步阻塞
    復用型io調用:---復用型io:依然是阻塞的,沒有阻塞在單路io上,而是阻塞在一個io復用器(內核級,幫助監控IO響應)上,意思是進程打算調用兩路IO,自己不直接調用磁盤,兩路都完成才叫醒進程,兩個步驟都阻塞
        select():1024幫助監控1024路io,也就是並發數,超過1024沒有意義,性能沒有變化,由BSD研發
        poll():沒有個數的限制,由unix研發,跟select差不多
    信號驅動型io:第一步非阻塞,第二步阻塞,第一步給對方留一個回掉接口,然後該幹嘛幹嘛,等信號來了再處理,再阻塞
        event-driven:
            epoll(linux):libevent包
            Kqueue(BSD)
            /dev/poll(Solaris)
    異步:兩個步驟都不參與,都不阻塞,直接從內核拿數據使用

阻塞、非阻塞,舉個例子:去面館吃面要不要自己端,視頻中還舉了律師幫你打離婚官司
主程序調用函數會引入一個新的上下文結構,新的上下文跟原先的主程序沒有關系,但是要返回一些執行結果。一般不返回結果是沒有辦法繼續往下運行的。

nginx相當於dnat,但是dnat工作在四層,nginx工作在七層,修改源報文,隱藏後端服務器

2-1-http服務及IO事件模型講解