为什么有Nginx+Apache+Tomcat这种架构

655 查看

最近有人问我,Nginx有动态分离机制,静态请求直接就可以通过Nginx处理,动态请求才转发请求到后台交由Tomcat进行处理。而且Nginx在负载上面远超Apache,为什么目前大多数的互联网公司都是使用Nginx+Apache+Tomcat这种架构模式,而不是直接Nginx+Tomcat,这样不是架构更加方便,而且性能更佳优异嘛。
我觉得这个问题非常有意思,也去问了一些人,有人说应该是以前公司使用Apache+php习惯了,然后nginx出现以后不敢轻易更改架构,所以在前面加一层Nginx反向代理。其实
提出这种问题的人,一定是没有自己搭建过高负载站点,也根本没有仔细了解过Nginx和Apache之间究竟有什么区别。

Web服务器介绍

Nginx
Nginx ("engine x") 是一个高性能的HTTP和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 服务器。其特点是占有内存少,并发能力强。

Nginx为什么能够载同样的硬件下做到更高的负载,就在于其成熟的事件驱动框架,和事件调度机制,异步的方式能够更好更快速的处理请求,这点和Node.JS倒是很相近。

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集群来搞定这一切,这样就能够最大限度的在速度、并发负载、性能上面找到一个平衡点。