一、httpd概述

1、http简介

  Apache是一种开源的HTTP服务器软件,可以在大多数主流的计算机操作系统中运行(包括UNIX、Linux及Windows),再加上其支持多平台且具有良好的安全性被广泛使用,随着网络技术的普及和不断发展,以及Web技术的不断完善,Web服务已经成为互联网上最重要的服务形式之一。

www.netcraft.com 网站统计了世界上web服务器所使用的软件

httpd:a pachey server = apache

官方网站:httpd.apache.org

ASF:apache software foundation


2、http常用的版本

官方网站httpd.apache.org

http-1.3:不再维护了

httpd-2.2:event为测试使用

httpd-2.4:event可生产使用,还有很多高级特性 

httpd-2.4.25:最新稳定版(2016-12-20) 


3、httpd的特性

高度模块化:core + modules

   DSO:Dynamic Shared Object  动态共享对象

MPMMultipath Processing Modules 多路处理模块,非一个模块,而是对一种特性的称谓

 prefork多进程模型,每个进程响应一个请求

    一个主进程,负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求,即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,由于prefork使用select()系统调用,所以最大并发不能超过1024

 worker多进程和多线程混合模式,每个线程响应一个请求

    一个主进程,生成多个子进程,每个子进程负责生成多个线程,每个线成响应一个用户请求;

 eventevent-driven 事件驱动模型,主要目地在于实现单线程响应多个多个请求 

    一个主进程,生成多个子进程,每个子进程负责生成多个线程,每个线成响应多各用户请求


   prefork模式可以算是很古老但是非常稳定的Apache模式。Apache在启动时,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:

   成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。(我们常用的mod_php,PHP的拓展不支持线程安全)
缺点:

   一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。


   worker模式比起上一个,是使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。
worker模型使用多线程响应请求,这样子存在一个问题,即一个线程崩溃就会影响整个进程.所以worker使用的是多进程 + 多线程的混合模型.即可以提高并发性,也可以避免一个线程崩溃导致整个整个web站点崩溃.

优点:占据更少的内存,高并发下表现更优秀。

缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,某个线程会一直被占据,也许中间几乎没有请求,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)


   event模型是在apache2.2之后当做试验特性引入的,在apache2.4之后才正式支持.event模型是为了解决长连接(keep-alive)问题而生的.它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的。

注意一点,event MPM需要Linux系统(Linux 2.6+)对EPoll的支持,才能启用。还有,需要补充的是HTTPS的连接(SSL),它的运行模式仍然是类似worker的方式,线程会被一直占用,知道连接关闭。部分比较老的资料里,说event MPM不支持SSL,那个说法是几年前的说法,现在已经支持了。

4、httpd的功能特性:

路径别名alias

丰富的用户认证机制:authentication

  basicdigest

虚拟主机:virtual host

  IP,Port,FQDN

反向代理:

  负载均衡

用户站点:当前系统上每个用户,都可以自行创建一个自己的网站

原生支持CGI:Common Gateway Interface,通用网关接口  动态网站


二、httpd的安装、使用

1、安装httpd

[root@Node4 ~]# rpm -qa|grep httpd
[root@Node4 ~]# yum install httpd -y 

[root@Node4 ~]# rpm -ql httpd
/etc/httpd                           #httpd的工作目录
/etc/httpd/conf           #主配置文件文件目录
/etc/httpd/conf.d          #配置文件的片段,包含的配置文件,扩展配置文件目录
/etc/httpd/conf.d/README
/etc/httpd/conf.d/welcome.conf        #扩展配置文件
/etc/httpd/conf/httpd.conf            #主配置文件
/etc/httpd/conf/magic
/etc/httpd/logs                      #日志文件的链接文件
/etc/httpd/modules                   #模块文件目录
/etc/httpd/run                       #httpd运行时的pid文件
/etc/logrotate.d/httpd        #日志滚动脚本,可以设置按时间,按空间(大小)滚动
/etc/rc.d/init.d/htcacheclean
/etc/rc.d/init.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
/usr/lib64/httpd             #库文件目录

/usr/sbin/apachectl
/usr/sbin/htcacheclean
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
/usr/sbin/httxt2dbm
/usr/sbin/rotatelogs
/usr/sbin/suexec
/usr/share/doc/httpd-2.2.15

/var/cache/mod_proxy
/var/lib/dav
/var/log/httpd         #日志文件目录
/var/run/httpd
/var/www                 
/var/www/cgi-bin        #CGI能够执行的动态脚本
/var/www/error

/var/www/html      #Docroot:文档根目录,站点页面文件存放目录
/var/www/icons

2、启动httpd

[root@Node4 ~]# service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.10.4 for ServerName
                                                           [  OK  ]
                                                           
#这里的提示信息是,是因为在配置文件中没有配置主机名,httpd服务在启动时会根据IP地址反解主机名,无法获得FQDN格式的主机名就使用192.168.10.4当作主机名,修改配置文件指定主机名或设置一个FQDN格式的主机名即可

[root@Node4 ~]# ss -tunlp|grep httpd      #默认监听在80端口
tcp    LISTEN     0      128                   :::80                   :::*      users:(("httpd",4955,4),("httpd",4957,4),("httpd",4958,4),("httpd",4959,4),("httpd",4960,4),("httpd",4961,4),("httpd",4962,4),("httpd",4963,4),("httpd",4964,4))
[root@Node4 ~]# ps aux|grep httpd
root      4955  0.0  0.7 175740  3664 ?        Ss   22:07   0:00 /usr/sbin/httpd
apache    4957  0.0  0.4 175740  2428 ?        S    22:07   0:00 /usr/sbin/httpd
apache    4958  0.0  0.4 175740  2452 ?        S    22:07   0:00 /usr/sbin/httpd
apache    4959  0.0  0.4 175740  2428 ?        S    22:07   0:00 /usr/sbin/httpd
apache    4960  0.0  0.4 175740  2428 ?        S    22:07   0:00 /usr/sbin/httpd
apache    4961  0.0  0.4 175740  2428 ?        S    22:07   0:00 /usr/sbin/httpd
apache    4962  0.0  0.4 175740  2428 ?        S    22:07   0:00 /usr/sbin/httpd
apache    4963  0.0  0.4 175740  2428 ?        S    22:07   0:00 /usr/sbin/httpd
apache    4964  0.0  0.4 175740  2428 ?        S    22:07   0:00 /usr/sbin/httpd

  我们看到一共启动了9个httpd进程,一个root用户启动httpd进程是主进程(不直接响应用户请求),apache用户启动的8个httpd进程是子进程(也叫工作进程,启动多少个工作进程可以在配置文件中设置)

那为啥要用root用户启动主进程?

  向内核注册使用0-1023之间的端口,只有root用户有权限


3、使用浏览器访问该httpd服务器

wKioL1h3kHfTDT_9AAFRfYb_aCc662.png

   我们看到一个测试页面,那这个页面是默认的主页吗?

这里我们需要注意到我们使用的URL中没有指定访问的资源,默认应该访问的站点主页

我们可以查看web页面文件存放目录查看:

[root@Node4 ~]# ls /var/www/html/         
[root@Node4 ~]#

 站点目录下没有任何页面,那这个测试页面是怎样返回给我们的呢?我们就需要查看httpd的配置文件了

[root@Node4 ~]# cd /etc/httpd/
[root@Node4 httpd]# ls
conf  conf.d  logs  modules  run
[root@Node4 httpd]# ls conf.d
README  welcome.conf

[root@Node4 httpd]# cat conf.d/welcome.conf
# 
# This configuration file enables the default "Welcome"
# page if there is no default index page present for
# the root URL.  To disable the Welcome page, comment
# out all the lines below.
#
<LocationMatch "^/+$">           #请求的资源为空时
    Options -Indexes
    ErrorDocument 403 /error/noindex.html
                                 #响应码为403时,返回/error/noindex.html这个页面
</LocationMatch>

[root@Node4 httpd]#

  我们知道了原来是通过这个配置文件指定的,那我们把这个配置删掉呢?试试看:

[root@Node4 httpd]# mv conf.d/welcome.conf conf.d/welcome.conf.bak
[root@Node4 httpd]# ls conf.d
README  welcome.conf.bak

  修改了配置文件后,必须要重载配置文件:

[root@Node4 httpd]# service httpd reload
Reloading httpd:

再次访问:

wKiom1h3lE6jf4_fAABr8qTCmJE506.png

  为什么变成了这样?没有主页,不应该是404,Not Found吗?

  这是因为httpd服务,默认开启Indexes功能,访问主页时,若主页不存在,就把所有的资源列出来,这样非常不安全,应该在配置文件中关闭此功能。

注意:访问的URL中没有指定资源时,默认是访问站点的主页,如果主页不存在时,也没有做URL重写,那么返回的403 Forbiden,而不是404 Not found

  下一篇,我们将详细学习httpd服务的配置。