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 :CA证书(SSL)

      --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控制