一、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 动态共享对象
MPM:Multipath Processing Modules 多路处理模块,非一个模块,而是对一种特性的称谓
prefork:多进程模型,每个进程响应一个请求
一个主进程,负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求,即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,由于prefork使用select()系统调用,所以最大并发不能超过1024
worker:多进程和多线程混合模式,每个线程响应一个请求
一个主进程,生成多个子进程,每个子进程负责生成多个线程,每个线成响应一个用户请求;
event:event-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
basic、digest
虚拟主机: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服务器
我们看到一个测试页面,那这个页面是默认的主页吗?
这里我们需要注意到我们使用的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:
再次访问:
为什么变成了这样?没有主页,不应该是404,Not Found吗?
这是因为httpd服务,默认开启Indexes功能,访问主页时,若主页不存在,就把所有的资源列出来,这样非常不安全,应该在配置文件中关闭此功能。
注意:访问的URL中没有指定资源时,默认是访问站点的主页,如果主页不存在时,也没有做URL重写,那么返回的403 Forbiden,而不是404 Not found
下一篇,我们将详细学习httpd服务的配置。
转载于:https://blog.51cto.com/xiexiaojun/1649619