http系列---webServer(apache、tomcat 与 nginx)

一、背景

此处的apache指的是Apache软件基金会下的一个项目——Apache HTTP Server Project

从计算机层面上来说,除了硬件就是软件,可以说除了我们能看到的实物之外剩下的都是软件,说白了,这三个也没有什么特殊,就是三个应用软件而已,只不过他们的作用比较大和应用较广泛罢了。

宽泛来说,三者都属于Web Server,也就是HTTP server,说是server(服务器),本质上也是一种应用程序——它通常运行在服务器之上,绑定服务器的IP地址并监听某一个tcp端口来接收并处理HTTP请求,这样客户端(一般来说是IE, Firefox,Chrome这样的浏览器)就能够通过HTTP协议来获取服务器上的网页(HTML格式)、文档(PDF格式)、音频(MP4格式)、视频(MOV格式)等等资源。下图描述的就是这一过程:
在这里插入图片描述

严格来说,Apache/Nginx 应该叫做「HTTP Server」;而 Tomcat 则是一个「Application Server」,或者更准确的来说,是一个「Servlet/JSP」应用的容器(Ruby/Python 等其他语言开发的应用也无法直接运行在 Tomcat 上)。

二、简单对比
1. 定义
  1. ApacheApache HTTP服务器是一个模块化的服务器,可以运行在几乎所有广泛使用的计算机平台上。其属于应用服务器。Apache支持支持模块多,性能稳定,Apache本身是静态解析,适合静态HTML、图片等,但可以通过扩展脚本、模块等支持动态页面等。
    (Apche可以支持PHPcgiperl,但是要使用Java的话,你需要Tomcat在Apache后台支撑,将Java请求由Apache转发给Tomcat处理。)
    缺点:配置相对复杂,自身不支持动态页面。
  2. Tomcat:Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。
  3. NginxNginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。
2. 比较
  1. Apache与Tomcat的比较
    相同点:
    1)两者都是Apache组织开发的
    2)两者都有HTTP服务的功能
    3)两者都是免费的
    不同点:
    1)Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等),而Tomcat是Apache组织在符合Java EE的JSP、Servlet标准下开发的一个JSP服务器。
    2)Apache是一个Web服务器环境程序,启用他可以作为Web服务器使用,不过只支持静态网页如(ASP,PHP,CGI,JSP)等动态网页的就不行。如果要在Apache环境下运行JSP的话就需要一个解释器来执行JSP网页,而这个JSP解释器就是Tomcat。
    3)Apache:侧重于HTTPServer ,Tomcat:侧重于Servlet引擎,如果以Standalone方式运行,功能上与Apache等效,支持JSP,但对静态网页不太理想;
    4)Apache是Web服务器,Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。
    5)实际使用中Apache与Tomcat常常是整合使用:
    如果客户端请求的是静态页面,则只需要Apache服务器响应请求。
    如果客户端请求动态页面,则是Tomcat服务器响应请求。
    因为JSP是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销。
    可以理解Tomcat为Apache的一种扩展。

  2. Nginx与Apache比较
    1)nginx相对于apache的优点
    轻量级,同样起web 服务,比apache占用更少的内存及资源
    抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
    高度模块化的设计,编写模块相对简单
    提供负载均衡
    社区活跃,各种高性能模块出品迅速
    2)apache 相对于nginx 的优点
    apache的 rewrite 比nginx 的强大;
    支持动态页面;
    支持的模块多,基本涵盖所有应用;
    性能稳定,而nginx相对bug较多。
    3)两者优缺点比较
    Nginx 配置简洁, Apache 复杂;
    Nginx 静态处理性能比 Apache 高 3倍以上;
    Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端用;
    Apache 的组件比 Nginx 多;
    apache是同步多进程模型,一个连接对应一个进程;
    nginx是异步的,多个连接(万级别)可以对应一个进程;
    nginx处理静态文件好,耗费内存少;
    动态请求由apache去做,nginx只适合静态和反向;
    Nginx适合做前端服务器,负载性能很好;
    Nginx本身就是一个反向代理服务器 ,且支持负载均衡

3. 总结

Nginx优点:负载均衡、反向代理、处理静态文件优势。nginx处理静态请求的速度高于apache;

Apache优点:相对于Tomcat服务器来说处理静态文件是它的优势,速度快。Apache是静态解析,适合静态HTML、图片等。

Tomcat:动态解析容器,处理动态请求,是编译JSP\Servlet的容器,Nginx有动态分离机制,静态请求直接就可以通过Nginx处理,动态请求才转发请求到后台交由Tomcat进行处理。

Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache较适合。

三、详细解释
什么是nginx

nginx is a free,open-source,high-performance http server and reverse proxy,as well as an IMAP/POP3 proxy.通俗的说Nginx提供web服务,反向代理,以及IMAP/POP3代理,那么什么是web服务?反向代理?IMAP/POP3代理?

web服务:服务端通过网络可以提供给客户端所请求的资源,

反向代理:代表资源服务器来回应客户端的请求(或者正向代理的请求),至于资源服务器为什么不自己回应,想想被告与被告律师的关系(被告的律师看做反向代理,被告是什么?自己猜吧(ˇˍˇ) 想~),正向代理是什么?原告的代理律师就是正向代理)

IMAP/POP3:是一种stream传输协议,常常被用来做一些邮件传输

IMAP:Internet Mail Access Protocol 是一种交互式的邮件邮件传输协议,交互式说的就是客户端可以和服务端针对邮件的各种操作同步,一份邮件,客户端有,服务端也有,客户端有什么操作会同步到服务端,反之亦然。

POP3:Post Office Protocol 3邮件传输协议相比IMAP协议只是服务器不保留邮件,一旦给了客户端,自行删除对应的邮件,客户端对邮件的各种操作与服务器无关
在这里插入图片描述
在这里插入图片描述
Porxy&reverseProxy
(注意代理的概念只要把握准正向和反向都是以客户端为参考的,从客户端出的是正向,客户端接受的是反向)
学习一个东西首先要了解其框架架构,最初是出于什么目的设计,为解决什么问题,以及怎样设计是最重要的,所以下面的重点就是这些:
为什么会出现nginx或者其他相似功能的web服务,一方面是因为http的历史局限型,而最重要的还是C10K问题,高并发访问,好吧什么历史局限型,说的通俗点就是httpd(apache)老了不太能适应现在的网络环境了,毕竟人家Apache是95年的东西了,现代的计算机网络已经和当时远远不同了,倒不如说现在还大量使用httpd已经是一个小奇迹了(之所以不说奇迹,就担心较真的人太过在意,毕竟做it较真的人还是很多大的,毕竟我就是一个较真的人),还有一个问题C10K,什么意思?The C10k problem is the problem of optimising network sockets to handle a large number of clients at the same time.The name C10k is a numeronym for concurrently handling ten thousand connections.Apache的致命缺陷就是同时不可以处理一万个请求(建立套接字处理),对电商站点的影响很大~~

Nginx战斗民族设计的一款轻量级的web服务,免费开源,高性能:
在这里插入图片描述
nginxArchitecture

一个master进程负责生产各种子进程,为什么要说是各种?缘由在于其每个子进程所具有的功能可以是nginx所有功能的一部分,也可以是全部。这个在于我们背锅侠的设置了,当然nginx的一些基本功能,每个子进程是必须要有的。看到连接后端的HTTP,FastCGI以及memcache了么,这些都是连接后端服务器(也叫Backend)的协议,HTTP协议,FastCGI协议以及memcached分布式缓存系统。

什么是Tomcat?

是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。但是,不能将Tomcat和Apache HTTP服务器混淆,Apache HTTP服务器是一个用C语言实现的HTTPWeb服务器;这两个HTTP web server不是捆绑在一起的。Apache Tomcat包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。

Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。最早支持Servlet标准的是JavaSoft的Java Web Server。

通用Servlet

一般来说,通用Servlet由javax.servlet.GenericServlet实作Servlet界面。程序设计人员可以通过使用或继承这个类来实现通用Servlet应用。

HttpServlet

javax.servlet.http.HttpServlet实现了专门用于响应HTTP请求的Servlet,提供了响应对应HTTP标准请求的doGet()、doPost()等方法。

生命周期

当servlet被部署在应用服务器中(应用服务器中用于管理Java组件的部分被抽象成为容器)以后,由容器控制servlet的生命周期。除非特殊指定,否则在容器启动的时候,servlet是不会被加载的,servlet只会在第一次请求的时候被加载和实例化。servlet一旦被加载,一般不会从容器中删除,直至应用服务器关闭或重新启动。但当容器做内存回收动作时,servlet有可能被删除。也正是因为这个原因,第一次访问servlet所用的时间要大大多于以后访问所用的时间。

servlet在服务器的运行生命周期为,在第一次请求(或其实体被内存垃圾回收后再被访问)时被加载并执行一次初始化方法,跟着执行正式运行方法,之后会被常驻并每次被请求时直接执行正式运行方法,直到服务器关闭或被清理时执行一次销毁方法后实体销毁。

与JSP的关系

Java服务器页面(JSP)是HttpServlet的扩展。由于HttpServlet大多是用来响应HTTP请求,并返回Web页面(例如HTML、XML),所以不可避免地,在编写servlet时会涉及大量的HTML内容,这给servlet的书写效率和可读性带来很大障碍,JSP便是在这个基础上产生的。其功能是使用HTML的书写格式,在适当的地方加入Java代码片段,将程序员从复杂的HTML中解放出来,更专注于servlet本身的内容。

JSP在首次被访问的时候被应用服务器转换为servlet,在以后的运行中,容器直接调用这个servlet,而不再访问JSP页面。JSP的实质仍然是servlet。

JSP(全称JavaServer Pages)是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。

JSP使Java代码和特定的预定义动作可以嵌入到静态页面中。JSP句法增加了被称为JSP动作的XML标签,它们用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库提供了一种和平台无关的扩展服务器性能的方法。

JSP被JSP编译器编译成Java Servlets。一个JSP编译器可以把JSP编译成JAVA代码写的servlet然后再由JAVA编译器来编译成机器码,也可以直接编译成二进制码。

SP和Servlets

从架构上说,JSP可以被看作是从Servlets高级提炼而作为JAVA Servlet 2.1 API的扩展而应用。Servlets和JSP最早都是由Sun Microsystems(太阳公司)开发的。从JSP1.2版本以来,JSP处于Java Community Process开发模式下。

静态数据在输入文件中的内容和输出给HTTP响应的内容完全一致。此时,该JSP输入文件会是一个没有内嵌JAVA或动作的HTML页面。而且,客户端每次请求都会得到相同的响应内容。

什么是apache?

互联网这个历史已经不算很短了,它大大方便了人类获取信息,开阔了人类的眼界,使得让这个世界变得小了起来,人与人之间的距离感也不会存在了,娱乐也更加丰富,听音乐、看电影等等这一系列,都能从网上进行,这些功能,都是由www服务器来提供服务,在Linux中,提供网络的服务器有很多种,那么今天我们就讲一个比较老牌,且依然能存活的服务器“阿帕奇”英文:Apache。

1. Apache简介

Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源代码的网页服务器软件,可以在大多数电脑操作系统中运行,由于其跨平台和安全性。被广泛使用,是最流行的Web服务器软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。

2. 特性

Apache支持许多特性,大部分通过编译的模块实现。这些特性从服务器端的编程语言支持到身份认证方案。一些通用的语言接口支持Perl,Python,Tcl, 和PHP。流行的认证模块包括mod_access,mod_auth和mod_digest。其他的例子有SSL和TLS支持(mod_ssl),代理服务器(proxy)模块,很有用的URL重写(由mod_rewrite实现),定制日志文件(mod_log_config),以及过滤支持(mod_include和mod_ext_filter)。Apache日志可以通过网页浏览器使用免费的脚本AWStats或Visitors来进行分析。

3. 工作流程

Apache工作在应用层,是实现http协议的服务器软件之一,http是超文本传输协议,工作于应用层tcp的80端口,用户发起http协议的请求报文,服务器收到之后进行对客户端的响应,客户端收到之后,通过浏览器显示,其背后为html语言。而html是超文本标记语言,那么一次完整的http报文请求处理过程以如下步骤进行:
1、建立或处理连接:接收请求或拒绝请求。
2、接收请求:接收来自于网络上的主机请求报文中对某些特定资源的一次请求过程。
3、处理请求:对请求报文进行分析,获取客户端进行请求的资源以及请求方法等相关信息。
4、访问资源:获取请求报文中的请求资源。
5、构建响应报文。
6、发送响应报文。
7、记录日志。

注意: 所有的http请求都是这个过程
在这里插入图片描述

4. 操作流程

1. 安装
我们都知道在Linux系统当中的安装方式无非有两种,一种是RPM包(RedHat公司提供的二进制包)安装,报名叫httpd,其服务程序也叫httpd,另一种是共官方网站上去下载源码包来进行安装,在本次的实验中,这两种方式我们都会进行,其配置方式也是不尽相同,如果你配置好yum仓库,现在就可以很简单的以RPM方式来进行安装,我们使用以下命令:

[root@node1 ~]# yum -y install httpd

就这一条命令,我们的RPM包就安装好了,可以直接启动程序打开浏览器来访问

[root@node1 ~]# systemctl start httpd.service

打开浏览器,访问方式直接输入IP地址就可以,因为http协议浏览器自动加上去的,如果看到了apache的测试页,则证明你成功了。
在这里插入图片描述
那么为什么可以成功?我们可以使用ss命令用来查看:
在这里插入图片描述
从以上命令显示我们看出,当服务启动时,就会开启80端口,我们说过,80端口是提供WEB服务的。 以上就是以RPM包方式的安装,那么现在我们看一下如何以源码包方式进行安装,源码包的安装过程方式很是繁杂,但是其有点是可以自由定制功能,我们使用–enable来使用是否开启次功能,–with用来是否添加此功能,还可以用 --with-out用来取消此功能,意思是在安装上默认添加的功能给去除掉,现在我们可以从官网上下载源码包,其下载地址为:http://mirrors.cnnic.cn/apache//httpd/httpd-2.4.25.tar.gz,直接复制就能够下载,在Linux上,使用wget就可以。

[root@node1 ~]# wget http://mirrors.cnnic.cn/apache//httpd/httpd-2.4.25.tar.gz

下载完成之后,由于是压缩包,所以我们必须要解压才能够使用安装,把它解压到/usr/src/目录下。

 [root@node1 ~]# tar -xf httpd-2.4.25.tar.gz -C /usr/src/

之后我们下载两个依赖包,一个是apr包,另一个是apr-util包,那么apr是什么?其实它是一个底层支撑Apache跨平台特性的一个安装包,有了这个包就可以不用修改整个程序,就像是一个虚拟机一样,提供一个环境让系统跑起来,apache也亦是如此,现在我们可以使用wget命令下载下来:

[root@node1 src]# wget http://mirrors.hust.edu.cn/apache//apr/apr-1.5.2.tar.gz    
[root@node1 src]# wget http://mirrors.hust.edu.cn/apache//apr/apr-util-1.5.4.tar.gz 

下载完成之后,由于都在/usr/src的目录下,所以就直接加压。

[root@node1 src]# tar -xf apr-1.5.2.tar.gz  
[root@node1 src]# tar -xf apr-util-1.5.4.tar.gz 

我们首先进入apr目录,开始安装,不过在安装之前,我们首先要安装开发包组:

[root@node1 ~]# yum -y groupinstall "Development Tools" "Server Platform Development" 
[root@node1 src]# cd apr-1.5.2/  
[root@node1 apr-1.5.2]# ./configure --prefix=/usr/local/apr-1.5    
[root@node1 apr-1.5.2]# make && make install  
[root@node1 src]# cd apr-util-1.5.4/     
[root@node1 apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util-1.5 --with-apr=/usr/local/apr-1.5 

如果以上程序包都安装完成的话,恭喜你,可以安装http了,首先进入该目录,之后进行安装,如果中途出现一些错误的话,是可以解决的。

[root@node1 httpd-2.4.25]# ./configure --prefix=/usr/local/apache-2.4 --enable-so    --enable-ssl --with-pcre --with-rewrite --with-mpm=prefork --enable-cgi --with-zlib    --with-libxml2=/usr --with-apr=/usr/local/apr-1.5 --with-apr-util=/usr/local/apr-util-1.5    --with-openssl --enable-modules=most --enable-mpms-shared=all  
[root@node1 httpd-2.4.25]#    make && make install 

之后打开浏览器,步骤一样,输入IP,只不过出现的是 It Works的页面。 安装过程中,可能会报错,但这些错误都可以解决,以上成功的话,则代表第一阶段完成。 接下来可以启动源码包安装的程序,不过必要先要关闭RPM包的apache,因为一个端口不能为两个程序所使用。

[root@node1 ~]# /usr/local/apache-2.4/bin/apachectl start

2. 配置介绍
其实两种安装方式任意选一种都可以,毕竟这只是实验,并没有好坏,最后的配置方法都是差不多的,接下来说一下配置文件的详解,以及我们可以搭建什么服务,我们就以RPM包所安装的来进行配置,我们的主配置文件在/etc/httpd/conf和/etc/httpd/conf.d,注意:我们要把主配置文件复制出来进行备份,不然的话,如果到了不可挽回的余地,最起码覆盖掉,解决一下,从头再来,那么其配置结构如下:
在这里插入图片描述
我们使用的响应模型是默认是prefork,它是开启多个进程来处理不同的请求,其模式共有三个,另外两个是worker和event模型,那么我们首先来介绍一下prework模型,它是一个多进程模型,由一个主进程和多个子进程组成,一个主进程负责创建和销毁子进程以及套接字,也负责接收请求,并将请求转发到子进程来进行处理。那么多个子进程,每一个子进程分别处理一个请求,其工作模型为会预先生成几个空闲进程,用来等待处理用户请求。 接下来是worker模型,它是多进程多线程的模型,有一个主进程和多个子进程,主进程和以上一样,创建并销毁子进程以及建立套接字并接受请求,然后将请求转发给子进程,而多个子进程却没有直接处理请求,而是交给了它所生成的线程处理,每个子进程生成多个线程,每个线程都会去响应用户请求。其并发的响应数量为 m*n。
在这里插入图片描述
最后一个是event模型,它是一个事件驱动的模型,每个进程响应多个用户请求,也是由一个主进程个子进程组成,主进程的功能和以上的两种模式一样,那么子进程是基于事件驱动直接响应多个用户请求,在httpd-2.4中是支持的。

以上就是对模式的介绍,那么接下来其它文件的位置,我们安装完成之后就必然开启它进行web服务,那么在 CentOS 6中,它的服务脚本在/etc/rc.d/init.d/httpd路径下,站点文件在/var/www/html的路径下,为什么会配置在哪儿?因为在httpd.conf配置文件中,定义了DocumentRoot "/var/www/html"的文档根目录,日志文件保存在/var/log/httpd目录下,访问日志为access_log错误日志为error_log。服务控制和启动在不同的CentOS版本是不一样的,分别是:

CentOS 6:  
[root@node1 ~] # service httpd { start | stop | restart | status } 
CentOS 7:  
[root@node1 ~] # systemctl { start | stop | restart | status } https.service

3. 配置别名及认证方式和虚拟主机
3.1 配置别名
在配置文件下使用alias来定义别名,其格式如下:

[root@node1 conf.d]# vim alias.conf  
Alias /web1/ /web/html1/  
<Directory "/web/html1">
         options None
         allowOverride None      
         Require all granted  
</Directory>  
[root@node1 ~]# systemctl reload httpd.service 

接下来为定义的配置文件建立目录。

[root@node1 conf.d]# mkdir /web/html1 -pv 

定义主页。

[root@node1 conf.d]# cd /web/html1/  
[root@node1 html1]# vim index.html 
<h1>Alias Page</h1> 

打开浏览器访问。
在这里插入图片描述
3.2 认证服务
认证其实很好理解,就是让用户向服务器提供用户名和密码,这是证明自己的一种手段,其配置如下:

[root@node1 ~]# cd /etc/httpd/conf.d/  
[root@node1 ~]# vim auth.conf  
Alias /apps/ "/apps/html/"  
<Directory "/apps/html">
      Options None      
      AllowOverride None         
      Authtype basic      
      AuthUserFile "/apps/html/.htpasswd"     
      AuthName "Admin String"        
      Require valid-user  
</Directory>  
[root@node1 conf.d]# cd /apps/html/  
[root@node1 html]# vim index.html  
<h1>Auth Page</h1>  
[root@node1 ~]# systemctl reload httpd.service 

重新启动打开浏览器进行访问,输入用户名和密码就可以,创建用户和密码的命令是htpasswd,格式如下:

[root@node1 conf.d]# htpasswd -c -m /apps/html/.htpasswd user1

在这里插入图片描述
3.3 虚拟主机服务
虚拟主机是可以在一个主机上提供多个访问站点,共有三种实现方案,分别是基于IP、基于端口、基于域名,我们就以基于域名的方式来配置虚拟主机,配置如下:

[root@node1 conf.d]# vim vhost.conf  
<VirtualHost *:80>
     ServerName www1.stux.com     
     DocumentRoot "/apps/www"
            <Directory "/apps/www">     
                   Options None            
                   AllowOverride None           
                   Require all granted          
			</Directory>  
</VirtualHost>  
[root@node1 ~]# mkdir /apps/www  
[root@node1 ~]# vim /apps/www/index.html  
<h1>Test Virtual Page</h1>  
[root@node1 ~]# systemctl reload httpd.service

现在我们可以测试一下,如果成功,那我恭喜你。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lipviolet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值