httpd基本概念及IO類型

httpd早期叫做apache----a patcy server ,屬於Apache軟件基金會(ASF:Apache software foundation)的一個項目,後來apache更名爲Httpd,因爲這樣更符合Http server的含義。 常見的http服務器程序有httpd(Apache)、Nginx、Lighttpd

一、httpd在服務器迴應客戶端時會迴應相應的狀態碼,不同的狀態碼具有不同的含義

1xx:信息類

2xx:成功類

3xx:重定向類

4xx:客戶端錯誤類

5xx:服務端錯誤類

二、httpd對web身份認證的支持很豐富,提供的控制也非常細緻。

  • 基於ip認證
  • 基於用戶認證----basic(基本認證)、digest(摘要認證)

三、httpd的特性------高度模塊化 核心模塊+功能模塊、DSO dynamic share object 動態裝卸載、多路處理模塊機制MPM( Multipath processing Modules)

  • prefork:多進程模型,也是默認類型,採用預派生子進程方式,用單獨的子進程來處理不同的請求,進程之間彼此獨立。兩級架構,主進程一個子進程若干個。
  • 幾個常用選項(指令後面的#代表相應數量的數字):

    這些選項直接在主配置文件中修改(httpd-2.2,包含2.2之前),在httpd-2.4之後的版本中mpm的配置文件(/etc/httpd/conf.modules/00-mpm.conf)中編寫即可

    ServerLimit # 服務器允許配置的進程數上限,在其它兩種模型中因爲是多級架構,所以和線程子進程的乘積等有關係

    StartServers #  httpd服務在啓動時要啓動的子進程數量

    MinspareServers # 在服務器啓動StartsServer指定的子進程書量後每隔一秒創建一定數量的進程(是指數型的增加,第一次1個,第二次兩個,第三次4個,一直增加到32個每秒後穩定增加),直到增加到MinSpareServer指定的數量

    MaxSpareServers # 這個值是設置系統最大空閒進程數量,每當大於這個數量的值時,系統會kill掉一部分子進程,但是當這個值設置的小於MinSpareServer的值時,系統會自動將該值設置爲最小空閒進程數量加一

    MaxConnectionsPerchild # 這個值代表每個子進程最大能處理多少個連接之後將被系統kill掉(因爲進程在使用過程當中可能有數據錯誤或無法以外的內存泄露等)如果設置爲0則代表永不kill,這個值從httpd-2.4之後纔開始叫這個名字

    MaxRequestWorkers #最大處理併發請求數量的限制2.4之後的版本纔有的指令,意義等同於MaxClient

    MaxClient # MaxClients設定的是 Apache可以併發處理的請求,是對Apache性能影響最大的參數。其缺省值150是遠遠不夠的,如果請求總數已達到這個值(可通過ps -ef|grep http|wc -l來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越多,但Apache默認的限制不能大於256。ServerLimit指令無須重編譯Apache就可以加大MaxClients。這個指令是httpd-2.2的

  • worker:多線程模型,爲每個請求分配一個線程,三級架構,一個主進程,若干子進程,每個子進程管理若干個線程
  • event:事件驅動模型,每個進程處理多個請求有多個進程,主進程,生成多個子進程,每個子進程響應多個請求

I/0類型----同步和異步、阻塞和非阻塞;同步和異步,關注的是被調用者的消息通知機制,而阻塞與非阻塞關注的是調用者等待被調用者返回調用結果時的狀態

  • 同步(synchronous):調用發出之後不會立即返回,一旦返回,就是最終結果
  • 異步(asyncronous):調用發出之後,被調用方立即返回,但不是最終結果;被調用方通過狀態、通知機制等來通知調用者,或者通過回調函數來處理結果
  • 阻塞(block):調用結果返回之前,調用者會被掛起,調用者只有在得到返回結果之後才能繼續
  • 非阻塞(nonblock):調用者結果返回之前,不會被掛起,即調用者不會阻塞調用者

I/O模型----阻塞IO模型、非阻塞I/O模型、I/O複用模型、事件驅動I/O模型、異步I/O模型

以read操作爲例,大致分爲2步:當發起請求進來後,第一步由內核向磁盤進行數據請求,並將數據複製到內核內存;第二步將內核內存數據複製到進程內存。

  1. 磁盤----->內核內存
  2. 內核內存----->進程內存
  • 阻塞IO模型

使用recv的默認參數一直等數據直到拷貝到用戶空間,這段時間內進程始終阻塞。A同學用杯子裝水,打開水龍頭裝滿水然後離開。這一過程就可以看成是使用了阻塞IO模型,因爲如果水龍頭沒有水,他也要等到有水並裝滿杯子才能離開去做別的事情。很顯然,這種IO模型是同步的。

image

  • 非阻塞IO模型

改變flags,讓recv不管有沒有獲取到數據都返回,如果沒有數據那麼一段時間後再調用recv看看,如此循環。B同學也用杯子裝水,打開水龍頭後發現沒有水,它離開了,過一會他又拿着杯子來看看……在中間離開的這些時間裏,B同學離開了裝水現場(回到用戶進程空間),可以做他自己的事情。這就是非阻塞IO模型。但是它只有是檢查無數據的時候是非阻塞的,在數據到達的時候依然要等待複製數據到用戶空間(等着水將水杯裝滿),因此它還是同步IO。

image

  • IO複用模型

這裏在調用recv前先調用select或者poll,這2個系統調用都可以在內核準備好數據(網絡數據到達內核)時告知用戶進程,這個時候再調用recv一定是有數據的。因此這一過程中它是阻塞於select或poll,而沒有阻塞於recv,有人將非阻塞IO定義成在讀寫操作時沒有阻塞於系統調用的IO操作(不包括數據從內核複製到用戶空間時的阻塞,因爲這相對於網絡IO來說確實很短暫),如果按這樣理解,這種IO模型也能稱之爲非阻塞IO模型,但是按POSIX來看,它也是同步IO,那麼也和樓上一樣稱之爲同步非阻塞IO吧。

這種IO模型比較特別,分個段。因爲它能同時監聽多個文件描述符(fd)。這個時候C同學來裝水,發現有一排水龍頭,舍管阿姨告訴他這些水龍頭都還沒有水,等有水了告訴他。於是等啊等(select調用中),過了一會阿姨告訴他有水了,但不知道是哪個水龍頭有水,自己看吧。於是C同學一個個打開,往杯子裏裝水(recv)。這裏再順便說說鼎鼎大名的epoll(高性能的代名詞啊),epoll也屬於IO複用模型,主要區別在於舍管阿姨會告訴C同學哪幾個水龍頭有水了,不需要一個個打開看(當然還有其它區別)。

image

  • 信號驅動IO模型

通過調用sigaction註冊信號函數,等內核數據準備好的時候系統中斷當前程序,執行信號函數(在這裏面調用recv)。D同學讓舍管阿姨等有水的時候通知他(註冊信號函數),沒多久D同學得知有水了,跑去裝水。是不是很像異步IO?很遺憾,它還是同步IO(省不了裝水的時間啊)。

image

  • 異步IO模型

調用aio_read,讓內核等數據準備好,並且複製到用戶進程空間後執行事先指定好的函數。E同學讓舍管阿姨將杯子裝滿水後通知他。整個過程E同學都可以做別的事情(沒有recv),這纔是真正的異步IO。

image

參考源 :https://blog.csdn.net/qq_40741855/article/details/84831294

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章