一、httpd简介
前面我们已经学习了在基于应用层中传输的协议HTTP,并且其是基于C/S架构进行传输的,下面就简要介绍下常用的C/S架构多的软件。
基于Client的GUI软件有:IE、Fierfox、Safari、chrome、Opera;
基于Client的命令行软件:elinks,curl;
基于Server端的静态软件:httpd 、Nginx 、lighttpd、gws;
基于Server端的动态软件:IIS 、tomcat 、jetty 、resin。
上面就是常见的基于C/S架构的有http协议进行传输软件,本篇主要介绍的是有apache开源基金会开发的web服务器软件httpd,httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。
1、web服务器的I/O结构
单进程模型:一次只处理一个请求,直到其完成为止。在处理过程中,所有其他连接都会被忽略,这会造成严重的性能问题,只适用于低负荷的服务器。
多进程模型:可以根据需要为每条连接分配一个线程或进程来处理请求,但当服务器同时要处理成百上千的连接时,可能会消耗太多内存和系统资源,因此应该对线程/进程的最大数量做限制。
复用的I/O机制:同时监视所有连接上的活动,当连接状态发生变化时(如有数据可用,或出现错误等等),就对那条连接进行少量的处理,处理接受后将连接返回到开放连接列表中,等待下一次状态变化。
复用的I/O机制:集合以上多进程和复用I/O的优点,即多个线程,每个线程响应多个用户请求;
2、httpd的特性
高度模块化:核心+模块的方式;
DSO(Dynamic Shared Object): 支持动态装卸载;
MPM(Multipath Processiong Module):多处理模块;
Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作。不同平台和不同的环境往往需要不同的特性,或可能以不同的方式实现相同的特性最有效率。Apache HTTP 服务器通过模块化的设计来适应各种环境。这种设计允许网站管理员通过在编译时或运行时,选择哪些模块将会加载在服务器中,来选择服务器特性。
MPM的三种模型:
Prefork MPM : 这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。 这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。
Worker MPM :此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。 每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
Event MPM:以上两种稳定的MPM方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。 Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的。一个以Worker MPM方式工作的繁忙服务器能够承受每秒好几万次的访问量(例如在大型新闻服务站点的高峰时),而Event MPM可以用来处理更高负载。
注意:不管是Worker模式或是Prefork 模式,Apache总是试图保持一些备用的(spare)或者是空闲的子进程(空闲的服务线程池)用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。
我们都知道Apache有三种工作模块,分别为prefork、worker、event。
prefork:多进程,每个请求用一个进程响应,这个过程会用到select机制来通知。
worker:多线程,一个进程可以生成多个线程,每个线程响应一个请求,但通知机制还是select不过可以接受更多的请求。
event:基于异步I/O模型,一个进程或线程,每个进程或线程响应多个用户请求,它是基于事件驱动(也就是epoll机制)实现的。
prefork的工作原理
如果不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM.它所采用的预派生子进程方式也是 Apache1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。
worker的工作原理
相对于prefork,worker是2.0版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性,这种MPM的工作方 式将是Apache2.0的发展趋势。
event 基于事件机制的特性
一个进程响应多个用户请求,利用callback机制,让套接字复用,请求过来后进程并不处理请求,而是直接交由其他机制来处理,通过epoll机制来通知请求是否完成;在这个过程中,进程本身一直处于空闲状态,可以一直接收用户请求。可以实现一个进程程响应多个用户请求。支持持海量并发连接数,消耗更少的资源。
3、httpd的常见版本
http-2.0
http-2.2
http-2.4
注意httpd-2.2.x版本中不支持event,若想使用此模块需要使用httpd-2.4.x,同时可以在编译时可以使用--with-mpm=prefork手动指定其使用prefork,或指定event模块。
4、httpd的功能
虚拟主机(基于HOST,IP,PROT实现虚拟主机 )
支持CGI
反向代理
负载均衡
路径别名
丰富的用户认证
支持第三方模块
5、安装httpd及其相关文件说明
现在使用最简单的yum安装:
[[email protected] ~]# yum install -y httpd [[email protected] ~]# rpm -qa httpd httpd-2.2.15-45.el6.centos.x86_64
查看其生成的相关重要文件:
[[email protected] ~]# rpm -ql httpd //这里仅列出常用的文件 配置文件: /etc/httpd/conf/httpd.conf 和/etc/httpd/conf.d/*.conf 服务脚本: /etc/rc.d/init.d/httpd 脚本的配置文件:/etc/sysconfig/httpd 模块文件: /etc/httpd/muludes:符号链接文件 、/usr/lib64/httpd/moudles 主程序: /usr/sbin/httpd:默认的MPM为prefork、 /usr/sbin/httpd.work、/usr/sbin/httpd.event,I/O模型 选择httpd工作方式: /etc/sysconfig/httpd 日志文件目录: /var/log/httpd 站点文档目录: /var/www/html
6、httpd命令简单使用
-l :输出一个静态编译在服务器中的模块的列表。它不会列出使用LoadModule指令动态加载的模块。
-M:输出一个已经启用的模块列表,包括静态编译在服务器中的模块和作为DSO动态加载的模块。
-f config:在启动中使用config作为配置文件。如果config不以"/"开头,则它是相对于ServerRoot的路径。其默认值是conf/httpd.conf 。
-k start|restart|graceful|stop|graceful-stop:发送信号使httpd启动、重新启动或停止 。
-t:仅对配置文件执行语法检查。程序在语法解析检查结束后立即退出,或者返回"0"(OK),或者返回非0的值(Error)。如果还指定了"-D DUMP_VHOSTS",则会显示虚拟主机配置的详细信息。
二、httpd.conf文件详解
httpd 服务器的配置信息全部存储在主配置文件/etc/httpd/conf/httpd.conf中,这个文件中的内容非常多,用wc命令统计一共有1009行,其中大部分是以#开头的注释行。
[[email protected] ~]#cat /etc/httpd/conf/httpd.conf |wc -l 1009
配置文件包括三部分:
[[email protected] ~]#grep 'Section' /etc/httpd/conf/httpd.conf ### Section 1: Global Environment ### Section 2: 'Main' server configuration ### Section 3: Virtual Hosts
Global Environment---全局环境配置,决定Apache服务器的全局参数
Main server configuration---主服务配置,相当于是Apache中的默认Web站点,如果我们的服务器中只有一个站点,那么就只需在这里配置就可以了。
Virtual Hosts---虚拟主机,虚拟主机不能与Main Server主服务器共存,当启用了虚拟主机之后,Main Server就不能使用了。
配置参数值 说明:
配置指令不区分字符大小写 ;
值有可能区分大小写 ;
有些指令可以重复出现多次;
注意:绝大多数配置修改后,可以用过service httpd reload 来生效,如果修改了监听的地址或端口,必须重启服务才能生效。
1、监听套接字
Listen [IP:]port
此指令可以出现多次,用于指定监听多个不同的套接字,如有多块网卡,默认监听所有网卡。
Listen 80
Listen 192.168.1.8:8080
2、配置使用Keepalive
KeepAlive {On|Off}
是否持续连接(因为每次连接都得三次握手,如果是访问量不大,建议打开此项,如果网站访问量比较大关闭此项比较好),修改为:KeepAlive On 表示允许程序性联机。
KeepAliveTimeout 2 超时时间 MaxKeepAliveRequests 50 表示一个连接的最大请求数
3、MPM多道处理模块
httpd -l 查看编译进内核的模块
想使用不同的机制,修改配置文件即可 /etc/syconfig/httpd文件
<IfModule preforck.c>判断模块是否存在 StartServers 8 默认启动的工作进程数 MinSpareServers 5 最少空闲进程数 MaxSpareServers 20 最大空闲进程数 ServerLimit 256 最大活动进程数 MaxClients 256 最大并发连接数,最多允许发起的连接请求的个数,超过的要进入等候队列。 MaxRequestsPerChild 4000 每个子进程在生命周期内最大允许服务的最多请求个数,0表示永不结束。 </IfModule>
<IfModule worker.c> StartServers 4 启动的子进程的个数 MaxClients 300 最大并发连接数,最多允许发起的连接请求的个数 MinSpareThreads 25 最少空闲线程数 MaxSpareThreads 75 最大空闲线程数 ThreadsPerChild 25 每个子进程生成的线程数,子线程建立之后将不再增加。 MaxRequestsPerChild 0 每个进程启动的最大线程数,如达到限制数时进程将结束,如置为0则子线程永不结束。 </IfModule>
4、DSO模块的加载方式
若在httpd中加载新的或者取消相对应的模块,首先在配置文件添加模块的路径,然后在重新载入httpd程序就行了,这里在配置文件中添加模块时模块的路径可以是绝对路径也可以是相对路径(对于ServerRoot所定义的位置而言)。若取消则在配置文件注释并重新载入httpd系统即可。
相对路径:LoadModule foo_module modules/mod_foo.so
绝对路径:LoadMoudule php5_module /usr/lib64/httpd/modules/php.so
5、配置站点根目录
DocumentRoot "/path/to/somewhere"
系统默认的根目录为/var/www/html,若想更改为别处则在配置文件中更改此选项。
6、页面访问属性
<Direcotry "/path/to/somewhere"> Options Indexes FollowsymLinks Indexes:缺少指定的默认页面时,允许将目录中的所有文件已列表形式返回给用户:危险:慎用 FollowsymLinks:允许跟随符号链接所指向的原始文件 None:所有都不启用 All:所有的都启用 ExecCGI:允许使用mod_cgi模块执行CGI脚本 Includes:允许使用mod_include模块实现服务器端包含(SSI) IncludesNOEXEC:允许包含但不允许执行脚本 MultiViews:允许使用mod_negotiation实现内容协商 SymLinksIfOwnerMatch:在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号连接所指向的原始文件 </Direcotry>
详情参考:http://httpd.apache.org/docs/2.2/mod/core.html#options
7、基于主机的访问控制
<Direcotry "/path/to/somewhere"> AllowOverride None:对每个目录访问控制文件作用的影响,All 使访问控制文件可以覆盖系统配置 ,None 服务器忽略访问控制文件的设置 。 Order allow,deny:次序,写在后面的为默认 allow,deny:没有允许的都拒绝 deny,allow:没有拒绝的都允许 Allow from:允许访问的主机 Deny from:不允许访问的主机 </Direcotry>
最佳匹配:如果都匹配或都不匹配时以默认为准,否则则以匹配到的为准。
8.定义默认主页面
DirectoryIndex index.html index.html.var index.php
依次查找,若找到了就不在往后匹配。
9、用户目录
<IfModule mod_userdir.c> UserDir disabled </IfModule>
如果期望让每个用户都可以创建个人站点:http://Server_IP/~Username/
userdir disablied:默认为禁止使用此功能若启用则按下面方法定义。
userdir public_html:public_html是用户家目录下的目录名称,所有位于此目录中的文件均可通过前述的访问路径进行访问
用户的家目录中赋予httpd进程的用户拥有执行权限的文件。
赋予权限:setfacl -m u:apache:x ~Username
10、配置日志功能
httpd的日志文件放在/var/log/http/目录中,其包含两类文件:
access.log:访问日志,其需要记录的内容需要自定义。
error.log:错误日志。
配置文件中默认的下面四种访问日志的格式:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent
参数说明:
%h:客户端地址
%l:远程的登录名,通常为-
%u:认证时的远程用户名,通常为-
%t:接收到的请求时的时间,为标准英文格式时间+时区
\" :转义,显示""
%r:请求报文的起始行
%>s:响应状态码,
%b:以字节响应报文的长度,不包含http报文
%{Header_Name}i:记录指定请求报文首部的内容(value)
%u:请求的URL
详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
系统默认日志格式为:
CustomLog logs/access_log combined
httpd的访问日志文件:
[[email protected] htdoc]# tail /var/log/httpd/access_log 192.168.1.104 - - [02/Aug/2015:17:51:03 +0800] "GET / HTTP/1.1" 403 279 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" 192.168.1.104 - - [02/Aug/2015:17:51:03 +0800] "GET / HTTP/1.1" 403 279 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36"
11、路径别名
Alias /alias/ "/path/to/somewhere"
使用路径别名意味着访问http://Server_IP/alias时,其页面文件可以来自于/path/to/somewhere中。
使用举例:
[[email protected] ~]# vim /etc/httpd/conf/httpd.conf //在内部添加下面一行,注意前后/均要有! Alias /test/ "/data/test/" [[email protected] ~]# mkdir /data/test -p [[email protected] ~]# vim /data/test/test.html <h1>/data/test/test.html</h1> [[email protected] ~]# setfacl -m u:apache:x /data/test/ [[email protected] ~]# service httpd reload
12、指定默认的字符集
系统默认为UTF-8的字符集,若出现乱码则要调整此字符集。
AddDefaultCharset UTF-8