详谈ApacheNginx和tomcat的区别以及处理静态页面和动态页面的方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详谈ApacheNginx和tomcat的区别以及处理静态页面和动态页面的方式相关的知识,希望对你有一定的参考价值。

就目前来说,网站主要分为静态页面和动态页面,纯静态页面的网站已经比较少见了,大型网站一般使用的是静态页面+动态页面的建站技术,还有一部分网站是纯动态页面。
负责处理这些页面的软件我们通常称之为web容器,是一种服务程序,负责处理客户端(浏览器)发来的访问请求,如果是静态页面会直接将文件内容呈现给客户端(浏览器),如果是动态页面会将其解析成静态内容之后再呈现给客户端(浏览器)。
技术分享图片

一、Apache、nginx和tomcat的区别

Apache
Apache HTTP Server(简称Apache)是Apache软件基金会的一款开放源码的web服务器软件,可以在大多数计算机操作系统中运行,是目前最流行的web服务器端软件之一。apache支持的模块众多,性能稳定,本身只支持静态解析,但可以通过扩展脚本、模块等支持动态页面。常见的网站架构有:apache+php、apache+tomcat等。
Nginx
Nginx是一款开源的轻量级的web服务器/反向代理服务器软件,其特点是占用内存少,并发能力强,也是目前比较流行的web服务器软件之一。静态页面处理能力较强,尤其是反向代理服务表现突出,常被用作负载均衡和代理服务器使用。常见的网站架构有:nginx+php、nginx+tomcat、nginx+apache+php等。
Tomcat
Tomcat是一款开源的Java web应用服务器软件,常被称之为servlet容器,用来处理jsp页面和运行servlet。tomcat技术先进、性能稳定、而且免费,因而深受Java爱好者的喜爱并得到了广泛使用。tomcat静态页面处理能力较弱,它的强项是运行Jave Servlet(用Java编写的服务器端程序)。

这三款软件各有优势,身为运维人员需要清楚的知道,在哪个场合下使用哪个软件。
如果你只是处理静态页面,那就使用nginx;
如果你需要处理php语言编写的动态页面,那就使用apache+php;
如果是java语言编写的程序,那tomcat无疑是最好的选择。

二、网站页面的类型和区别

经常会有人问,什么是静态页面,什么是动态页面,它们之间有什么区别,那么现在我们就来看一下静态页面和动态页面,以及伪静态都是什么吧。
1、静态页面
通常是以html、htm、shtml等结尾的文件,所有数据都是写在文件里的。客户端加载静态页面时,无须对数据库进行操作,直接将文件内容呈现出来。
优点:相对于另外两种页面(动态页面和伪静态),速度最快,不需要从数据库里面提取数据,也不会对服务器产生压力。
缺点:由于数据都是写在文件里,很有可能会导致文件非常大,占用大量的服务器磁盘空间,每次添加内容都会生成新的文件。更改源代码的话必须全部更改,而不能更改一个地方,全站的静态页面就自动更改了。
2、动态页面
通常是以php、jsp、asp等结尾的文件,不是独立存在于服务器上的网页文件,当用户请求时服务器才会返回一个完整的网页。数据都是存储在数据库中,根据用户发出的不同请求从数据库里提取不同的数据,从而提供个性化的网页内容。
优点:占用磁盘空间小,一般几万条数据的网站,文件大小可能只有几M。数据都是从数据库里提取出来,如果需要修改某些数据,可直接修改数据库,所有动态页面就都会自动更新。
缺点:相对于静态页面而言,访问速度较慢,因为动态页面需要处理成静态内容,才能呈现给用户。动态页面的数据是从数据库里提取出来的,如果访问量大的话,会导致数据库的压力很大。现在动态网站多数都使用了缓存技术,但相对于静态网站而言,服务器的压力比较大,访问的人越多服务器的压力越大。
3、伪静态
假静态页面,通过将动态页面的URL地址重写,改写成以html、htm等结尾的静态URL地址,实际上还是动态页面。
优点:方便搜索引擎进行收录。在SEO方面,伪静态和静态页面的功能是相同的。
缺点:相对于静态页面和动态页面而言,服务器的性能消耗是最大的。静态页面可以节省服务器的资源消耗,而伪静态是增加服务器消耗,因为Rewrite还需要消耗额外的资源。

三、网站页面的处理流程

技术分享图片
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服务器再将静态代码返回给用户,最终在浏览器上呈现出来。

四、处理动态页面的三种方式

关于动静态分离,经常有人问,不是说apache本身不能处理动态页面吗,那为什么会有人说用nginx处理静态页面,用apache处理动态页面?
那我只能说是你理解错了,apache本身是不支持动态页面处理的,而是将动态页面交由php或者tomcat等其他服务程序去处理,php或者tomcat等服务程序将处理后的静态页面返回给apache,apache再将静态内容呈现给客户。
那又有人说了,即然动态页面是由php程序处理的,那为什么会有人说apache处理动态页面要比nginx好,既然都是由php处理动态页面,那nginx和apache有什么区别,不都是把处理后的静态内容返回给客户吗,为什么要说处理动态页面apache要比nginx好呢?
那我只能说还是你理解错了,应该说apache和php结合的更好一些,但这是以前,如果站在现在这个角度上讲,谁好谁差还不一定呢,为什么这么说,请继续往下看。
以php为例,我们先来看一下处理动态页面的三种方式。
技术分享图片
1、mod_php
即模块的方式,把php服务做为模块来进行调用,模块将相关函数嵌入web服务请求处理流程,不需要额外的解释器进程。例如apache的libphp5.so模块,注意libphp5.so是php提供的,不是apache自带的。
下面是apache配置文件里php模块的配置内容

DirectoryIndex index.php index.html index.html.var
LoadModule php5_module modules/libphp5.so
<IfModule mime_module>
AddType application/x-httpd-php .php
AddType applicaiton/x-httpd-php-source .phps

简单来讲,就是apache将php做为自己的一个模块来使用。
2、CGI
这个模式很少人使用,因为每次调用它都需要fork一个解释器进程来执行php脚本,执行结束后进程随之退出。一个请求就需要fork一个进程,周而复始,效率低下不说,还大量消耗服务器资源。
下面是apache关于CGI的配置
配置文件里启用CGI模式

#LoadModule php5_module modules/libphp5.so
Action application/x-httpd-php /cgi-bin/php-cgi

然后将CGI脚本文件拷贝到apache的cgi-bin目录下
cp /usr/bin/php-cgi /var/www/cgi-bin/
3、FastCGI
FastCGI模式是指由单独的进程管理器如php-fpm启动并管理多个解释器进程,web服务器只需将脚本传给php-fpm执行即可。执行完毕后解释器进程不会退出,而是等待下一个请求。这种方式既适用于本地部署,也适用于分布式架构,并且多个进程并行处理,不仅配置灵活,而且效率高。
以下是nginx配置文件里关于FastCGI的配置内容

location ~ .php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

4、简单总结
假设web服务器是一家公司,那么mod_php方式就如同php是它的一个部门,关于php的问题这个部门可以直接处理;CGI模式相当于公司没有专门处理php问题的部门,遇到php相关的事情需要处理,就临时拉人成立一个工作小组,问题解决后这个临时小组也就解散了;FastCGI模式相当于公司之间的合作,web和php分别是两家公司,web公司将php业务外包给php公司负责。
说了这么多,那到底在动态页面处理方面,apache好还是nginx好呢?
其实无论是mod_php、还是FastCGI,都有其自己的优势。以前在FastCGI技术还不成熟的时候,自然是mod_php稳定、处理速度更快一些,可是社会是不断在向前进步的,现如今FastCGI技术已经非常成熟了,网上也有很多人做了相关的测试,说是FastCGI比mod_php更稳定、速度更快。我个人认为,如果是单机部署的话,可考虑使用mod_php方式,因为毕竟多启一个进程对系统而言就多了一些资源消耗;如果分开部署的话,可考虑使用FastCGI,现在越来越多的人使用nginx+php架构了。

五、tomcat处理Jsp/Servlet

1、Jsp
Jsp全称是Java Server Pages,它和Servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。Jsp的最大特点在于,写jsp就像在写html,html只能为用户提供静态数据,而jsp技术允许 在页面中嵌套java代码,为用户提供动态数据。
tomcat在jsp页面的处理上与php一样,就是个解析器。tomcat与php相同的是,它们都是动态脚本解析器;不同的是,tomcat本身还能处理静态页面,同时又是一个web服务器。
2、Servlet
Java Servlet是Java Web的三大组件之一,是Java语言编写的运行在服务器端的小程序,由Servlet容器管理,用于交互式地浏览和修改数据,生成动态的内容。编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。Servlet被编译为平台独立的字节码,可以被动态地加载到支持Java技术的web服务器中运行。
与jsp、php不同的是,它是在servlet容器中独立运行的程序,而不是嵌入在网站页面里的。

以上是关于详谈ApacheNginx和tomcat的区别以及处理静态页面和动态页面的方式的主要内容,如果未能解决你的问题,请参考以下文章

一文总结应用WebHTTP服务器,ApacheNginx,TomcatIISJBossGlassfish等区别

Tomcat结合ApacheNginx实现高性能的web服务器

详谈session和cookie的区别

详谈get和post的区别与联系

阿里总监详谈:功能测试与性能测试到底有什么区别?

阿里总监详谈:功能测试与性能测试到底有什么区别?