Web服务之二:httpd安装配置

httpd相关介绍

 

代理:Web代理服务器工做在Web客户端与Web服务器之间,他负责接收来自客户端的http请求,并将其转发至对应的服务;然后接收来自于服务器的响应,并将响应报文回送至客户端。html

 

Apache:Open Source,Web服务器的引导者,不少Web服务器的标准都是参照Apache制定的,所以这也是事实上互联网Web服务器的规范的指定者。前端

  早先源自于NCSA,当时NCSA研发的一款软件其进程叫httpd,所以httpd一直也是做为Web服务器最先出现的表明而使用的。后来httpd这个软件已经很完善了,NCSA以为这个项目已经没有完善下去的必要就解散了,所以NCSA的不少研发者到了其它公司工做,但它们又不想httpd没落下去,所以经过互联网协做起来继续为这个软件新增了不少功能,主要就是打上补丁、补漏洞、新增额外功能。所以有人把它们从新发行的,基于互联网协做发行的服务器httpd戏称为A Patchy Server(充满补丁的服务器),后来简写为Apache(Apache也是美国武装直升机的代称)。linux

 

FSF:GNU组织的,发布了GPL协定的软件基金会。web

ASF:Apache Software Foundation,开源界最著名的基金会之一,与FSF齐名面试

  到目前为止,Apache是著名的软件基金会,叫ASF数据库

  由ASF主导的著名项目有:apache

  •   httpd:提供web服务,不少时候就以Apache称呼httpd,由于早期httpd就被称为Apache Server,所以当听到Apache表示一个具体的项目时,就是表示httpd;
  •   Tomcat:JSP的应用程序服务器,可以提供JSP执行环境,是著名的实现JavaEE实现规范的参照程序;  
  •   Hadoop:提供并行处理运行环境,提供高性能运算的很是重要的计算框架,能够实现将数千台电脑组织起来完成同一个任务;

  Apache官网:www.apache.org后端

  web服务器httpd官方站点:http://httpd.apache.org缓存

 

httpd:服务器

  纯粹的Web Server,开源(Open Source),其开源协定再也不是GPL,而是Apache的开源协定。

 

httpd传统风格特性:

  1. 在进程控制上一般是事先建立进程;Web服务器响应用户模型有多种,多进程/多线程是一个用户请求使用一个进程来响应,所以若是接收到多个用户请求后再进行建立进程速度会比较慢;因此Apache事先把进程启动做为空闲进程;
  2. 事先建立的进程是有数目要求的,有一种适应性叫按需维持适当的进程;如:启动500个进程响应500个请求,若500个请求中有400个请求都完成了,那么400个进程都空闲下来了,但不能让进程都空闲下来,所以当空闲太多时须要将空闲的进程一一销毁,直到知足咱们所应该维持的最小或最大进程数为止;
  3. 模块化设计(即只具有核心功能),其核心比较小,各类功能都经过模块来进行添加,支持运行时配置,支持单独编译模块。这些模块能够在运行时启用,相似于Linux内核,平时只启用其核心功能,用到额外的功能时,只须要将额外的功能的模块装载进来便可,同时须要注意的是咱们在用到哪一个模块的功能时,能够单独编译对应的模块。甚至包括PHP均可以经过模块的方式装载进httpd,Apache与PHP结合有不少种方式,模块化就是比较常见的一种,也是RedHat系列服务器上默认的一种;
  4. 支持多种方式的虚拟主机配置。咱们在此处简单引入一下虚拟主机的概念:若是须要提供Web服务,那就须要有一台物理服务器,而且在服务器上须要运行Web服务器进程,当客户端请求时,这个进程要可以予以响应。而若咱们要在互联网上建一台Web服务器,可以提供我的或公司的站点,须要有一台物理服务器、须要IP地址、而且要保证明时可以在线、可以被互联网上的主机所访问,那这须要的资源会很是多,而且若是访问的用户很是少,会形成很是大的资源浪费。所以能够经过提供虚拟主机的方式提供站点。
  5. 支持https协议。经过mod_ssl模块支持。
  6. 支持基于IP或主机名的ACL。
  7. 支持目录的访问控制。用户访问主站点的时候不用提供帐号密码,可是访问某一特殊路径路径时,就须要提供帐号密码。
  8. 支持URL重写。如:原本访问的是/image/a.jpg但却能够重写成/bbs/images/abc.jpeg,而这对于客户端来说是透明的,能够在服务器上将这种内容通通转发到另一个路径上从新访问。

 

Nginx

  Nginx是基于多进程响应n个用户请求的这样一种模型,因此它可以使用有限的资源响应比Apache更多的用户请求。但却代替不了httpd,由于Nginx目前来说做为一个完整意义上的提供诸多丰富特性的Web服务器来说,它没有办法与httpd相比较的。就其稳定性来说也没法与httpd相比较,因此它们各有各的发挥场所,Nginx通常用来作反向代理,而httpd仍然是Web中当之无愧的老大。

 

虚拟主机的相关问题

虚拟主机:简单来说,若咱们只有一台物理服务器,并且安装的Web程序也只有一个,但这个Web服务器自己却能够根据用户请求的不一样提供多个站点,即能够服务于多个不一样的站点。如:若使用www.a.com与www.b.org发生在同一台主机,可是打开的网站确实是不一样的,那这种咱们就把它称为虚拟主机。

 

那么如何区别不一样的虚拟主机呢?

  咱们刚才已经说了,对于多个虚拟主机来说,Web服务器只有一个,而目标IP也可能只有一个,端口就是80端口。在这种前提之下,要想让用户访问的是不一样的站点,那么靠什么区别呢?

  在此以前咱们须要明确的是,事实上服务器在特定的地址或套接字上提供服务的话,那么每个服务必需要占据一个套接字(套接字即IP:Port的组合),而每个套接字只能为一个服务器提供服务。因此若要实现多种不一样方式的虚拟主机的话有多种不一样的组合方式,如:一台服务器上配置多个IP地址,每个IP地址提供一个网站。

  因此实现虚拟主机的方式有这么几种变化方式

  • 基于IP的虚拟主机;
  • 基于端口的虚拟主机;
  • 基于域名的虚拟主机;若端口、IP都同样,但因为其站点访问的时候的DNS的主机名不一样,却也能够打开不一样的虚拟主机。

  在互联网上,基于域名的虚拟主机的实现更现实一些。由于IPv4地址是紧缺的资源,所以基于IP的虚拟主机不现实;而Web服务器的端口默认为80端口,但基于端口的虚拟主机就须要使用其它端口,用户将没法得知具体端口号,也不现实。

 

咱们再来回顾一下,客户端请求报文的格式为:

protocol://HOST:PORT/path/to/source

  Method URL version   header   
  body

  GET /download/linux.tar.bz2 HTTP/1.0
  HOST:www.test.com

 

  Host与Method后的路径组织起来就是完整意义上的遵循规范的URL了,而Host指定的是域名,所以这个报文传到服务器后,服务器端彻底能够根据Host区别到底访问的是哪一个虚拟主机,这就是基于域名虚拟主机的实现的最基本的前提。这也是为何请求报文中必定要有一个首部叫Host予以标识的缘由。

  但若是在实现基于域名的虚拟主机的前提之下用户访问的是IP地址呢?若请求的时候就是基于IP地址请求的话,此时可返回一个默认的虚拟主机,同时若是用户访问不存在的虚拟主机一样返回默认的虚拟主机。

 

httpd在CentOS上的安装配置:

httpd在CentOS上的安装配置方式:

  • 经过系统自带的rpm包;
  • 源码编译。rpm包有其局限性如:有些须要的功能未编译、有些不须要的功能编译了、版本落后、漏洞等等。

 

理论基础:

  httpd安装包:

  安装完成后执行进程在:/usr/sbin/httpd

  在RedHat5.8系统上的httpd处理模式(多道处理模块MPM)是prefork的,须要事先启动空闲进程用来接收用户请求。所以启动后会发现系统上有不少个叫httpd的进程,而在众多进程当中,有一个进程运行的属主属组是root用户root组,其它进程的属主属组是apache用户apache组,这是由于在Linux系统上小于1024端口的要想启动只有管理员有权限,而这个root用户root组的进程自己并不响应用户请求,它专门用来建立空闲进程或销毁多余的空闲进程,因此这是一个主导进程(master process),其它进程称为work process。因此每个用户请求都由主导进程建立一个工做进程响应用户请求。

  服务脚本:/etc/rc.d/init.d/httpd

  占据端口及使用的协议80/TCP;若基于ssl工做,则为443/TCP。

  若基于rpm包编译安装,它会假设本身的工做根目录/etc/httpd下,工做的根目录即进程运行的根目录至关于程序的安装目录。

  配置文件目录:/etc/httpd/conf;

    主配置文件为/etc/httpd/conf/httpd.conf,Apache的主配置文件很是大,里面有不少内容,所以RedHat将它们分段引用了,所以全部的位于/etd/httpd/conf.d/*.conf的文件都是主配置文件的组成部分;

  Apache的各类模块目录:/etc/httpd/modules,这个模块是一个连接;

  日志目录:/etc/httpd/logs(连接)指向/var/log/httpd;

    Apache的日志文件分为两类,一类叫访问日志(access Log),指的是客户端每次发起访问请求以及服务器端响应的结果;一类叫错误日志(error_log),指的是错误的访问及服务器运行过程中出现的问题,包括服务器启动过程中出现问题了。

  响应的文件:/var/www

    /var/www/html:静态页面所在的路径;

    /var/www/cgi/bin:Apache提供动态内容时使用的路径;

CGI

  CGI是让Web服务器可以跟额外的应用程序通讯的一种机制。它可以让Web服务器在必要的时候启动一个额外的程序来处理动态内容,所以,CGI称为Common Gateway Interface(通用网关接口),这种通用网关接口就是让Web服务器可以跟应用程序服务器打交道的一种协议(能够将其理解成一种协议)。

  所以当客户端向服务器请求一个动态内容index.cgi时,对于这个cgi脚本,httpd能够判断出客户端请求这个脚本,须要一个应用程序来执行,因而它就发起一个进程,应用程序处理完成后,再从新响应给httpd,httpd将其组合起来响应给客户端。过程如:

    Client --> httpd(index.cgi) --> Spawn Proccess(index.cgi) --> httpd --> Client

  那么什么语言能够开发CGI或动态网站呢?  其实只要是程序语言均可以开发成动态网站,就连C也是。只不过C语言是编译型语言,开发成网站后须要编译成可执行程序。而既然全部语言都能开发动态网站,那所以就须要让Web服务器可以识别究竟是哪种语言开发的,只要Web服务器可以识别,它就能调用相应的程序执行。但不管哪种语言开发的都叫CGI,那么Web服务器怎么去识别呢?其实,每个可执行程序均可根据其前几个字节判断出来可执行程序的类型,也可以调用相应的执行程序工做,只不过一般都叫作CGI或者说它们均可以以CGI的方式跟Apache结合起来工做。

 

应用程序与Apache的其它结合方式以及LAMP概念的引入:

  有些程序跟Apache不只仅是CGI一种,为了下降Web服务器的工做压力,能够经过这样一种方式让动态服务器进程跟Web服务器结合:Web服务器不管用或不用,动态进程也像Web服务器同样事先生成好进程,有一个专门启动的服务叫动态服务启动进程,它也建立了不少空闲子进程。当有人向Web服务器发起内容请求时,而Web服务器发现这是一个动态内容时,它要发起一个新的进程来响应执行这个动态内容,而进程已经建立好了就不用发起了。因而Web服务器只须要将这个动态请求的页面交给一个空闲的服务器进程执行一次就能够了。因而这些动态进程的建立和回收再也不由Web服务器维护了,而是由这些动态的专门的管理进程(Method Process)来管理。像这种Web服务器跟动态服务器通讯的机制叫fastcgi,fastcgi是向PHP工做的一种机制,像Python还有别的工做机制。

  在这种机制之下,动态服务器进程就不用再由Web服务器控制启动或销毁了,而是由一个专门的进程负责,而这个专门的进程是工做在某个端口或套接字上个Web服务器通讯,所以此时Web服务器与应用程序服务器能够放在不一样的主机上了。如能够分为两台物理服务器,一个物理服务器专门用于接收用户请求的静态内容,若是请求的是静态内容直接从本地返回便可。当用户请求的是动态内容时,此服务器会经过本地的TCP/IP协议由本地网络将请求发送给另一台主机,另外一台主机上运行的有一个动态服务进程,同时它还建立了不少子进程随时等待响应发送过来的请求。请求处理完成后,经过网络将结果返回给Web服务子进程,子进程再响应给客户端。子进程在响应给客户端。这样静态内容和动态内容就可使用不一样的主机分别进行处理了。这就是处理动态内容的服务器被称为应用进程服务器的缘由,因此它是专门用来处理应用程序或动态内容的。

  这样一来,前端就能够放置两个Web服务器了,不管哪一台服务器用到动态内容时,均可以向应用程序服务器发起执行内容的请求。这正如咱们曾经说过的一个域名能够有有两个A记录,所以有一个域名叫www.test.com,用户请求时,来自不一样用户的请求解析到不一样的Web服务器上,这台Web服务器若是静态内容都是同样的,当它请求一些动态内容须要执行的话,只须要将内容交给同一台服务器一执行将结果返回便可,这就是Web服务器站点,这也是动态内容跟静态内容怎么进行分层次的(程序分层)。这样就实现了各司其职,一我的只完成特定的工做。

  咱们在继续讨论这个话题,程序还有一种特性,咱们都知道程序是由指令和数据组成的,若是咱们要处理的数据很是大,而早期数据都是放在文件当中的,如:用户帐号密码在/etc/passwd和/etc/shadow中,passwd和shadow就是一个数据库文件,可是条目若是多达数十万种,咱们从中挑选一个数据会很是慢,并且管理起来会很是不方便。所以必需要有一种行之有效的数据管理机制,专门用来管理数据的服务器就叫数据库服务器,存储数据的地方叫数据库,而可以帮助管理数据的,运行数据库软件的这种服务器就叫数据库服务器

  当数据量很是大时再用简单的文本文件管理数据就变得很是低效了,因而就须要数据库服务器。所以须要有服务可以帮咱们存储这种数据并且可以专门用某种接口将这种数据服务提供给提供给额外的其它应用程序或直接提供给用户,这种接口能够理解为数据库的API。所以若将数据库服务器创建好了,用户一旦须要处理程序执行,那个动态脚本就须要在应用程序服务器上执行,而应用程序服务器要执行一个脚本,这个脚本中涉及到数据处理,那这个数据处理的请求就须要提交给数据服务进程了。实际上不管是应用程序服务器仍是数据库服务器都是CPU密集型的(CPU-bound,对CPU的占用率很是大),所以前端的用户愈来愈多致使后端的应用程序服务器忙不过来了,响应的速度回很是慢,此时能够考虑分层,将数据库服务器独立出来,再找一台物理机专门用来提供数据库服务。所以当程序须要访问数据时,应用程序服务器再次向后端的数据库服务器发起请求,由数据库服务器将数据返回给应用程序服务器,应用程序服务器再格式化成HTML文档返回给Web服务器进程,由Web服务器进程响应给客户端。

  此时分出类三层,静态内容层、应用程序层、数据层。而每个对应的层上须要一个专门的服务器提供,前端使用httpd,也叫Apache。中间使用PHP,数据层使用MySQL。它们都运行在Linux上,因而简称为LAMP

 

安装配置使用httpd:

  httpd自己是受SELinux控制的,可是事先应让SELinux处于permission或disabled的状态,否则不少配置均可能没法正常运行。

关闭SELinux:

httpd的rpm包组成:

  httpd.i386:服务器端包;

  httpd-devel:开发包,包括一些开发库和头文件;

  httpd-manual:手册,httpd官方文档;

 

安装httpd:

  /etc/httpd/conf/magic:用于定义本地如何识别经过MIME编码而来的其它多媒体(非纯文本文档);

  /etc/rc.d/init.d/httpd:服务脚本,其配置文件在/etc/sysconfig/httpd,为服务脚本提供配置文件,能够把配置文件中的某些参数一改服务脚本就可以工做在不一样模式下了;

  /usr/bin/ab:Apache服务器的压力测试工具,可用来评估Apache服务器的工做性能;

  /usr/bin/{htdbm,htdigest,htpasswd}:建立Apache用户认证帐号密码的几个命令;

启动服务:

查看80端口:

查看系统进程:

测试访问:

 

欢迎页面位置: 

  欢迎页面重命名后将不会被访问:

  新建欢迎页面:

  其实Web服务器的默认配置页面是须要在Web服务器的配置文件中指定是哪一个页面的,而不是简单的随意给定一个页面

 

Web服务器自己的配置文件定义:

  配置文件分为三个字段:

    注意:第二字段和第三字段不能同时生效,默认使用主服务器段,即第二字段。

  #后有空格为注释,#后无空格为可启用的选项,在Apache中叫指令,由于Apache的配置文件由directive(指令,不区分大小写)和其value(根据须要有哦可能区分大小写)组成;

  Apache配置文件的每个指令的值在Apache官方文档中有指定的参考。

  安装参考文档的rpm包:

  

  再看配置文件/etc/httpd/conf/httpd.conf:

 

 

    ServerRoot:服务器的根目录或工做目录,不到万不得已不要改,不少其它路径都是相对于这个路劲而言的;

    PidFile:保存pid号的文件的路径(相对路径,相对于ServerRoot而言),每个进程都有一个pid号,尤为是服务类的软件运行起来后这个pid号会保存在以这个进程命名的文件中;

    Timeout:超时时间,TCP协议三次握手创建链接发起请求,若出现TCP的第一次握手发起后等它第二次就无响应了的状况,此处Timeout指的就是处于等待状态的时间,单位为秒;

    KeepAlive:是否使用长链接,通常状况下,服务器的访问量不是特别大,应该打开长链接,会显著提升性能,由于若不打开长链接每一次请求都会三次握手,此处将其改成On;

    MaxKeepAliveRequests:不能让用户一直处于长链接,所以开启长链接后须要设定最多一次请求多少个。设定为0表示无限制,只要用户本身不断开就永远不断开了;

    KeepAliveTimeOut:长链接的断开时长,单位为秒;若只请求了一个资源,不能让请求一直占用这个资源不断开,对于繁忙的服务器来说,应尽量将这个时间下降一些,既可以帮助一个用户的屡次请求,又可以尽量下降因为空闲链接空闲而致使的资源浪费。对于不一样的服务器来说这个值须要本身测试才能得出,如使用ab命令或LoaderRunner(HP公司专业级的测试工具);

 

  LoaderRunner:HP公司专业级的测试工具,能够模拟应用程序的真实场景而对服务器作接近于真实的测试。(尝试自学)

 

MPM:Multi Path Modules,多道处理模块

  当多个用户同时请求时,有多进程响应多个请求、一个进程响应多个请求等方式,而MPM就是定义在一个Web服务响应多个请求时所工做的模型的。

  经常使用方式:(面试中多是问到最多的话题,做为运维工程师是否了解Web服务器?请讲述这几种模型它们彼此之间的联系和区别(用专业的语言通俗易懂的讲给别人听))

  • mpm_winnt

  是Windows NT上专用的,由于Windows是原生支持多线程的,因此是Windows上使用的一种特殊处理机制;

  • prefork

  预先生成进程,一个请求用一个进程响应。

  好处在于稳定可靠,任何一个进程崩溃了都不会影响其它请求,但性能比较差,尤为是多个用户请求并发量很大的时候性能不好,由于它对资源的消耗量很是多,并且会涉及到大量的进程切换。

  • worker

  基于线程工做的,一个进程响应多个用户请求,但一个进程下使用多个线程来响应用户请求,一个请求用一个线程响应。

  首先,它会生成两个工做进程,而咱们都知道线程是进程的子单位,所以线程必定是处于进程当中的,因此在worker模型下,Web服务器会生成多个进程(通常而言,默承认能启动两个)。但启动的进程不是用来响应用户请求的,而是每个进程会生成多个线程,用一个线程响应一个用户请求。这样的好处在于对于Thread而言,因为多个线程共享同一个进程的资源,因此若是某一个进程曾经访问过某一个文件并且已经打开了的话,那么第二个线程访问同一个文件就不用再打开直接访问便可,这样效率比较高;

  可是多个线程在共享资源时,若是要写一个资源的话会致使资源争用的,因此为了不资源竞争,必需要实现加锁,所以若是不能良好的避免锁竞争的话,事实上线程是否比进程效率更高,这个很难说的清楚,尤为是Linux不是原生态支持线程的。因此worker模型通过测试发如今Linux上还不如prefork模型性能好,这也是为何默认使用prefork而不是worker模型的缘由。

  • event

  基于事件驱动,一个进程处理多个用户请求,可是是同时处理多个,而不是使用线程响应的,使用一个进程处理多个请求。

  在Apache2.4后才原生态支持event,而且默认就使用event,只要系统库(I/O)支持;由于event才是最强大的,Nginx就是使用event机制,但在Apache2.2中默认使用的是prefork的模型

 

prefork和worker模型在配置文件/etc/httpd/conf/httpd.conf中有各自不一样的属性的定义:

  prefork:

    <IfModule...>:意为若是某个模块配置(启用)了的话,是Apache中的一种重要的指令使用机制,其中的指令只对这一个片断有效;能够理解为容器,这个容器装有全部的配置属性,只对这个容器对应的那个对象生效;

    StartServers:服务器刚启动时启动的空闲进程数;

    MinSpareServers:最小空闲进程数;

    MaxSpareServers:最大空闲进程数;

    MaxClients:最多容许多少个请求数同时链接;

    ServerLimit:指定MaxClients的上限值,须要先关掉服务器,kill掉进程再重启服务器才可生效;

    MaxRequestsPerChild:Web服务会生成不少个服务器进程,这些进程接收用户请求,用户请求结束了,那这个进程就空闲了,空闲后可能没办法kill了,由于又有新的用户请求须要予以响应,此处定义每个进程最多响应多少次;

  worker:

    StartServers:刚开始启动的进程数;

    ThreadPerChild:每个进程能够生成多少个线程;

    MinSpareThreads、MaxSpareThreads定义的是整体线程数,而不是单个进程的线程数;

 

查看当前服务器支持的模型:(不包括worker模型):

  httpd -l  #列出当前服务器进程编译的时候所支持的模块
  httpd_core.c、core:不只包括httpd还包括反向代理等各类额外的功能,还包括缓存等;
  mod_so:支持动态模块加载;

  若未来想使用worker模型的服务的话,使用httpd.worker便可,httpd默认使用的是prefork。

演示使用worker模型的Web服务器:

  修改服务器的启动脚本配置文件便可:

  若使用event模型,改为event便可:

  在httpd2.2中,event是测试模型,不建议使用,2.4之后event才真正成熟起来并成为独立的rpm。

 

继续来看咱们httpd的配置文件:

  Listen:指定监听的地址和端口,地址可省略,若不带IP地址,说明监听当前主机上的全部地址的80端口。Listen指令可出现屡次,所以能够指定不一样的端口;

  LoadModule:指定Apache启动时装载的模块,格式:LoadModule 模块名称 模块路径;

  include conf.d/*.conf:包含其它配置文件;

  User、Group:Apache的work进程都要使用普通用户运行,故此处指定这个普通用户与组

相关文章
相关标签/搜索