Apache(httpd)详解

时间:2020-12-19 13:05:50   收藏:0   阅读:2

思维导图

1. httpd服务

1.1 httpd概述

ASF(Apache Software Foundation)

1)服务器的类型

2)httpd的特性

高度模块化(Core+modules)

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

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

3)httpd的并发响应模型

# 工作模型
一个主进程:
    负责生成子进程及回收子进程
    负责创建套接字、接受请求,并将其派发给某子进程进行处理
n个子进程:
    每个子进程处理一个请求

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

# 并发响应数量:
子进程数 * 每个子进程能创建的最大线程数
# 工作模型:
一个主进程:
    负责生成子进程、创建套接字、接受请求,并将其派发给某子进程进行处理
子进程:
    基于事件驱动机制直接响应多个请求

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

2.2 httpd的程序结构

技术图片

3. httpd的主配置文件

3.1 配置文件结构和格式

1)整体结构

全局环境配置(Global Environment):对进程自己的工作特点,对所有虚拟主机都通用的设定

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

虚拟主机(Virtual Hosts)

2)配置格式: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、GB2312、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 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机制

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中定义那个目录的权限)
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)作用

2)适用场景

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)

2)虚拟主机种类

4.2 匹配规则&匹配格式

1)匹配规则

注意:

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会话缓存

6.2 配置httpd支持https

技术图片

7. 日志相关

7.1 日志的记录

技术图片

7.2 日志轮替

技术图片

8. 压测工具

技术图片

9. httpd自带的工具程序

技术图片

10. LAMP基本架构

技术图片

 

 

 

 

 

 

 

 

 

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!