第十三章 httpd详解

简介:

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) 每个请求相关的专业配置,使用<If>来配置

  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

1
2
3
### 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 <string>:设置用户代理发送给服务器

      -basic:使用Http基本认证

      --tcp-nodelay:使用TCP_NODELAY选项

      -e/--referer <URL>:来源网址

      --cacert <file>:CA证书(SSL)

      --compressed:要求返回时压缩的格式

      -H/--header <line>:自定义请求首部信息传递给服务器

      -I/--head:只显示响应报文首部信息

      --limit-rate <rate>:设置传输速度

      -u/--user <user[:password]>:设置服务器的用户和密码

      -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无需执行此步

1
2
3
4
5
6
7
8
9
10
11
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

1
2
3
4
5
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和端口:

1
Listen [IP:]PORT

    省略IP表示监听所有地址。Listen可重复出现多次


  持久连接:即长连接

1
Persistent Connection:连接建立,每个资源获取完成后不会立即断开连接,而是继续等待其它的请求完成

      如何断开?

        数量限制:默认获取100个资源后会自动断开连接

        时间限制:可配置,对于并发很大的服务器来说,此值不能设定太大

      副作用:对于并发访问量较大的服务器,持久连接功能会使有些请求得不到响应

      折衷:使用较短的持久连接时间。httpd-2.4支持毫秒级持久时间

1
2
3
KeepAlive {On | Off}:设定是否启用持久连接
MaxKeepAliveRequests 100:设定最大允许获取的资源数,当达到些设定值时将自动断开连接
KeepAliveTimeout 15:设定时间限制,当达到些时间限制时将自动断开连接


    测试持久连接:

1
2
3
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机制的支持。确认方法:

1
ps  aux | grep  httpd

    默认为/usr/sbin/httpd,其使用prefork

    更换使用的httpd程序:编辑/etc/sysconfig/httpd文件,并重启服务使之生效

1
HTTPD={httpd | httpd.worker | httpd.event}

    配置MPM:编辑主配置文件/etc/httpd/conf/httpd.conf

    prefork的配置:

1
2
3
4
5
6
StartServers:服务启动时启动的服务器进程数(提供服务的子进程数,不包含主进程)
MinSpareServers:最少空闲进程数
MaxSpareServers:最大空闲进程数
ServerLimit:为MaxClients所准备的在其服务生命周期内所允许的进程数量最大值
MaxClients:最大并发请求数
MaxRequestsPerChild:一个服务器进程最多能够响应多少次的请求

    worker的配置:

1
2
3
4
5
6
StartServers:服务启动时启动的服务器进程数(提供服务的子进程数,不包含主进程)
MaxClients:服务端最多启动的线程数量
MinSpareThreads:最少空闲线程数
MaxSpareThreads:最多空闲线程数
ThreadsPerChild:每个进程所能够启动的线程数
MaxRequestsPerChild:每个线程所能够响应的最大请求数量,0表示无限制


  DSO:Dynamic Share Object,模块的动态装/卸载机制

    配置指令实现模块加载:

1
LoadModule <mod_name> <mod_path>

    模块路径(mod_path)可使用相对路径:

        相对于ServerRoot(/etc/httpd)指向的路径而言

          /etc/httpd/modules   -->  /usr/lib64/httpd/modules


  定义“Main”server的文档页面路径,DocumentRoot

    文档路径映射:

      DocumentRoot指向的路径为URL路径的起始位置

1
DocumentRoot  "/var/www/html"

          test/index.html  -->  http://HOST:PORT/test/index.html


  站点访问控制:

    可基于两种类型的路径指明对哪些资源进行访问控制:

      针对文件系统路径:

1
2
3
<Directory  "" > < /Directory >
<File  "" > < /File >
<FileMatch  "" > < /FileMatch >

      针对URL路径:

1
2
<Location  "" > < /Location >
<LocationMatch  "" > < /LocationMatch >

    访问控制机制:

      基于来源地址

      基于帐号


  Directory中“基于来源地址”实现访问控制:httpd-2.2版本

    a) Options

      所有可用特性:

1
Indexes  Includes  FollowSymLinks  SymLinksifOwnerMatch  ExecCGI  MultiViews

        Indexes:索引,当不指定要访问的页面具体路径而又没有默认主页(index.html)时,以链接形式列出根(默认为/var/www/html)下的所有内容

        FollowSymLinks:允许跟踪符号链接文件

    b) 基于来源地址的访问控制机制

1
2
3
4
5
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) 定义安全域

1
2
3
4
5
6
7
8
9
10
11
<Directory  "" >
   Options None
   AllowOverride None
   AuthType Basic
   AuthName  "String"
   AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
   Require user username1 username2 ...      #只允许帐号文件中指定的用户登录访问
< /Directory >
 
允许帐号文件中的所有用户登录访问:
   在<Directory> < /Directory >之间添加Require valid-user

      b) 提供帐号和密码存储(使用htpasswd命令)

1
htpasswd [options] passwordfile username

      常用的options:

        -c:自动创建passwordfile,因此,仅应该在添加第一个用户时使用

        -m /path/to/passwordfile:md5加密用户密码

        -s:sha1加密用户密码

        -D:删除指定用户

      c) 实现基于组进行认证

1
2
3
4
5
6
7
8
9
<Directory  "" >
   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 ...
< /Directory >

      要提供用户帐号文件和组文件:

        组文件:只能手动定义,每一行定义一组。格式如下:

1
GROUP_NAME:user1 user2 user3 ...

  在组文件中的user必须在帐号文件中存在。


  定义默认主页面:

1
DirectoryIndex index.html index.html.var

  日志设定:

    定义日志格式:LogFormat 

1
2
3
4
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

      常用的日志格式定义宏:详情请看 官方文档

1
2
3
4
5
6
7
8
9
%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" 首部的值。即发出请求用到的应用程序

                                       

   错误日志:

1
2
Errorlog logs /error_log
LogLevel <日志级别>     #默认是warn级别

     日志级别有以下这些:从低到高,日志级别越低,记录越详细

      debug

      info

      notice

      warn

      error

      crit

      alert

      emerg

   访问日志:

1
CustomLog logs /access_log  combined


  路径别名:把一个URL映射至别的路径上

1
2
Alias  /URL/  "/PATH/TO/SOMEDIR/"
如:Alias  /bbs/  "/bbs/htdocs"


  设定默认字符集:

1
AddDefaultCharset UTF-8

  

  虚拟主机:

   有三种实现方案:

     基于ip:为每个虚拟主机准备至少一个ip地址

     基于port:为每个虚拟主机准备至少一个专用port,实践中很少使用

     基于域名:为每个虚拟主机准备至少一个专用域名

      需要将NameVirtualHost的注释去掉

     可混合使用上述三种方式中任意方式

   注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,必须先禁用中心主机

     禁用中心主机:注释DocumentRoot

   每个虚拟主机都有专用配置:还可以在虚拟主机中通过Directory进行访问控制

1
2
3
4
5
6
7
<VirtualHost *:80>     #此处的*可以换成指定的IP地址
   ServerAdmin webmaster@dummy-host.example.com
   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
< /VirtualHost >


  内置的status页面:可以查看服务器的状态

1
2
3
4
5
6
<Location  /server-status >
   SetHandler server-status
   Order deny,allow
   Deny from all
   Allow from .example.com
< /Location >


  使用mod_deflate模块压缩页面优化传输速度:适用于httpd-2.2版本

   适用场景:

     a) 节约带宽,额外消耗CPU,同时,可能有些较老浏览器不支持

     b) 压缩适于压缩的资源,例如文本文件

   方法:

     a) 编辑主配置文件/etc/httpd/conf/httpd.conf,查找mod_deflate.so,将其前面的注释去掉,启用mod_deflate模块

     b) 将以下内容添加至主配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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,及使用的证书

1
yum -y  install  mod_ssl

     配置文件:/etc/httpd/conf.d/ssl.conf

1
2
3
4
DocumentRoot = ??
ServerName = ??
SSLCertificateFile = ??
SSLCertificateKeyFile = ??

   c) 测试基于https访问相应的主机

1
openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]


  httpd-2.4常用配置:

   切换使用MPM(编辑/etc/httpd/conf.modules.d/00-mpm.conf文件):

1
2
3
LoadModule mpm_NAME_module modules /mod_mpm_NAME .so
 
#   NAME:有三种,分别为prefork,event,worker


   修改“Main" Server的DocumentRoot


   基于IP的访问控制法则:

     允许所有主机访问: Require all granted

     拒绝所有主机访问: Require all deny


     控制特定IP访问:

1
2
3
4
5
6
7
8
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)访问:

1
2
3
4
5
6
Require host HOSTNAME
Require not host HOSTNAME
 
HOSTNAME的类型:
   FQDN:特定主机的全名
   DOMAIN:指定域内的所有主机

     注意:httpd-2.4版本默认是拒绝所有主机访问的,所以安装以后必须做显示授权访问

     示例:

1
2
3
4
<RequireAll>
   Require not ip 192.168.1.20
   Require all granted
< /RequireAll >


   虚拟主机:

     基于IP、PORT和域名都支持

     基于域名的不再需要NameVirtualHost指令


   ssl:

     启用模块:编辑/etc/httpd/conf.modules.d/00-base.conf文件,添加下面这行,如果已经有了但是注释了,则取消注释即可

1
LoadModule ssl_module modules /mod_ssl .so


    服务脚本:

     CentOS6编译安装的服务脚本:apachectl {start | stop | restart}

     CentOS7的服务脚本:httpd.service,使用systemctl控制










本文转自 忘情OK  51CTO博客,原文链接:http://blog.51cto.com/itchentao/1931668,如需转载请自行联系原作者
相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
应用服务中间件 nginx
【Nginx】第七节 模块介绍
【Nginx】第七节 模块介绍
82 0
【Nginx】第七节 模块介绍
|
监控 Unix Linux
Zabbix zabbix_agentd指令(学习笔记二十七)
zabbix_agentd概念 zabbix_agentd非常非常重要,把zabbix_agentd安装到被监控服务器上,zabbix_server便可以和zabbix_agentd通信来获取数据。
1189 0
|
Web App开发 监控 网络安全