一篇文章搞清楚Nginx、Apache和Tomcat

当前网站主要分为静态页面和动态页面两部分。负责处理这些页面的软件我们通常称之为web容器,是一种服务程序,负责处理浏览器发来的访问请求:如果是静态页面会直接将文件内容呈现给浏览器,如果是动态页面会将其解析成静态内容之后再呈现给浏览器。

0. 网站页面类型和区别

首先要搞清楚什么是静态页面,什么是动态页面,它们之间有什么区别?

0.1 静态页面

通常是以html、htm、shtml等结尾的文件,所有数据都是写在文件里的。客户端加载静态页面时,无须对数据库进行操作,直接将文件内容呈现出来。
静态页面的优点:相对于另外两种页面(动态页面和伪静态),速度最快,不需要从数据库里面提取数据,也不会对服务器产生压力。
静态页面的缺点:由于数据都是写在文件里,很有可能会导致文件非常大,占用大量的服务器磁盘空间,每次添加内容都会生成新的文件。更改源代码的话必须全部更改,而不能更改一个地方,全站的静态页面就自动更改了。

0.2 动态页面

通常是以php、jsp、asp等结尾的文件,不是独立存在于服务器上的网页文件,当用户请求时服务器才会返回一个完整的网页。数据都是存储在数据库中,根据用户发出的不同请求从数据库里提取不同的数据,从而提供个性化的网页内容。
动态页面的优点:占用磁盘空间小,一般几万条数据的网站,文件大小可能只有几M。数据都是从数据库里提取出来,如果需要修改某些数据,可直接修改数据库,所有动态页面就都会自动更新。
动态页面的缺点:相对于静态页面而言,访问速度较慢,因为动态页面需要处理成静态内容,才能呈现给用户。动态页面的数据是从数据库里提取出来的,如果访问量大的话,会导致数据库的压力很大。现在动态网站多数都使用了缓存技术,但相对于静态网站而言,服务器的压力比较大,访问的人越多服务器的压力越大。

0.3 网站页面的处理流程

以Apache服务器为例,用户使用浏览器访问一个网站时,分为以下三种情况:

  1. 访问静态页面:当浏览器发起一个访问网站资源的请求时,首先由DNS服务器将域名解析为网站服务器的IP地址,http或者https协议将用户的请求发送给此IP地址对应的web服务器,web服务器收到请求后就在自己的网站目录下寻找相对应的页面文件(例如index.html),将文件内容返回浏览器,浏览器收到web服务器的响应后,接收并下载服务器的html静态代码,然后浏览器解读代码,最终将网页内容呈现出来。
  2. 访问动态页面:流程和静态页面是一样的,只不过是多一步解析动态脚本的步骤。首先DNS域名解析,然后web服务器收到用户的请求后找到对应的php脚本文件,然后将此脚本委托给php服务器处理,php服务器将脚本解析成静态代码,再将静态代码返回给web服务器,web服务器再将静态代码返回给用户,最终在浏览器上呈现出来。
  3. 访问数据库:流程和动态页面是一样的,只不是多了一步访问数据库的步骤。首先DNS域名解析,web服务器收到请求后找到对应的php脚本文件,将此脚本委托给php服务器处理,php服务器通过解析脚本去连接数据库,从数据库里将数据取出来,再将数据生成静态代码发给web服务器,web服务器再将静态代码返回给用户,最终在浏览器上呈现出来。

1. Nginx、Apache和Tomcat

1.1 Nginx

Nginx是一款开源的轻量级的web服务器/反向代理服务器软件,其特点是占用内存少,并发能力强,也是目前比较流行的web服务器软件之一。静态页面处理能力较强,尤其是反向代理服务表现突出,常被用作负载均衡和代理服务器使用。常见的网站架构有:nginx+php、nginx+tomcat、nginx+apache+php等。

1.2 Apache

Apache HTTP Server(简称Apache)是Apache软件基金会的一款开放源码的web服务器软件,可以在大多数计算机操作系统中运行,是目前最流行的web服务器端软件之一。apache支持的模块众多,性能稳定,本身只支持静态解析,但可以通过扩展脚本、模块等支持动态页面。常见的网站架构有:apache+php、apache+tomcat等。

1.3 Tomcat

Tomcat是一款开源的Java web应用服务器软件,常被称之为servlet容器,用来处理jsp页面和运行servlet。上文中的Jsp全称是Java Server Pages,它和Servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。Jsp的最大特点在于,写jsp就像在写html,html只能为用户提供静态数据,而jsp技术允许在页面中嵌套java代码,为用户提供动态数据。tomcat在jsp页面的处理上与php一样,就是个解析器。tomcat与php相同的是,它们都是动态脚本解析器;不同的是,tomcat本身还能处理静态页面,同时又是一个web服务器。由于Tomcat技术先进、性能稳定、而且免费,因而深受Java爱好者的喜爱并得到了广泛使用。tomcat静态页面处理能力较弱,它的强项是运行Jave Servlet(用Java编写的服务器端程序)。

1.4 总结

这三款软件各有优势,身为运维人员需要清楚的知道,在哪个场合下使用哪个软件:

  1. 如果你只是处理静态页面,那就使用nginx;
  2. 如果你需要处理php语言编写的动态页面,那就使用apache+php;
  3. 如果是java语言编写的程序,那tomcat无疑是最好的选择。

2. Nginx和Apache

2.1 Nginx相对Apache的优点

  1. 轻量级。同样起web服务,Nginx比Apache占用更少的内存及资源;
  2. 抗并发。Nginx处理请求是异步非阻塞的,而Apache则是阻塞型的。在高并发下Nginx能保持低资源、低消耗、高性能。
  3. 高度模块化的设计,编写模块相对简单。
  4. 社区活跃。各种高性能模块出品迅速啊。

2.2 Apache相对Nginx的优点

  1. rewrite。比Nginx的rewrite强大。
  2. 模块超多。基本想到的都可以找到。
  3. 少bug。Nginx的bug相对较多。
  4. 超稳定。

2.3 Apache本身不是不能处理动态页面吗?

关于动静态分离,经常有人问,不是说apache本身不能处理动态页面吗,那为什么会有人说用nginx处理静态页面,用apache处理动态页面?那我只能说是你理解错了,apache本身是不支持动态页面处理的,而是将动态页面交由php或者tomcat等其他服务程序去处理,php或者tomcat等服务程序将处理后的静态页面返回给apache,apache再将静态内容呈现给客户。

那又有人说了,即然动态页面是由php程序处理的,那为什么会有人说apache处理动态页面要比nginx好,既然都是由php处理动态页面,那nginx和apache有什么区别,不都是把处理后的静态内容返回给客户吗,为什么要说处理动态页面apache要比nginx好呢?那我只能说还是你理解错了,应该说apache和php结合的更好一些,但这是以前,如果站在现在这个角度上讲,谁好谁差还不一定呢。

2.3 总结

Nginx适合处理静态请求和反向代理[1],Apache适合处理动态请求。但这个差异化只有在请求量达到一定的阈值时表现差异才能表现出来。流量阈值需求不到的时候,选择Nginx是性价比最好的选择。也就是说,如果考虑到性能的因素,考虑使用Nginx,否则可以使用Apache。

但是处理动态请求真的是Apache更好吗?以PHP为例,Nginx使用FastCGI(FastCGI模式是指由单独的进程管理器如php-fpm启动并管理多个解释器进程,web服务器只需将脚本传给php-fpm执行即可)处理动态请求,而Apache使用mod_php(把php服务做为模块来进行调用,模块将相关函数嵌入web服务请求处理流程,不需要额外的解释器进程)处理动态请求。mod_php方式就如同php是它的一个部门,关于php的问题这个部门可以直接处理;FastCGI模式相当于公司之间的合作,web和php分别是两家公司,web公司将php业务外包给php公司负责。其实无论是mod_php、还是FastCGI,都有其自己的优势。以前在FastCGI技术还不成熟的时候,自然是mod_php稳定、处理速度更快一些,可是社会是不断在向前进步的,现如今FastCGI技术已经非常成熟了,网上也有很多人做了相关的测试,说是FastCGI比mod_php更稳定、速度更快。

名词解释

[1]正向代理:代理客户端,为客户端收发请求,使真实客户端对服务器不可见。

[2]反向代理:代理服务器,为服务器收发请求,使真实服务器对客户端不可见。

参考文档

  1. 详谈Apache、Nginx和tomcat的区别以及处理静态页面和动态页面的方式
  2. 我为什么推荐大家使用 Nginx 而不是 Apache?