13.1 httpd简介
httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。
通常,httpd不应该被直接调用,而应该在类Unix系统中由apachectl调用,在Windows中作为服务运行。
13.2 httpd版本
本文主要介绍httpd的两大版本,httpd-2.2和httpd-2.4。
CentOS6系列的版本默认提供的是httpd-2.2版本的rpm包,而CentOS7默认提供的是httpd-2.4版本的rpm包
13.2.1 httpd的特性
httpd有很多特性,下面就分别来说说httpd-2.2版本和httpd-2.4版本各自的特性。
httpd-2.2的特性:
a) 事先创建进程
b) 按需维持适当的进程
c) 模块化设计,核心比较小,各种功能通过模块添加(包括PHP),支持运行时配置,支持单独编译模块
d) 支持多种方式的虚拟主机配置,如基于ip的虚拟主机,基于端口的虚拟主机,基于域名的虚拟主机等
e) 支持https协议(通过mod_ssl模块实现)
f) 支持用户认证
g) 支持基于IP或域名的ACL访问控制机制
h) 支持每目录的访问控制(用户访问默认主页时不需要提供用户名和密码,但是用户访问某特定目录时需要提供用户名和密码)
i) 支持URL重写
j) 支持MPM(Multi Path Modules,多处理模块)。用于定义httpd的工作模型(单进程、单进程多线程、多进程、多进程单线程、多进程多线程)
prefork:多进程模型,预先生成进程,一个请求用一个进程响应
一个主进程负责生成n个子进程,子进程也称为工作进程;
每个子进程处理一个用户请求,即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,最大不会超过1024个
worker:基于线程工作,一个请求用一个线程响应(启动多个进程,每个进程生成多个线程)
event:基于事件的驱动,一个进程处理多个请求
httpd-2.4的新特性:
a) MPM支持运行DSO机制(Dynamic Share Object,模块的动态装/卸载机制),以模块形式按需加载
b) 支持event MPM,eventMPM模块生产环境可用
c) 支持异步读写
d) 支持每个模块及每个目录分别使用各自的日志级别
e) 每个请求相关的专业配置,使用
f) 增强版的表达式分析器
g) 支持毫秒级的keepalive timeout
h) 基于FQDN的虚拟主机不再需要NameVirtualHost指令
i) 支持用户自定义变量
j) 支持新的指令(AllowOverrideList)
k) 降低对内存的消耗
13.2.2 httpd-2.4新增的模块
httpd-2.4在之前的版本基础上新增了几大模块,下面就几个常用的来介绍一下。
mod_proxy_fcgi:反向代理时支持apache服务器后端协议的模块
mod_ratelimit:提供速率限制功能的模块
mod_remoteip:基于ip的访问控制机制被改变,不再支持使用Order,Deny,Allow来做基于IP的访问控制
13.3 httpd基础
13.3.1 httpd自带的工具程序
htpasswd:basic认证基于文件实现时,用到的帐号密码生成工具
apachectl:httpd自带的服务控制脚本,支持start,stop,restart
apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具
rotatelogs:日志滚动工具
access.log -->
access.log,access.1.log
access.log,access.1.log,access.2.log
suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行的工具
ab:apache benchmark,httpd的压力测试工具
13.3.2 rpm包安装的httpd程序环境
httpd-2.2版本程序环境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
配置文件的组成:grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment ### Section 2: 'Main' server configuration ### Section 3: Virtual Hosts
配置格式:directive value
directive:指令,不区分字符大小写
value:为路径时,取决于文件系统
服务脚本:
/etc/rc.d/init.d/httpd
服务脚本的配置文件:
/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
日志文件目录:
/var/log/httpd/
access.log:访问日志
error_log:错误日志
站点文档目录:
/var/www/html/
模块文件路径:
/usr/lib64/httpd/modules/
httpd-2.4版本程序环境:
主配置文件:/etc/httpd/conf/httpd.conf
模块配置文件:/etc/httpd/conf.modules.d/*.conf
辅助配置文件:/etc/httpd/conf.d/*.conf
mpm:以DSO机制提供,配置文件为/etc/httpd/conf.modules.d/00-mpm.conf
13.3.3 web相关的命令
curl命令:
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议。
curl支持:
https认证
http的POST/PUT等方法
ftp上传
kerberos认证
http上传
代理服务器
cookies
用户名/密码认证
下载文件断点续传
socks5代理服务器
通过http代理服务器上传文件到ftp服务器
语法:curl [options] [URL ...]
常用的options:
-A/--user-agent
-basic:使用Http基本认证
--tcp-nodelay:使用TCP_NODELAY选项
-e/--referer
--cacert
--compressed:要求返回时压缩的格式
-H/--header
-I/--head:只显示响应报文首部信息
--limit-rate
-u/--user
-0/--http1:使用http 1.0版本,默认使用1.1版本。这个选项是数字0而不是字母o
elinks命令:
语法:elinks [options] [URL ...]
常用的options:
-dump:不进入交互式模式,而直接将URL的内容输出至标准输出
httpd命令:
语法:httpd [options]
常用的options:
-l:查看静态编译的模块,列出核心中编译了哪些模块。它不会列出使用LoadModule指令动态加载的模块
-M:输出一个已经启用的模块列表,包括静态编译在服务器中的模块和作为DSO动态加载的模块
-v:显示httpd的版本,然后退出
-V:显示httpd和apr/apr-util的版本和编译参数,然后退出
-X:以调试模式运行httpd。仅启动一个工作进程,并且服务器不与控制台脱离
13.4 编译安装httpd-2.4
httpd依赖于apr-1.4+,apr-util-1.4+,[apr-icon]
apr:apache portable runtime
CentOS6提供的apr是1.3.9版本,而apr-util也是1.3.9版本,所以想在CentOS6上安装httpd-2.4版本时需要先安装apr-1.4+和apr-util-1.4+,而在CentOS7中则不用另行安装
httpd-2.4编译安装步骤:
a) 安装开发环境(yum groupinstall)
b) 下载并安装apr-1.4+和apr-util-1.4+。此步骤仅需在CentOS6系列上执行,CentOS7无需执行此步
cd /usr/src/ wget http://mirrors.hust.edu.cn/apache//apr/apr-1.5.2.tar.bz2 wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.5.4.tar.bz2 tar xvf apr-1.5.2.tar.bz2 tar xvf apr-util-1.5.4.tar.bz2 cd apr-1.5.2 ./configure --prefix=/usr/local/apr make && make install cd ../apr-util-1.5.4 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr make && make install
c) 编译安装httpd
groupadd -r apache useradd -r -g apache apache yum -y install openssl-devel pcre-devel ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork make && make install
13.5 httpd常用配置
httpd-2.2常用配置:
修改监听的IP和端口:
Listen [IP:]PORT
省略IP表示监听所有地址。Listen可重复出现多次
持久连接:即长连接
Persistent Connection:连接建立,每个资源获取完成后不会立即断开连接,而是继续等待其它的请求完成
如何断开?
数量限制:默认获取100个资源后会自动断开连接
时间限制:可配置,对于并发很大的服务器来说,此值不能设定太大
副作用:对于并发访问量较大的服务器,持久连接功能会使有些请求得不到响应
折衷:使用较短的持久连接时间。httpd-2.4支持毫秒级持久时间
KeepAlive {On | Off}:设定是否启用持久连接 MaxKeepAliveRequests 100:设定最大允许获取的资源数,当达到些设定值时将自动断开连接 KeepAliveTimeout 15:设定时间限制,当达到些时间限制时将自动断开连接
测试持久连接:
telnet HOST PORT # telnet 192.168.1.1 80 GET /URL HTTP/1.1 # GET /index.html HTTP/1.1 Host: HOSTNAME or IP # Host: 192.168.1.1
MPM:Multi Path Modules,多处理模块。用于定义httpd的工作模型(单进程、单进程多线程、多进程、多进程单线程、多进程多线程)
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个
rpm安装的包提供了三个二进制程序文件,分别用于实现对不同MPM机制的支持。确认方法:
ps aux |grep httpd
默认为/usr/sbin/httpd,其使用prefork
更换使用的httpd程序:编辑/etc/sysconfig/httpd文件,并重启服务使之生效
HTTPD={httpd | httpd.worker | httpd.event}
配置MPM:编辑主配置文件/etc/httpd/conf/httpd.conf
prefork的配置:
StartServers:服务启动时启动的服务器进程数(提供服务的子进程数,不包含主进程) MinSpareServers:最少空闲进程数 MaxSpareServers:最大空闲进程数 ServerLimit:为MaxClients所准备的在其服务生命周期内所允许的进程数量最大值 MaxClients:最大并发请求数 MaxRequestsPerChild:一个服务器进程最多能够响应多少次的请求
worker的配置:
StartServers:服务启动时启动的服务器进程数(提供服务的子进程数,不包含主进程) MaxClients:服务端最多启动的线程数量 MinSpareThreads:最少空闲线程数 MaxSpareThreads:最多空闲线程数 ThreadsPerChild:每个进程所能够启动的线程数 MaxRequestsPerChild:每个线程所能够响应的最大请求数量,0表示无限制
DSO:Dynamic Share Object,模块的动态装/卸载机制
配置指令实现模块加载:
LoadModule
模块路径(mod_path)可使用相对路径:
相对于ServerRoot(/etc/httpd)指向的路径而言
/etc/httpd/modules --> /usr/lib64/httpd/modules
定义“Main”server的文档页面路径,DocumentRoot
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置
DocumentRoot "/var/www/html"
test/index.html --> http://HOST:PORT/test/index.html
站点访问控制:
可基于两种类型的路径指明对哪些资源进行访问控制:
针对文件系统路径:
针对URL路径:
访问控制机制:
基于来源地址
基于帐号
Directory中“基于来源地址”实现访问控制:httpd-2.2版本
a) Options
所有可用特性:
Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
Indexes:索引,当不指定要访问的页面具体路径而又没有默认主页(index.html)时,以链接形式列出根(默认为/var/www/html)下的所有内容
FollowSymLinks:允许跟踪符号链接文件
b) 基于来源地址的访问控制机制
Order:检查次序 Order allow,deny 先允许后拒绝。默认所有都拒绝,只有明确允许的才允许访问 Order deny,allow 先拒绝后允许。默认所有都允许,只有明确拒绝的才拒绝访问 Allow from 来源地址 Deny from 来源地址
来源地址可以为:
IP:如192.168.1.1
NetAddr:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
FQDN:可以是完整的主机名,也可以是一个域名,如*.idfsoft.com
All
基于用户的访问控制:
认证质询:此处是一个响应报文
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供帐号和密码
认证:此处是一个请求报文
Authorization:客户端用户填入帐号和密码后再次发送请求报文,认证通过,则服务器发送响应的资源
认证类型:
basic:明文
digest:消息摘要,经过MD5加密
安全域:需要用户认证后才能访问的路径称之为安全域
应该通过名称对其进行标识,并用于告知用户认证的原因
用户的帐号和密码存储于何处:
虚拟帐号:仅用于访问某服务时用到的认证标识
存储机制:
文本文件
SQL数据库
ldap
nis
basic认证:基于文本文件的存储机制
a) 定义安全域
Options None AllowOverride None AuthType Basic AuthName "String" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" Require user username1 username2 ... #只允许帐号文件中指定的用户登录访问 允许帐号文件中的所有用户登录访问: 在之间添加Require valid-user
b) 提供帐号和密码存储(使用htpasswd命令)
htpasswd [options] passwordfile username
常用的options:
-c:自动创建passwordfile,因此,仅应该在添加第一个用户时使用
-m /path/to/passwordfile:md5加密用户密码
-s:sha1加密用户密码
-D:删除指定用户
c) 实现基于组进行认证
Options None AllowOverride None AuthType Basic AuthName "String" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" Require group GROUP1 GROUP2 ...
要提供用户帐号文件和组文件:
组文件:只能手动定义,每一行定义一组。格式如下:
GROUP_NAME:user1 user2 user3 ...
在组文件中的user必须在帐号文件中存在。
定义默认主页面:
DirectoryIndex index.html index.html.var
日志设定:
定义日志格式:LogFormat
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:客户端IP地址 %l:小写的L,远程登录的用户名,Remote logname (from identd,if supplied). -表示为空 %u:远程用户。Remote user, (from auth; may be bogus if return status (%s) is 401) %t:服务器收到请求的时间 %r:请求报文的首行信息(请求的方法,URL,协议版本) %>s:响应状态码 %b:响应报文的大小,不包含响应报文首部,单位是字节 %{Referer}i:请求报文当中"referer"首部的值。当前资源的访问入口,即从哪个页面中的超链接跳转而来 %{User-Agent}i:请求报文当中"User-Agent"首部的值。即发出请求用到的应用程序
错误日志:
Errorlog logs/error_log LogLevel <日志级别> #默认是warn级别
日志级别有以下这些:从低到高,日志级别越低,记录越详细
debug
info
notice
warn
error
crit
alert
emerg
访问日志:
CustomLog logs/access_log combined
路径别名:把一个URL映射至别的路径上
Alias /URL/ "/PATH/TO/SOMEDIR/" 如:Alias /bbs/ "/bbs/htdocs"
设定默认字符集:
AddDefaultCharset UTF-8
虚拟主机:
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址
基于port:为每个虚拟主机准备至少一个专用port,实践中很少使用
基于域名:为每个虚拟主机准备至少一个专用域名
需要将NameVirtualHost的注释去掉
可混合使用上述三种方式中任意方式
注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,必须先禁用中心主机
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置:还可以在虚拟主机中通过Directory进行访问控制
#此处的*可以换成指定的IP地址 ServerAdmin [email protected] DocumentRoot /www/docs/dummy-host.example.com ServerName dummy-host.example.com ErrorLog logs/dummy-host.example.com-error_log CustomLog logs/dummy-host.example.com-access_log common
内置的status页面:可以查看服务器的状态
SetHandler server-status Order deny,allow Deny from all Allow from .example.com
使用mod_deflate模块压缩页面优化传输速度:适用于httpd-2.2版本
适用场景:
a) 节约带宽,额外消耗CPU,同时,可能有些较老浏览器不支持
b) 压缩适于压缩的资源,例如文本文件
方法:
a) 编辑主配置文件/etc/httpd/conf/httpd.conf,查找mod_deflate.so,将其前面的注释去掉,启用mod_deflate模块
b) 将以下内容添加至主配置文件:
SetOutputFilter DEFLATE #调用DEFLATE输出过滤器 # mod_deflate configuration # Restrict compression to these MIME types 对下面指定的类型进行压缩 AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/css # Level of compression (Highest 9 - Lowest 1) 设定压缩比率 DeflateCompressionLevel 9 # Netscape 4.x has some problems. 根据首部的User-Agent基于正则模式匹配浏览器类型和版本 BrowserMatch ^Mozilla/4 gzip-only-text/html #浏览器是Mozilla/4时,用gzip压缩,但只压缩text/html格式的文档 # Netscape 4.06-4.08 have some more problems 根据首部的User-Agent基于正则模式匹配浏览器类型和版本 BrowserMatch ^Mozilla/4\.0[678] no-gzip #浏览器是Mozilla的4.0、4.6、4.7或4.8版本时不压缩 # MSIE masquerades as Netscape, but it is fine 根据首部的User-Agent基于正则模式匹配浏览器类型和版本 BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html #浏览器是IE6.0之前的版本时,不压缩,若要压缩则只用gzip压缩text/html格式的文档
配置httpd支持https:
a) 为服务器申请数字证书
测试:通过私建CA发证书
创建私有CA
在服务器创建证书签署请求
CA签证
b) 配置httpd支持使用ssl,及使用的证书
yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot = ?? ServerName = ?? SSLCertificateFile = ?? SSLCertificateKeyFile = ??
c) 测试基于https访问相应的主机
openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
httpd-2.4常用配置:
切换使用MPM(编辑/etc/httpd/conf.modules.d/00-mpm.conf文件):
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so # NAME:有三种,分别为prefork,event,worker
修改“Main" Server的DocumentRoot
基于IP的访问控制法则:
允许所有主机访问: Require all granted
拒绝所有主机访问: Require all deny
控制特定IP访问:
Require ip IPADDR:授权指定来源地址的主机访问 Require not ip IPADDR:拒绝指定来源地址的主机访问 IPADDR的类型: IP:192.168.1.1 Network/mask:192.168.1.0/255.255.255.0 Network/Length:192.168.1.0/24 Net:192.168
控制特定主机(HOSTNAME)访问:
Require host HOSTNAME Require not host HOSTNAME HOSTNAME的类型: FQDN:特定主机的全名 DOMAIN:指定域内的所有主机
注意:httpd-2.4版本默认是拒绝所有主机访问的,所以安装以后必须做显示授权访问
示例:
Require not ip 192.168.1.20 Require all granted
虚拟主机:
基于IP、PORT和域名都支持
基于域名的不再需要NameVirtualHost指令
ssl:
启用模块:编辑/etc/httpd/conf.modules.d/00-base.conf文件,添加下面这行,如果已经有了但是注释了,则取消注释即可
LoadModule ssl_module modules/mod_ssl.so
服务脚本:
CentOS6编译安装的服务脚本:apachectl {start | stop | restart}
CentOS7的服务脚本:httpd.service,使用systemctl控制