所謂「HTTP Keep-Alive」,在維基百科里稱為「HTTP Persistent Connection」,說白了就是復用HTTP連接,如此一來理論上客戶端的用戶體驗會更流暢,但是與之相對服務端不得不維持大量的連接。開啟還是關閉,這是個問題。
一個經常用來講解HTTPKeepAlive的例子一般是這樣描述的:當我們訪問一個包含了若干個圖片的網頁時,如果HTTPKeepAlive是關閉的,那么頁面中每一個圖片都會發起一次連接請求;但是如果HTTPKeepAlive是開啟的,那么因為可以復用HTTP連接,所以可以節省很多不必要的開銷。
聽起來不錯!不過現在可不是用貓上網的年代了,當今高帶寬低延遲的網絡讓建立HTTP連接不再是什么難事兒,此時訪問一個包含了若干個圖片的網頁時,與其打開一個連接然后串行的請求圖片,不如打開多個連接然后并行的請求圖片,事實上現代瀏覽器也都是這么干的,最佳實戰甚至倡導通過多域名進一步提升并發數。
此外,再讓我們看看某臺開啟了KeepAlive的Nginx服務器的Status結果:
shell> curl -s http://127.0.0.1/status
Active connections: 95896
server accepts handled requests
66542336512 66542336512 67713042963
Reading: 1945 Writing: 82 Waiting: 93869
其中,各項結果的含義如下:
Active connections:?number of all open connections
Server accepts handled requests:?nginx accepted 66542336512 connections, handled 66542336512 connections (no one was closed just it was accepted), and handles 67713042963 requests
Reading: nginx reads request header
Writing: nginx reads request body, processes request, or writes response to a client
Waiting:?keep-alive connections, actually it is active – (reading + writing)
實際復用HTTP連接的效果如何呢:
67713042963 / 66542336512 = 1.01 requests per connection
額滴神啊,基本等同于沒用!為什么會這樣?因為這是一臺WebService服務器,客戶端只是偶爾訪問一次,此時的KeepAlive連雞肋都不如,為了服務器的性能,關閉它吧!
…
HTTPKeepAlive,開啟還是關閉,大家不妨結合自己的客觀情況重新思考一下。