1. 程式人生 > >linux第九周微職位

linux第九周微職位

linux第九周微職位

1、請描述一次完整的http請求處理過程;

HTTP通信機制是在一次完整的HTTP通信過程中,Web瀏覽器與Web服務器之間將完成下列7個步驟:

  1. 建立TCP連接

    在HTTP工作開始之前,Web瀏覽器首先要通過網絡與Web服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之後才能進行更高層協議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80;

  2. Web瀏覽器向Web服務器發送請求命令

    一旦建立了TCP連接,Web瀏覽器就會向Web服務器發送請求命令。例如:GET/sample/hello.jsp HTTP/1.1;
  3. Web瀏覽器發送請求頭信息

    瀏覽器發送其請求命令之後,還要以頭信息的形式向Web服務器發送一些別的信息,之後瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。
  4. Web服務器應答

    客戶機向服務器發出請求後,服務器會客戶機回送應答, HTTP/1.1 200 OK ,應答的第一部分是協議的版本號和應答狀態碼;
  5. Web服務器發送應答頭信息

    正如客戶端會隨同請求發送關於自身的信息一樣,服務器也會隨同應答向用戶發送關於它自己的數據及被請求的文檔;

  6. Web服務器向瀏覽器發送數據

    Web服務器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此為結束,接著,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據;
  7. Web服務器關閉TCP連接

一般情況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP連接,然後如果瀏覽器或者 服務器在其頭信息加入了這行代碼:Connection:keep-alive;

TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接 節省了為每個請求建立新連接所需的時間,還節約了網絡帶寬。

2、httpd所支持的處理模型有哪些,他們的分別使用於哪些環境。

Apache有兩種工作模型,一種是基於進程的preforker模型,一種是基於線程和進程混合的Worker模型

1)prefork模式

prefork模式可以算是很古老但是非常穩定的Apache模式。Apache在啟動之初,就預先fork一些子進程,然後等待請求進來。之所以這樣做,是為了減少頻繁創建和銷毀進程的開銷。每個子進程只有一個線程,在一個時間點內,只能處理一個請求;

優點:成熟穩定,兼容所有新老模塊。同時,不需要擔心線程安全的問題。(我們常用的mod_php,PHP的拓展不需要支持線程安全);

缺點:一個進程相對占用更多的系統資源,消耗更多的內存。而且,它並不擅長處理高並發請求,在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。

2)worker模式

worker模式比起上一個,是使用了多進程和多線程的混合模式。它也預先fork了幾個子進程(數量比較少),然後每個子進程創建一些線程,同時包括一個監聽線程。每個請求過來,會被分配到1個線程來服務。線程比起進程會更輕量,因為線程通常會共享父進程的內存空間,因此,內存的占用會減少一些。在高並發的場景下,因為比起prefork有更多的可用線程,表現會更優秀一些。

有些人會覺得奇怪,那麽這裏為什麽不完全使用多線程呢,還要引入多進程?

原因主要是需要考慮穩定性,如果一個線程異常掛了,會導致父進程連同其他正常的子線程都掛了(它們都是同一個進程下的)。為了防止這場異常場景出現,就不能全部使用線程,使用多個進程再加多線程,如果某個線程出現異常,受影響的只是Apache的一部分服務,而不是整個服務。

優點:占據更少的內存,高並發下表現更優秀。

缺點:必須考慮線程安全的問題,因為多個子線程是共享父進程的內存地址的。如果使用keep-alive的長連接方式,某個線程會一直被占據,也許中間幾乎沒有請求,需要一直等待到超時才會被釋放。如果過多的線程,被這樣占據,也會導致在高並發場景下的無服務線程可用。

3)EVENT模式

這個是Apache中最新的模式,在現在版本裏的已經是穩定可用的模式。它和worker模式很像,最大的區別在於,它解決了keep-alive場景下,長期被占用的線程的資源浪費問題(某些線程因為被keep-alive,空掛在哪裏等待,中間幾乎沒有請求過來,甚至等到超時)。event

MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又允許它釋放。這樣增強了高並發場景下的請求處理能力。


3、源碼編譯安裝LAMP環境(基於wordpress程序),並寫出詳細的安裝、配置、測試過程。















本文出自 “11822904” 博客,請務必保留此出處http://11832904.blog.51cto.com/11822904/1959614

linux第九周微職位