Apache(httpd)详解

思惟导图javascript

1. httpd服务

1.1 httpd概述

ASF(Apache Software Foundation)css

1)服务器的类型html

  • http服务器(httpd,nginx,Lighttpd)
  • 应用程序服务器(IIS:.NET  ,tomcat:.JSP)

2)httpd的特性java

高度模块化(Core+modules)node

DSO机制(Dynamic Shared Object ,动态共享对象)nginx

MPM(Multipath Procession Modules,多路处理模块)web

  • 能够经过修改MPM来修改并发响应模型
  • 2.4支持MPM模块动态切换,2.2不支持

3)httpd的并发响应模型数据库

  • prefork:两级进程模型,父进程管理子进程,每一个进程响应一个请求
# 工做模型
一个主进程:
    负责生成子进程及回收子进程
    负责建立套接字、接受请求,并将其派发给某子进程进行处理
n个子进程:
    每一个子进程处理一个请求

# 注意:
会预先生成几个空闲进程,随时等待用于响应用户请求
最大空闲和最小空闲
  • worker:三级进程模型,父进程管理子进程,子进程经过线程响应用户请求,每一个线程处理一个用户请求
# 工做模型
一个主进程:
  负责生成子进程、建立套接字、接受请求,并将其派发给某子进程进行处理
多个子进程:
  每一个子进程负责生成多个线程
每一个线程:
  负责响应用户请求

# 并发响应数量:
子进程数 * 每一个子进程能建立的最大线程数
  • event:两级模型,父进程管理子进程,子进程经过事件驱动event-driven机制直接响应n个请求
# 工做模型:
一个主进程:
    负责生成子进程、建立套接字、接受请求,并将其派发给某子进程进行处理
子进程:
    基于事件驱动机制直接响应多个请求

# httpd-2.4中的event机制能够在生产环境中使用

2.2 httpd的程序结构

  • httpd2.2(CentOS6中)
  • httpd2.4(CentOS7及以上)

3. httpd的主配置文件

3.1 配置文件结构和格式

1)总体结构apache

全局环境配置(Global Environment):对进程本身的工做特色,对全部虚拟主机都通用的设定vim

主服务器配置段(“Main” server configuration):在2.2上若是要使用主服务器,则要将虚拟主机关掉

虚拟主机(Virtual Hosts)

2)配置格式:directive value

  • directive,不区分字符大小写
  • value,为路径时,是否区分字符大小写,取决于文件系统

3.2 监听的IP和PORT

# 格式:
Listen [IP:]Port [protocol] # 若省略IP则表示0.0.0.0
    # Listen指令能够重复出现屡次
        Listen 80
        Listen 8080        

# 注意:
修改监听的套接字,重启服务进程才能生效
限制其必须经过ssl通讯时,protocol须要定义为https

3.3 用户和用户组

# 做用:
指定以哪一个用户的身份运行httpd服务器进程
    
# 格式:
User apache Group apache # 对主控进程是root用户的说明:
主控进程是root,由于80端口是特权端口(小于1024的端口),只有管理员才能使用
因此主控进程是root,而其余的进程使用普通用户权限
        
SUexec在某些指令执行时能够切换到另一个用户(默认没有装载)

3.4 默认字符集

# 设置默认字符集
# 格式
AddDefaultCharset   UTF-8

# 中文字符集:
GBK、GB23十二、GB18030

3.5 站点主页面

# 格式:
DirectoryIndex  index.html  index.html.var

3.6 持久链接

# 持久链接 Persistent Connection  保持链接,长链接
tcp链接创建后,每一个资源获取完成后不断开链接,而是继续等待其余资源请求的进行
        
# 断开条件
1. 数量限制
2. 时间限制
        
# 反作用
对并发访问量较大的服务器,长链接机制会使得后续某些请求没法获得正常响应
        
# 折中方案
1. 使用较短的持久链接时长
2. 限制较少的请求数量
    
# 配置
KeepAlive  On | Off        # 是否启用长链接
KeepAliveTimeout  15       # 超时时长,单位为秒
MaxKeepAliveRequests  100  #保持链接上面所能获取的最大请求数量(每一个链接上面的最大请求数量)
        
# 注意
httpd2.4的KeepAliveTimeout能够是毫秒级,若是要设置毫秒级,能够直接在数值后面加上ms表示毫秒
  • 能够用telnet命令来对持久链接进行测试
telnet 10.0.0.110 80
GET / HTTP/1.1 Host: 10.0.0.110

3.7 配置MPM

1)说明

在2.2中(CentOS6的rpm包)专门提供了三个应用程序文件;由于httpd2.2不支持经过编译多个MPM模块,因此只能编译选定要使用的那个;

这三个应用程序文件分别用于实现对不一样的MPM机制的支持,默认是使用prefork机制

  • httpd(prefork)默认就是使用prefork机制
  • httpd.worker
  • httpd.event

2)查看httpd程序的模块列表

# 查看httpd程序的模块列表

# 查看静态编译的模块
httpd -l # 查看静态编译及动态编译的模块,查看全部模块
httpd -M

3)切换MPM机制

### 2.2中
# 1.更换使用的httpd程序,以支持其余MPM机制
vim  /etc/sysconfig/httpd
    HTTPD=/usr/sbin/httpd.{worker,event}
# 2.而后启用的时候要使用/usr/sbin/httpd.worker
/usr/sbin/httpd.worker -k start ### 2.4中
# 直接在这个文件中将对应的模块取消注释就ok
vim  /etc/httpd/conf.modules.d/00-mpm.conf # 查看当前的工做模式
httpd -V # 注意:重启服务方可生效

4)MPM的配置

# prefork的配置:
        <IfModule prefork.c>
                StartServers      8   # httpd服务进程启用之后自动建立出空闲的子进程数量
                MinSpareServers   5   # 最少空闲进程数,不管如何都须要有5个空闲进程来对待新请求
                MaxSpareServers  20   # 最大空闲进程数,要大于StartServers的数量
                ServerLimit      256  # 同时在生命周期内处于活跃状态的服务器进程数(跟MaxClients应该是相同的)
                MaxClients       256  # 最大容许启动的服务器子进程的数量
                MaxRequestsPerChild  4000  
                    # 一个子进程最多能处理的请求,若超过这个值,就将这个进程kill掉而建立新的进程
                   # 设置为0则表示永不过时
        </IfModule>
        
# worker的配置:
        <IfModule worker.c>
                StartServers     4      # httpd服务进程启动之后自动建立出空闲的子进程数量
                MinSpareThreads  25     # 最少空闲的线程数
                MaxSpareThreads  75     # 最大空闲的线程数
        MaxClients       300    # 最大的容许在线的线程数
                ThreadsPerChild  25     # 每一个子进程生成多少个线程
                MaxRequestsPerChild  0  # 单个进程最大容许响应多少个请求
        <IfModule>

3.8 模块加载

# DSO动态共享对象
    
# 模块位置
/etc/httpd/conf.modules.d/ 
在这个目录下的模块对应的配置文件中修改
    
# 加载模块
LoadModule   <mod_name>  <mod_path>
模块文件路径可以使用相对路径,相对于ServerRoot,默认是 /etc/httpd

3.9 定义Main Server

# 定义Main Server
ServerName FQDN # 语法格式
ServerName [scheme://]fully-qualified-domain-name[:port]
# 此处的名字是用来表示当前主机认为主机主要是服务于谁的
# 若是这条指令没有定义,那么httpd启动时会试图反解本地的IP地址(把IP解析为主机名),若是解析不成功,则会警告
 DocumentRoot "/var/www/html"
# 做用:指明网站的站点的url映射到本地的哪一个文件系统路径下
# 文档路径映射:
    # DocumentRoot指向的路径为URL路径的起始位置,其至关于站点URL的根路径
    # URL PATH与FileSystem PATH不是等同的,而是存在一种映射关系

3.10 路径别名

# 格式:
Alias  /URL/   "/PATH/TO/SOMEDIR" 
# 把URL跟另外的其余的目录创建映射关系

# 注意:在httpd2.4中要对那个目录进行显示受权(在Directory中定义那个目录的权限)
  • Alias和DocumentRoot的区别:
DocumentRoot "/www/htdocs"
        http://www.hgzero.com/download/xxx.txt                  /www/htdocs/download/xxx.txt                  Alias  /download/ "/doc/pub/"         http://www.hgzero.com/download/xxx.txt                 /doc/pub/xxx.txt

3.11 站点访问控制

# 文件系统路径:
        <Directory  "">        # 对目录下的全部资源进行控制
          ...
        </Directory>
        
        <File  "">             # 针对某个文件进行控制
          ...
        </File>
        
        <FileMatch  "PATTERN"> # 针对符合正则匹配的全部文件进行控制
          ...
        </FileMatch>

# URL路径:
        <Location  "">         # 针对URL路径进行控制
          ...
        </Location>
        
        <LocationMatch  "">
          ...
        </LocationMatch>

3.12 status页面

在2.4上面要装载的模块:LoadModule status_module modules/mod_status.so

# 在httpd2.2中:
        <Location  /server-status>
                SetHandler server-status
                Order allow,deny
                Allow  from  172.16
        </Location>
        
# 在httpd2.4中:
        <Location  /server-status>
                SetHandler server-status
                <RequireAll>
                        Require ip 172.16
                </RequireAll>
        </Location>

3.13 页面压缩deflate

1)做用

  • 使用mod_deflate模块压缩页面优化传输速度(压缩文本文件,图片文件不须要压缩)

2)适用场景

  • 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
  • 压缩适于压缩的资源,例如文件文件

3)设置示例

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.  # 匹配特定的浏览器,再对其作特定的压缩,由于可能有些浏览器的特性不同,如IE
BrowserMatch ^Mozilla/4  gzip-only-text/html
 
# Netscape 4.06-4.08 have some more problems
BrowserMatch  ^Mozilla/4\.0[678]  no-gzip
 
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E]  !no-gzip !gzip-only-text/html

4. 虚拟主机

4.1 虚拟主机概述

1)站点标识(IP、PORT、FQDN)

  • IP相同,端口不一样
  • IP不一样,端口均为默认端口
  • FQDN不一样:http请求报文首部中 Host:www.hgzero.com

2)虚拟主机种类

  • 基于IP地址:为每一个虚拟主机准备至少一个ip地址,默认是匹配自上而下的第一个符合条件的
  • 基于端口PORT:为每一个虚拟主机使用至少一个独立的port
  • 基于FQDN:为每一个虚拟主机使用至少一个FQDN
    • 基于FQDN时,要将全部的FQDN都解析到同一个IP地址上
    • 能够在本地hosts文件中定义或者在DNS服务器上指定
    • 基于FQDN时,是根据http请求报文中的host值来判断的,这个host值是不会被解析的

4.2 匹配规则&匹配格式

1)匹配规则

  • 通配的越少的虚拟主机,匹配优先级越高
  • 若是基于名称的虚拟主机没法匹配上,则采用虚拟主机列表中的第一个虚拟主机做为响应主机
  • 若是全部的虚拟主机都没法匹配上,则采用主配置段中的主机,若是主配置段中注释了DocumentRoot,则返回对应的错误

注意:

  • 通常虚拟主机不要与中心主机混用,若是要使用虚拟主机,得先禁用main主机;2.4则能够不由Main Server
  • 禁用中心主机:注释DocumentRoot便可

2)虚拟主机配置格式

<VirtualHost  IP:PORT>
        ServerName  FQDN
        DocumentRoot  "" ... ServerAlias:虚拟主机的别名,可屡次使用 </VirtualHost>

4.3 虚拟主机配置示例

1)基于IP的虚拟主机(基于端口)

# 基于IP的虚拟主机(基于端口的虚拟主机无非就是IP地址相同,而端口不一样而已):
<VirtualHost 10.0.0.201:81>
        ServerName www.hgzero.com
        DocumentRoot "/data/html/www"
        <Directory "/data/html/www">
                Options None
                AllowOverride None
                Require all granted
        </Directory>
        CustomLog "/data/html/www/log/access_log" combined
</VirtualHost>

<VirtualHost *:82>   # 这里的*表示监听本地全部地址
        ServerName bbs.hgzero.com
        DocumentRoot "/data/html/bbs"
        <Directory "/data/html/bbs">
                Options None
                AllowOverride None
                Require all granted
        </Directory>
        CustomLog "/data/html/bbs/log/access_log" combined
</VirtualHost>

2)基于FQDN的虚拟主机

# 基于主机名(FQDN)
<VirtualHost *:80>
        ServerName web.hgzero.com
        DocumentRoot "/data/html/www"
        <Directory "/data/html/www">
                Options None
                AllowOverride None
                Require all granted
        </Directory>
        CustomLog "/data/html/www/log/access_log" combined
</VirtualHost>

<VirtualHost *:80>
        ServerName bbs.hgzero.com
        DocumentRoot "/data/html/bbs"
        <Directory "/data/html/bbs">
                Options None
                AllowOverride None
                Require all granted 
        </Directory>
        CustomLog "/data/html/bbs/log/access_log" combined
</VirtualHost>

# 注意:若是是在http2.2上,则使用基于FQDN的虚拟主机时,要事先使用以下指令
        NameVirtualHost  172.16.100.6:80
        # 意为在这个IP和端口上,开放基于主机名的虚拟主机

3)注意

基于名称的虚拟主机必须指定ServerName指令,不然它将会继承操做系统的FQDN

对于基于名称的虚拟主机,若是使用IP地址请求没法匹配到任何虚拟主机时,将采用第一个虚拟主机做为默认虚拟主机

5. 访问控制

5.1 基于源地址的访问控制

1)httpd2.2和httpd2.4中的访问控制

### httpd-2.2 ###
AllowOverride   # 表示是否容许覆盖这里的配置;与访问控制相关的指令能够放在.htaccess文件中
    All
    None
        
order           # 定义生效次序,写在后面的表示默认法则
    allow
    deny
        
Allow from      # 容许哪些地址的访问
Deny from       #拒绝哪些地址的访问
    
### httpd-2.4 ### # 基于IP控制 Require ip IP_ADDR Require not ip IP_ADDR # 基于主机名控制 Require host 主机名或域名 Require not host 主机名或域名 ### 注意: # 以上的这些控制信息须要定义在<RequireAll>...</RequireAll>中或<RequireAny>配置块中 # 2.4中的源地址的访问控制须要显示指定

2)Options选项

Indexes        # 指明的URL路径下不存在与定义的主页面资源相等的资源文件时,返回索引列表给用户
FollowSymLinks # 容许跟踪符号连接文件所指向的源文件(在配置别名时颇有用)
None
All

3)httpd2.4中的配置示例

### 配置示例
<Directory "/var/www/html/bbs">
        Options None                     
        AllowOverride None
        <RequireAll>  # 这里定义了基于IP的访问控制(这里也能够缓存域名或主机名)
                Require ip 192.168.0.0/16
                Require not ip 192.168.1.102
        </RequireAll>
</Directory>

### 来源地址的格式:若是是基于主机名的话,要写成Requrie host node1.com 
        IP
        NetAddr:
                172.16
                172.16.0.0/16
                172.16.0.0/255.255.0.0

5.2 控制页面容许or不容许全部主机访问

# 控制页面资源容许全部来源的主机可访问:
        # http-2.2
                <Directory  "">
                        ...
                        Order  allow,deny
                        Allow from all
                </Directory>
        # http-2.4
                <Directory  "">
                        ...
                        Require all granted
                </Directory>

# 控制页面资源拒绝全部来源的主机可访问:
        # http-2.2
                <Directory  "">
                        ...
                        Order  allow,deny
                        Deny from all
                </Directory>
        # http-2.4
                <Directory  "">
                        ...
                        Require all denied
                </Directory>

5.3 htpasswd

5.4 基于用户的访问控制

1)认证概述

# 认证质询
WWW-Authenticate,响应码为401,拒绝客户端请求,并说明要求客户端提供帐号和密码
客户端用户填入帐号和密码后再次发送请求报文,若认证经过,则服务器发送响应的资源
    
# 认证方式
basic:明文 digest:消息摘要认证 表单认证 # 安全域
须要用户认证后方能访问的路径
应该经过名称对其特性标识,以便告知用户认证的缘由
    
# 用户的帐号和密码存放的位置
虚拟帐号:仅用于访问某服务时用到的认证标识
存储:
    文本文件
    SQL数据库
    ldap目录存储

2)basic认证配置示例

  • 基于用户的认证:
# 定义安全域:
        <Directory  "">
                Options  None
                AllowOverride None # 是否容许覆盖这里的配置,通常都是设置为None
                AuthType Basic     # 也能够指明digest认证方式
                AuthName "String"  # 指明提示信息
                AuthUserFile  "/etc/httpd/conf.d/.htpasswd"  # 密码文件,最好将其设置为隐藏文件
                Require user username1 username2 ...         # 容许登陆的用户
        Require valid-user  # 容许帐号文件中的全部用户登陆访问
        </Directory>
  • 基于组帐号进行认证:
# 定义安全域:
        <Directory  "">
                Options  None
                AllowOverride  None
                AuthType  Basic
                AuthName  "String"
                AuthUserFile  "PATH/TO/HTTPD_USER_PASSWD_FILE"
                AuthGroupFile  "/PATH/TO/HTTPD_GROUP_FILE"   # 这里引用的是组帐号的文件
                Require  group  groupname1  grpname2 ...       # 容许登陆的组
        </Directory>
        
# 建立用户帐号和组帐号文件:
          # 组帐号定义格式:
    组文件:每一行定义一个组(建立组帐号文件)
    GRP_NAME:username1  username2 ...

6. https的配置

6.1 https的工做流程

1)SSL会话过程

 2)SSL会话缓存

  • SSL会话的时长
    • 若每次通讯都通过ssl handshake,那将是很是浪费资源的,因此Server端能够吧ssl会话给缓存下来
    • 在一段时间内同一客户端访问时这个ssl handshake过程就没必要再作了,直接利用此前已经创建的会话资源就能够了
    • 可是此会话不能保存太长时间,通常是五分钟以内都是有效的
  • SSL会话是基于IP地址建立的,因此单IP的主机上,仅可使用一个https的虚拟主机

6.2 配置httpd支持https

7. 日志相关

7.1 日志的记录

7.2 日志轮替

  • cronolog
  • rotatelog

8. 压测工具

9. httpd自带的工具程序

  • apachectl
  • apxs
  • suexec

10. LAMP基本架构

相关文章
相关标签/搜索