我們都知道如今的web服務器有很多,比如著名的有apache,有nginx,有tomcat,有resin服務器,有sphere,有iis服務器等等,這些服務器都能提供web服務,並且幾乎都能和多種語言進行搭配使用,那麼一個web服務器都需要那些功能,開發一個web服務器都需要那些知識呢。
web服務器功能
web服務器是提供文檔瀏覽的的程序。也就是說瀏覽器請求一個文檔,它返回一個文檔。這就是簡單的一個web服務器的功能。
無論是php程序,.net程序,java程序,返回給瀏覽器的都是以文檔的形式返回。也就是都是html代碼返回。
目前一般的web服務器都需要對其他語言的請求進行操作,它只需要將對應語言的請求交給對應語言的處理器進行處理,然後將返回的處理結果返回給瀏覽器即可。
也就是說,當用戶請求的時候,我們只需要將文檔文件,比如html文件,js文件,css文件,圖片文件能夠返回給用戶,就基本實現了一個簡單的web服務器。
如何實現
- 作為一個服務器,它有一些基本的功能必須要要完成,比如啟動,比如停止,比如監聽端口等。
- 我們可以將我們的web服務器封裝成一個類,然後將各個功能封裝成函數即可。
- 我們使用socket來實現端口監聽,我們通過socket可以讀取到用戶發送的請求。
- 我們封裝一個處理請求函數,用來處理接收的請求,需要能夠讀取到用戶的請求url。
- 封裝一個判斷請求類型的函數,根據用戶的url,獲取請求的文件,讀取請求的文件,返回內容。
- 封裝返回函數,需要加上指定的header頭等信息。
注意事項
通過上面的步驟,我們就簡單實現了一個靜態的web服務器,如果用戶讀取的是靜態文件,我們可以直接返回給用戶請求的文件信息,如果用戶請求的是動態內容,也就是其它語言編寫的文件,這個時候,我們只需要將請求轉發給對應的處理器即可,比如php可以交給php-fpm進行處理即可。
我們這只是一個簡單的web服務器,如果深入的研究,我們就知道我們需要改進的地方。比如我們可能需要多個進程來處理請求,我們可能需要緩存一些請求信息,我們可能需要一些異常處理等。
總結
一切皆函數,我們的任何一個軟件都是由無數個功能構成的,而每一個功能都是由很多個函數構成的。當我們要開發一個軟件的時候,我們只需要理清邏輯,然後一個一個功能去通過函數實現即可。
socket是一個通信協議,用來在計算機之間通信使用的。通過socket我們就可以定位網絡上的一個計算機提供的服務的進程,也就是可以和那個進程進行信息的交互,至於如何交互,就是socket處理的事情。
閱讀更多 夢迴故里歸來 的文章