Nginx 跟 Haproxy 其實他們兩個的定位是有所不同的,Nginx的定位是一個server,Haproxy的定位是一個load balancer。
Nginx透過各種plugin module可以支援Load balance的功能,而且效能不弱於haproxy太多,所以總有人拿來將兩個東西比較。其實Apache也可以透過相關模組做load balancer,只不過效能差得多而已所以沒人用而已。當然了Nginx的LB功能現在是其支柱主打功能而已。
看到有很多答案對於haproxy多程序有誤解,這裡特別說下,haproxy早就支援多程序模型,但是並不是Nginx的Worker Master結構,而是平等多程序結構,同時也支援REUSE PORT選項,所以在這裡Nginx跟Haproxy對於多核利用上都是一樣的並沒有本質區別。
haproxy從1.8之後,添加了多執行緒的模式,現在它更推薦的也是這個模型,在一些平臺上能夠更好的利用多核。而Nginx從來沒有多執行緒模型。而且看起來社群也沒打算支援。
Nginx其實基於server的功能來說,是Haproxy不具備的,讓Haproxy像一個普通Web server那樣回覆一個普通的HTTP請求是很難的,不大規模修改原始碼根本做不到。Haproxy是圍繞轉發模型設計的,整個流程就是圍繞如何快速把一個請求或者回復轉發到另一端。並不是像Server一樣接受請求然後回覆。
但是Nginx作為一個純粹的LB來說,尤其是針對Web LoadBalancer來說,功能沒有haproxy那麼細緻。Haproxy支援的ACL物件非常廣泛,很多情況並不需要指令碼輔助就可以完成複雜的功能,而Nginx稍微複雜的LoadBalance功能都需要使用指令碼才能完成,這樣效能就會差很多。
從功能角度上來講,Nginx其實功能比Haproxy要多(當然並不都是免費的),因為他的開發社群和定位方向都比Haproxy要大和寬泛。在Nginx上面的各種解決方案也要多的多。比如WAF,haproxy一致都沒有比較好的原生解決方案。還有包括最近針對Service Mesh的支援,haproxy都是很難跟得上。
但是基礎功能,包括HTTP2,TLS 1.3,Script, SSL/TLS offload,ocsp,SNI preload,其實haproxy最新版本早就已經支援,甚至比Nginx還更早些(HTTP2比較晚,但是現在也支援了)。另外,關於硬體SSL offload支援其實主要是OpenSSL的engine的支援,所以這個大家都差不多,只要相容最新OpenSSL都沒什麼問題。
Haproxy的優點其實是轉發效能稍高,因為haproxy追求zero copy的forward流程,所以程式碼都傾向於最佳化在這一點上。但是這個優勢現在被廣泛的TLS/SSL應用抹平了,對比0 copy節省的時間來說加解密的消耗的效能佔絕大多數,所以haproxy基本上在現在的廣泛SSL環境下沒有什麼優勢了。除非你想用純HTTP,而且還想使用比較複雜的基於HTTP頭部的Load Balance功能,那麼Haproxy是個好選擇,否則只是單純LB的話,LVS效能其實更更高,畢竟人家在Kernel裡面。
從程式碼層面來說,Nginx的結構化程式碼和模組化都比Haproxy好太多。Haproxy程式碼模組化一直是個大問題,內部結構模組化不足,二次開發困難,最近到1.9了才有些改善,但是仍然有很多內部trick的hack和讓人發懵的FLAG。相比Nginx做到的徹底的模組化,可以輕易的透過開發自己的模組來改變或者實現相關功能,這個haproxy是不具備的。
從開發社群來說,Nginx也比Haproxy好太多,Haproxy雖然社群歷史更久,但是一直都是不慍不火,貢獻者因為原作者的嚴格的控制,一直都很少,再加上沒有module開發功能,所以吸引的開發者一直都不多。帶來的問題就是版本更新慢,支援的新功能慢。HTTP2的開發完全靠原作者一個人,所以支援進度嚴重拖後。
這篇文章看起來好像是變成了對haproxy吐槽,但是因為在工作中接觸這兩個東西實在太多,而且是進行深度二次開發,所以自認為還是有一定的瞭解的。從目前來看,如果haproxy不能更開放招募更多的貢獻者,不能徹底修改架構支援module開發,是無法比擬NGINX的。
另外Haproxy優勢一點的就是免費版的功能比Nginx免費版的更實惠。對於小又窮的站點的確是個好處。
Nginx 跟 Haproxy 其實他們兩個的定位是有所不同的,Nginx的定位是一個server,Haproxy的定位是一個load balancer。
Nginx透過各種plugin module可以支援Load balance的功能,而且效能不弱於haproxy太多,所以總有人拿來將兩個東西比較。其實Apache也可以透過相關模組做load balancer,只不過效能差得多而已所以沒人用而已。當然了Nginx的LB功能現在是其支柱主打功能而已。
看到有很多答案對於haproxy多程序有誤解,這裡特別說下,haproxy早就支援多程序模型,但是並不是Nginx的Worker Master結構,而是平等多程序結構,同時也支援REUSE PORT選項,所以在這裡Nginx跟Haproxy對於多核利用上都是一樣的並沒有本質區別。
haproxy從1.8之後,添加了多執行緒的模式,現在它更推薦的也是這個模型,在一些平臺上能夠更好的利用多核。而Nginx從來沒有多執行緒模型。而且看起來社群也沒打算支援。
Nginx其實基於server的功能來說,是Haproxy不具備的,讓Haproxy像一個普通Web server那樣回覆一個普通的HTTP請求是很難的,不大規模修改原始碼根本做不到。Haproxy是圍繞轉發模型設計的,整個流程就是圍繞如何快速把一個請求或者回復轉發到另一端。並不是像Server一樣接受請求然後回覆。
但是Nginx作為一個純粹的LB來說,尤其是針對Web LoadBalancer來說,功能沒有haproxy那麼細緻。Haproxy支援的ACL物件非常廣泛,很多情況並不需要指令碼輔助就可以完成複雜的功能,而Nginx稍微複雜的LoadBalance功能都需要使用指令碼才能完成,這樣效能就會差很多。
從功能角度上來講,Nginx其實功能比Haproxy要多(當然並不都是免費的),因為他的開發社群和定位方向都比Haproxy要大和寬泛。在Nginx上面的各種解決方案也要多的多。比如WAF,haproxy一致都沒有比較好的原生解決方案。還有包括最近針對Service Mesh的支援,haproxy都是很難跟得上。
但是基礎功能,包括HTTP2,TLS 1.3,Script, SSL/TLS offload,ocsp,SNI preload,其實haproxy最新版本早就已經支援,甚至比Nginx還更早些(HTTP2比較晚,但是現在也支援了)。另外,關於硬體SSL offload支援其實主要是OpenSSL的engine的支援,所以這個大家都差不多,只要相容最新OpenSSL都沒什麼問題。
Haproxy的優點其實是轉發效能稍高,因為haproxy追求zero copy的forward流程,所以程式碼都傾向於最佳化在這一點上。但是這個優勢現在被廣泛的TLS/SSL應用抹平了,對比0 copy節省的時間來說加解密的消耗的效能佔絕大多數,所以haproxy基本上在現在的廣泛SSL環境下沒有什麼優勢了。除非你想用純HTTP,而且還想使用比較複雜的基於HTTP頭部的Load Balance功能,那麼Haproxy是個好選擇,否則只是單純LB的話,LVS效能其實更更高,畢竟人家在Kernel裡面。
從程式碼層面來說,Nginx的結構化程式碼和模組化都比Haproxy好太多。Haproxy程式碼模組化一直是個大問題,內部結構模組化不足,二次開發困難,最近到1.9了才有些改善,但是仍然有很多內部trick的hack和讓人發懵的FLAG。相比Nginx做到的徹底的模組化,可以輕易的透過開發自己的模組來改變或者實現相關功能,這個haproxy是不具備的。
從開發社群來說,Nginx也比Haproxy好太多,Haproxy雖然社群歷史更久,但是一直都是不慍不火,貢獻者因為原作者的嚴格的控制,一直都很少,再加上沒有module開發功能,所以吸引的開發者一直都不多。帶來的問題就是版本更新慢,支援的新功能慢。HTTP2的開發完全靠原作者一個人,所以支援進度嚴重拖後。
這篇文章看起來好像是變成了對haproxy吐槽,但是因為在工作中接觸這兩個東西實在太多,而且是進行深度二次開發,所以自認為還是有一定的瞭解的。從目前來看,如果haproxy不能更開放招募更多的貢獻者,不能徹底修改架構支援module開發,是無法比擬NGINX的。
另外Haproxy優勢一點的就是免費版的功能比Nginx免費版的更實惠。對於小又窮的站點的確是個好處。