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

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

 内置的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控制

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前名称:第十三章httpd详解-创新互联
当前网址:http://hbruida.cn/article/ihegp.html