大話WEB伺服器開發
本文純碎處於個人理解不可做科學依據。
前因
工作這麼多年斷斷續續看過一些有web伺服器程式設計的書,但是一直沒有把自己的理解整理起來,今天索性就做個總結,記得第一次接觸web網頁程式設計是02年,那時學校裡計算機比賽,學校有個哥們用ASP寫了一個電子商務的網站,記憶中那會好像電子商務剛剛起步哈,好生羨慕,處於對技術渴求自己去書店買了網站開發的書,埋頭苦讀有一個月,後來還和同學一起給他叔做了網站,算是練手,很自豪處於程式猿普遍心理,當時心想吊什麼哥也能做web,認識web伺服器開發是從那時開始的吧,現在回想起來那時真是個菜鳥。
工作中的web
自從04年離校之後直到06年才又一次接觸了web開發,那時公司有個日本UPS監控專案,專案中有個裝置需要通過網頁配置裝置的引數,由於是嵌入的裝置所以用的是CGI,最早接觸web人都知道CGI,要用這個做網站簡直是跟自己的體力、耐力較勁,一堆堆HTML指令碼嵌入在C程式碼中,一個配置的功能嵌入的HTML程式碼就差不多有2萬行,後期維護更別說了,可是沒辦法因為是嵌入的系統,只有這樣更高效,而且嵌入裝置本身自己的資源有限,所以也只能用CGI,做完這個專案處於對技術的深入瞭解,買了一些網站開發的書看,記得那會國內做專案用的比較多的是asp.net和JSP,PHP用的人很少基本上沒有,現如今已經是2012年再也沒有接觸過web伺服器開發了,但這期間一直關注web伺服器開發相關的技術。
我們都是站在巨人的肩上
談到網頁大家都知道是HMTL書寫的一個檔案,自從93年HTML出現以來,是網際網路的發展發生了翻天覆地的變化,說實話HTML至今仍是網際網路的根本,多少網際網路的公司在這之後起來又倒下,人類的資訊在有HTML構建的網中交叉傳播,隨著網際網路的發展人們資訊的渴求越來越來大,很多現有的業務已經不能滿足人們的需要,而且隨著PC的發展、網路硬體環境和社會其他行業的資訊化的提高,人們對網際網路的需求不僅僅是資訊的獲取,更多人把相關的業務和資料處理都放到網際網路上,HTML由於其特殊性(不需要安裝客戶端),越來越受到人們親來,好多公司把業務處理直接放到網際網路上提供給客戶,在發展的初期技術人員要完成相應的業務,生成指定的頁面只能將HTML程式碼嵌入到自己的程式碼中,根據不同的業務打印出不同的HTML頁面,這個時候的網站開發是最初級階段,沒有所謂的WEB伺服器,技術人員要自己處理網路連線、業務邏輯、指令碼網頁生成、資料訪問,這其中的網路連線處理就佔用很大的開發時間,相當於每次開發技術人員都要先開發一個高效的網路伺服器,而生成HTML網頁的程式碼由於每次的業務邏輯不同,都要重新實現,並且實際的程式碼和HTML程式碼穿插在一起也增加了專案的維護難度,CGI就是這麼一個東西,估計現在已經沒有人用了,隨著應用的深入和推廣,人們發現好開發人員的好多工作都是重複的勞動,這是有些大一點的公司開始,把這些重複勞動的工作都抽離出來,例如微軟推出了iis伺服器,96年推出了ASP指令碼,這樣做得目的就是讓技術人員從繁雜的伺服器開發和指令碼生成中解脫出來,只專注於業務邏輯的開發,這個時間的發展僅僅經過了一年的時間就出現了很多web伺服器和伺服器端開發指令碼,像PHP就是在94年出現的,比較有名的Apache也是在那個時間短出現的,到現在已經出現好多web伺服器和伺服器端指令碼語言,例如Nginx、python、Rube、jsp、lua、lisp和asp.net等等,最值得人們敬畏的是這些都是免費提供給人們使用,今天人們可以站著前人的肩膀上很輕鬆的開發基於WEB的應用,甚至你都不需要懂任何伺服器的技術,只需要學會指令碼懂得如何處理使用者的需求。
底層的伺服器
今天我不需要自己實現一個web伺服器了,有許多好用的伺服器我們可以直接拿來使用,但對於一個真正geek程式設計師,我覺的必須懂一點伺服器的原理,作為一個web伺服器主要解決幾個問題(1)平臺問題,要支援不同的平臺,這就要求伺服器在開發過程中核心必須使用標準的POSIX,同時也要可以跨平臺版本編譯(2)網路連線高併發的問題(3)HTTP協議的解析和處理,這三個問題構成了一個web服務的核心層,所有的web伺服器都要解決這三個問題,一個web伺服器的效能好壞就取決於這三個問題誰解決的更好,除了這些作為一個web伺服器還有支援可擴充套件性,提供第三方擴充套件的開發,可以根據不同的需求附加不同的功能庫,伺服器最好還要支援負載均衡的功能,因為隨著訪問量的增加,一個伺服器很難應付更多的訪問請求。
我們的指令碼
指令碼的第一個問題:
HTTP基於問答的特性決定了指令碼的實現,我們知道HTTP協議是問答方式的,就是你請求我給你發回內容,這個是有早起的網際網路的特性決定的,也只有這樣網際網路才能更靈活,HTML的網狀結構才能變成一個空間的網狀結構,因為大家可以不需要關心相互的狀態,只需要一個連線就可以相互傳播和訪問,但對於具體的應用,單獨的一個網站要處理自己的業務,確需要保留場景和業務邏輯的狀態,沒有辦法指令碼就必須解決這個問題,幫助網頁維護一個狀態是任何指令碼語言必須解決的問題,大部分指令碼語言是通過SESSION和COOKIE來實現的,這幾乎成為一種共識,只要開發伺服器端指令碼都實現這個功能,當然也可以不通過這個來實現狀態的持久化,可以通過記憶體伺服器,例如memcache(更高效)等。
指令碼的第二個問題:
處理的業務各種各樣,可能有些業務指令碼現有的功能只能滿足部分功能,這就要就指令碼語言有很好的可擴充套件性,使用者可以根據自己的需求實現不同的庫,通過指令碼呼叫,達到擴充套件功能的目的。
指令碼的第三個問題:
效率是一個指令碼受歡迎的關鍵,這裡的效率除了執行效率還有開發效率。