实验环境:VMware Workstation Pro 14(试用版)
系统平台:
CentOS release 6.9 (Final) 		       内核  2.6.32-696.el6.x86_64
Server version: Apache/2.4.29 (Unix)

新特性

 MPM支持运行为DSO机制;以模块形式按需加载
 event MPM生产环境可用
 异步读写机制
 支持每模块及每目录的单独日志级别定义
 每请求相关的专用配置
 增强版的表达式分析式
 毫秒级持久连接时长定义
 基于FQDN的虚拟主机不需要NameVirutalHost指令
 新指令,AllowOverrideList
 支持用户自定义变量
 更低的内存消耗
 修改了一些配置机制
    不再支持使用Order, Deny, Allow来做基于IP的访问控制

 新模块
     (1) mod_proxy_fcgi
    FastCGI Protocol backend for mod_proxy
    
     (2) mod_remoteip
    Replaces the apparent client remote IP address
    and hostname for the request with the IP address list
    presented by a proxies or a load balancer via the
    request headers.
    
     (3) mod_ratelimit
    Provides Bandwidth Rate Limiting for Clients

Apache HTTP 服务器 2.4 文档

http://httpd.apache.org/docs/2.2/

主程序文件:

/usr/sbin/httpd

rpm安装程序环境:

配置文件:

/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf

模块相关的配置文件:

/etc/httpd/conf.modules.d/*.conf

systemd unit file:

/usr/lib/systemd/system/httpd.service

主程序文件:

/usr/sbin/httpd
httpd-2.4支持MPM的动态切换
mpm中的worker和even变为以模块方式进行加载了

日志文件:

/var/log/httpd
access_log:访问日志
error_log:错误日志

站点文档: /var/www/html

模块文件路径: /usr/lib64/httpd/modules

服务控制: systemctl enable|disable httpd.service systemctl {start|stop|restart|status} httpd.service

Httpd 2.4常见配置

定义网站目录

默认
DocumentRoot "/var/www/html"

目录需要明确授权才可以访问,这个与2.2版本差异比较大

<Directory "/app/www">      > 这里也是需要修改为对应的目录
    Require all granted
</Directory>

记得修改目录的属主与权限
此项修改只需要reload即可

切换使用的MPM

Centos 7
仅仅把需要使用的模式注释即可

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so   > 默认模式
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
#LoadModule mpm_event_module modules/mod_mpm_event.so


Centos 6
Include /etc/httpd24/extra/httpd-mpm.conf
LoadModule mpm_event_module
modules/mod_mpm_event.so
MPM工作模式

prefork:多进程I/O模型,每个进程响应一个请求,默认模型
一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个

worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

event:事件驱动模型(worker模型的变种)
一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力

基于IP的访问控制

无明确授权的目录,默认拒绝

任意目录下的页面只有显式授权才能被访问

允许所有主机访问:  Require all granted
拒绝所有主机访问:  Require all denied
允许指定:          Require ip IP地址
                    Require host 主机FQDN名称可整个域名之下的主机
                    
拒绝指定:          Require not ip IP地址     
                    Require not host 主机FQDN名称可整个域名之下的主机

语法:

允许所有,拒绝特定 (拒绝优先)
<RequireAll>                   > 关键语法
Require all granted            > 必须
Require not ip 192.168.5.102
</RequireALL>

拒绝所有,允许特定 (允许优先)
<RequireAny>                   > 关键语法
Require all denied             > 必须
Require ip 192.168.5.102
</RequireAny>

效果等同上一个配置
<Directory "/app/www">
    Require ip 192.168.5.102     > 仅允许特定IP
</Directory>

以下这种语法是错误的,因为默认的法则是拒绝,而这里却没有允许的特例
<Directory "/app/www">
    Require not ip 192.168.5.102
</Directory>

虚拟主机

基于FQDN的虚拟主机不再需要NameVirutalHost指令

<VirtualHost *:80>
    DocumentRoot /app/www
    ServerName www.hunk.tech
      <Directory "/app/www">       > 必须配置具体目录的访问授权
        Require all granted        > 允许所有
      </Directory>
</VirtualHost>

Sendfile机制

提升性能。 sendfile() 能减少切换次数而且还能减少拷贝次数

工作过程
 硬盘 >> kernel buffer (快速拷贝到kernel socket buffer) >> 协议栈
默认开
EnableSendfile on

启用代理

ProxyPass "/" "http://www.example.com/"         > 正向代理到后端服务器
ProxyPassReverse "/" "http://www.example.com/"  > 如果响应中有302重定向,ProxyPassReverse就派上用场

ProxyPass "/images" "http://www.example.com/"
ProxyPassReverse "/images" http://www.example.com/

客户端到服务器称之为正向代理,服务器到客户端就叫反向代理
示例:

<VirtualHost *:80>
    DocumentRoot /app/www
    ServerName www.hunk.tech
    proxypass "/" "http://192.168.5.102" 
    ProxyPassReverse "/" "http://192.168.5.102" 
      <Directory "/app/www">
        Require all granted
      </Directory>
</VirtualHost>

#curl  192.168.5.103
proxy from 192.168.5.103