1. 高度模块化:core + modules
2. DSO: Dynamic Shared Object(动态装载)
3. MPM:Multipath Processing Modules
* prefork:多进程模型,每个进程响应一个请求;
一个主进程:负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;
* worker:多线程模型,每个线程响应一个请求;
一个主进程:生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求;
m进程,n线程:m*n
* event:事件驱动模型,每个线程响应n个请求;
一个主进程:生成m个子进程,每个进程直接n个请求;
m*n
httpd-2.2: event为测试使用
httpd-.24:event可生产使用
* 虚拟主机
IP、Port、FQDN
* CGI:Common Gateway Interface,通用网关接口;
* 反向代理
* 负载均衡
* 路径别名
* 丰富的用户认证机制
basic
digest
* 支持第三方模块
1. 修改监听的IP和Port
Listen [IP:]PORT
省略ip表示监听本机所有IP; Listen可重复出现多次;
2. 持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成;
如何断开?
数量限制:100
时间限制:可配置
副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应;
折衷:使用较短的持久连接时间;
httpd-2.4 支持毫秒级持久时间;
非持久连接
KeepAlive On|Off
MaxKeepAliveRequests #
KeepAliveTimeout #
测试:
telnet HOST PORT
GET /URL HTTP/1.1
Host: HOSTNAME or IP
3. MPM
Multipath Process Module:多道处理模块
prefork, worker, event
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持;确认方法:
# ps aux | grep httpd
默认为/usr/sbin/httpd, 其使用prefork
查看模块列表:
查看静态编译的模块
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
查看静态编译及动态装载的模块
# httpd -M
更换使用的httpd程序:
/etc/sysconfig/httpd
HTTPD=
重启服务生效;
prefork的配置:
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
worker的配置:
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
PV, UV
PV: Page View
UV: User View
独立IP量;
300*86400=40W+
4. DSO
配置指令实现模块加载
LoadModule
模块路径可使用相对地址
相对于ServerRoot(/etc/httpd)指向的路径而言;
/etc/httpd/modules/
5. 定义'Main' server的文档页面路径
DocumentRoot
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置;
DocumentRoot "/var/www/html"
test/index.html --> http://HOST:PORT/test/index.html
6. 站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:
URL路径:
...
访问控制机制:
基于来源地址;
基于账号;
7. Directory中“基于来源地址”实现访问控制
(1) Options
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
None, All
Indexes: 索引;
FollowSymlinks:允许跟踪符号链接文件;
(2) 基于来源地址的访问控制机制
Order:检查次序
Order allow,deny
Order deny,allow
Allow from
Deny from
来源地址:
IP
NetAddr:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8. 定义默认主页面
DirecotryIndex index.html index.html.var
9. 日志设定
错误日志:
ErrorLog logs/error_log
LogLevel warn
debug, info, notice, warn, error, crit, alert, emerg
访问日志:
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%h:客户端IP地址;
%l: Remote logname (from identd, if supplied). -表示为空;
%u: Remote user, (from auth; may be bogus if return status (%s) is 401);
%t:Time the request was received (standard english format),服务器收到请求的时间;
%r:First line of request,请求报文的道行信息(method url version);
%>s: 响应状态码;
%b: 响应报文的大小,单位是字节,不包括响应报文首部;
%{Referer}i:请求报文当中"referer"首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来;
%{User-Agent}i:请求报文当中"User-Agent"首部的值;即发出请求用到的应用程序;
详情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10. 路径别名
DocumentRoot "/www/htocs"
http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
--> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias /bbs/ "/forum/htdocs"
http://www.magedu.com/bbs/index.html
--> /forum/htdocs/bbs/
11. 设定默认字符集
AddDefaultCharset UTF-8
GBK, GB2312, GB18030
12. 基于用户的访问控制
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;
认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器发送响应的资源;
认证类型:
basic:明文
digest:消息摘要
安全域:需要用户认证后方能访问的路径;
应该通过名称对其进行标识,并用于告知用户认证的原因;
用户的账号和密码存储于何处?
虚拟账号:仅用于访问某服务时用到的认证标识;
存储:
文本文件
SQL数据库
ldap
nis
basic认证:
(1) 定义安全域(写到/etc/httpd/conf.d/httpd.conf里面)
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"(随便起,登陆提示用)
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
(例/etc/httpd/conf.d/.htpasswd)
Require user username1 username2 ...
Require valid-user或者只允许哪几个Require user tom jerry
允许账号文件中的所有用户登录访问:
Require valid-user
(2) 提供账号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
-m: md5加密用户密码;
-s: sha1加密用户密码;
-D: 删除指定用户
htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom
(3) 实现基于组进行认证
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2 ...
要提供:用户账号文件和组文件;
组文件:每一行定义一个组
GRP_NAME:user1 user2 user3 ...
webadmin: tom jerry
示例:
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmin
13. 虚拟主机
有三种实现方案:
基于ip:
为每个虚拟主机准备至少一个ip地址;
基于port:
为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:
为每个虚拟主机准备至少一个专用hostname;
可混合使用上述三种方式中任意方式;
注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置:
SeverName
DocumentRoot ""
ServerAlias: 虚拟主机的别名;
ErrorLog
CustomLog
示例1:基于ip
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
示例2:基于port
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
示例3:基于hostname
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
14. 内置的status页面
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.16
实现:基于账号实现访问控制