最近有人問我,Nginx有動態分離機制,靜態請求直接就能夠經過Nginx處理,動態請求才轉發請求到後臺交由Tomcat進行處理。並且Nginx在負載上面遠超Apache,爲何目前大多數的互聯網公司都是使用Nginx+Apache+Tomcat這種架構模式,而不是直接Nginx+Tomcat,這樣不是架構更加方便,並且性能更佳優異嘛。
我以爲這個問題很是有意思,也去問了一些人,有人說應該是之前公司使用Apache+php習慣了,而後nginx出現之後不敢輕易更改架構,因此在前面加一層Nginx反向代理。其實
提出這種問題的人,必定是沒有本身搭建太高負載站點,也根本沒有仔細瞭解過Nginx和Apache之間究竟有什麼區別。php
Nginx
Nginx ("engine x") 是一個高性能的HTTP和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 服務器。其特色是佔有內存少,併發能力強。前端
Nginx爲何可以載一樣的硬件下作到更高的負載,就在於其成熟的事件驅動框架,和事件調度機制,異步的方式可以更好更快速的處理請求,這點和Node.JS卻是很相近。nginx
Apache是世界使用排名第一的Web服務器軟件。它能夠運行在幾乎全部普遍使用的計算機平臺上,因爲其跨平臺和安全性被普遍使用,是最流行的Web服務器端軟件之一。它快速、可靠而且可經過簡單的API擴充,將Perl/Python等解釋器編譯到服務器中。後端
請注意上面Apache的解釋,它快速、可靠而且可經過簡單的API擴充,將Perl/Python等解釋器編譯到服務器中。
這就是爲何要有Apache的緣由,因爲Web服務器自己是沒有動態語言處理能力的,因此Nginx要使用PHP、JAVA這種動態語言的時候,就必需要有應用程序服務器來處理,而Apache自己能過直接加載php.so
動態庫,可以自行處理php語言的解釋和運行,或者說整合Tomcat,而nginx就只能遵循FASTCGI協議,將全部的用戶請求轉發給後端cgi服務器,因此在一樣的請求下,性能沒法和Apache媲美。因此就有了這樣一個神奇的架構,Apache組成後端集羣,Nginx做爲反向代理的前端,即便一個集羣掛掉了,照樣能過平衡負載。
並且在現代的架構設計裏面,靜態文件等資源都是被放到CDN的,也就是說,和業務集羣毫無關係,又或者說直接就是存在一個Nginx集羣來搞定這一切,這樣就可以最大限度的在速度、併發負載、性能上面找到一個平衡點。安全