• Apache(httpd)详解


    思维导图

    1. httpd服务

    1.1 httpd概述

    ASF(Apache Software Foundation)

    1)服务器的类型

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

    2)httpd的特性

    高度模块化(Core+modules)

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

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

    • 可以通过修改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)整体结构

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

    主服务器配置段(“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、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命令来对持久连接进行测试
    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 MSI[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基本架构

  • 相关阅读:
    CF1539 VP 记录
    CF1529 VP 记录
    CF875C National Property 题解
    CF1545 比赛记录
    CF 1550 比赛记录
    CF1539E Game with Cards 题解
    CF1202F You Are Given Some Letters... 题解
    vmware Linux虚拟机挂载共享文件夹
    利用SOLR搭建企业搜索平台 之九(solr的查询语法)
    利用SOLR搭建企业搜索平台 之四(MultiCore)
  • 原文地址:https://www.cnblogs.com/hgzero/p/14136149.html
Copyright © 2020-2023  润新知