实验环境: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