热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

详谈Apache、Nginx和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

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容器中独立运行的程序,而不是嵌入在网站页面里的。

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


推荐阅读
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
author-avatar
fst123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有