Nginx 和 Apache 在 Windows 下的性能表現誰更好?

聽說 NGINX 在 WINDOWS 下的表現遠遠不如 LINUX 下。不知是否真的如此?


nginx 的高性能依賴於 Linux 2.6 內核的 epoll [1] 或是 BSD 內核的 kqueue [2] 提供高效的網路套接字狀態輪詢服務【時間複雜度為 O(1) 】。在沒有這兩個服務的內核上則退化成為性能低下的 select 【*nix, Windows 都有、時間複雜度為 O(n) 】. Windows 沒有 epoll 和 kqueue,nginx 在 Windows 上用 select 表現自然不佳。

Windows 上類似 epoll/kqueue 的服務是 I/O Completion Ports [3]【Solaris 上也有】,理論上講是比 epoll 更加先進的服務,因為它同時支持套接字、文件、管道【kqueue 類似】,而 epoll 不支持文件。也就是說不能用 epoll 做本地文件的非同步 I/O。但不幸的是沒有成熟的開源網路伺服器使用 I/O Completion Ports。

Apache 的性能不好一概而論。它有好多種模式,主要的兩種是:1、prefork 使用的是多進程 [4];2、 worker 使用得是多進程+多線程 [5]。Windows NT 平台上線程的效率比較高【進程的效率則相對 *nix 下低】,所以使用多線程模式性能更優。Apache 還有個專門為 NT 優化的模式 [6],用的是單進程+多線程。

至於說多線程同步 I/O 相對於使用 epoll/kqueue 非同步 I/O 兩種方式孰優孰劣,有興趣的朋友可以參考我在另外一個問題的回答 [7]。

[1]: http://en.wikipedia.org/wiki/Epoll

[2]: http://en.wikipedia.org/wiki/Kqueue

[3]: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx

[4]: http://httpd.apache.org/docs/2.0/mod/prefork.html

[5]: http://httpd.apache.org/docs/2.0/mod/worker.html

[6]: http://httpd.apache.org/docs/2.0/mod/mpm_winnt.html

[7]: http://www.zhihu.com/question/19585576#88861


nginx自己說的:Windows版本的nginx使用原生Win32 API實現(而不是使用Cygwin模擬)。現在只使用了select()連接處理方法,所以高性能和可擴展性就不要想啦,加上還有很多其他的問題,現在Windows 版本的nginx也就是一個BETA版本。

Version of nginx for Windows uses the native Win32 API (not the Cygwin emulation layer). Only the select() connection processing method is currently used, so high performance and scalability should not be expected. Due to this and some other known issues version of nginx for Windows is considered to be a beta version.

他們還說了,以後我們會支持I/O completion port使得Windows版本的性能提高的。

nginx for Windows


毫無意義的比較 windows下最好不好用 直接用IIS

windows server 2008 IIS 7 其實效率和性能根本不差的

只是沒Linux下面的開源軟體那麼多 那麼容易大批量管理和自動化運維


認為Nginx性能高的原因僅僅在於用了epoll/kqueue的想法是膚淺的。Nginx的優化工作非常細緻,是整體的優化使其成為一個高性能的伺服器。epoll之類的只是冰山之一角。


https://github.com/hehaiqiang/ngwsx ngwsx is a port of nginx on windows

使用了IOCP模型,樓主可以測試一下性能。


在 Windows Server 上沒有必要使用 nginx,直接部署 IIS 即可。

首先,IIS 在吞吐量(Throughput)方面並不輸於其他 Web Server;其次,IIS 7.0 之後通過將部分模塊移入 Windows 內核 (http.sys),性能上又有了更大的提高;另外,IIS 是免費的(雖然不是開源的)。

參考:http://learn.iis.net/page.aspx/101/introduction-to-iis-7-architecture/


具體我沒有實測,Nginx相比Apache優勢在於Epoll的線程同步機制,但win下沒有這種機制。

作為測試環境其實還是要儘可能的模擬線上,用什麼無所謂。生產環境下windows系統只適合部署IIS。


好不好,看業務! 其實io 的速度都差不多 你的業務代碼寫的好 都快


從實際運用上看,

當你的數據量達到一定程度(比如日均3000pv以上),NGINX在windows下的優勢就十分小了(同等硬體下)。

當然3000PV對於一般互聯網產品而言,不是很高的一個數據 。

所以,NGINX不建議在windows下執行。當然,從維護上看,windows的維護成本會小一些(得益於GUI的友好性和幫助文件的完整性)

對於本地的測試,或者DEBUG,windows下採用NGINX是十分方便的。

總之,看你的實際情況而言,如果僅僅做調試,OS無所謂。

如果是運用到線上,建議linux。

Apache也是如此~


想用nginx最好不要選win32...


ng在win表現不咋地,如果一定要部署在win,試試netflix公司的zuul吧,原生java,可以在上面做加幾個filter做擴展。。介面友善。


apache

不過需要2.4以上


看你怎麼用了,如果能發揮出nginx的全部潛力,那還是值得一用。最麻煩的是community support,Windows的問題在mailist上很少有人問,回答者就更少之甚少了。IIS其實很不錯,和Windows天生搭配,如果使用得當(例如IIS7/7.5那些新增的功能),不會比nginx差到哪裡去。


iis 表現最好。。


這兩個軟體最好用linux下用,windows下用就好比你去KFC點了一盤宮保雞丁一樣。


今天測試了下。果然速度讓人有點無法接受。

如果是入門,對nginx做一個初步的了解。問題應該不大。

如果想做深入的研究和運用到生產環境,建議還是不要使用。


想用Nginx最好別在Windows下,Windows下開發的話最好還是Apache。如果伺服器用Windows的話,那哥就不說什麼了。。。。。


推薦閱讀:

為什麼這兩個ps命令執行結果不同?
Linux 的正確發音是什麼?
Android 系統無法被分支 (fork) 嗎,AOSP 和 GMS 是何關係?
linux g++以及build-essential 安裝問題?
請推薦 編程書籍 結合各位自己的實際?

TAG:MicrosoftWindows | Linux | FreeBSD | Web伺服器軟體 | Nginx | Apache | kqueue | 非同步IO | C10K | Solaris |