CentOS6 配置 httpd2.2 服务
1. 程序环境
这里使用的是
CentOS6
自带的httpd
程序,而非编译安装的程序,基本和CentOS7
通过yum
安装的配置文件一致。
- 配置文件
# 主配置文件,默认/etc/httpd为根目录
/etc/httpd/conf/httpd.conf
# 主配置文件的附加片段
/etc/httpd/conf.d/*.conf
- 服务脚本
# CentOS6服务脚本,使用的是Upstart启动模式
/etc/rc.d/init.d/httpd
# 服务脚本的配置文件
/etc/sysconfig/httpd
# CentOS7服务脚本,使用的是Systemd启动模式,只有这点配置上的区别
/usr/lib/systemd/system/httpd.service
- 主程序文件
- 通过
rpm -ql httpd | grep bin
查询得到的结果
- 通过
/usr/sbin/httpd # 默认prefork模型的,可以在配置文件/etc/sysconfig/httpd中切换
/usr/sbin/httpd.event # 2.2版本中event还不够稳定
/usr/sbin/httpd.worker # 多线程模型
- 日志文件目录
# httpd服务的访问日志
/var/log/httpd/access_log
# httpd服务的错误日志
/var/log/httpd/error_log
- 站点文档目录
# 默认的站点目录
/var/www/html
- 模块文件路径
# 默认的模块文件路径
/usr/lib64/httpd/modules
- 配置文件的组成
- 基本上由三段组成,建议第二段和第三段不要同时配置
- 配置格式:
directive value
[escape@MiWiFi-R3-srv ~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment # 全局配置
### Section 2: 'Main' server configuration # 主服务器配置
### Section 3: Virtual Hosts # 虚拟主机配置
2. 常用配置
修改的文件为
httpd.conf
主配置文件
2.1 监听IP
和Port
- 使用格式
- 格式:
Listen [IP:]PORT
- 格式:
- 重点说明
- 省略
UP
表示监听本机所有IP
(多块网卡有多个IP
地址) Listen
可重复指定多个端口,且修改端口需要restart
服务
- 省略
Listen 80
Listen 172.16.100.16:8080
2.2 配置持久连接
- 功能介绍
- 持久连接 == 长连接
- 优点:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成
- 缺点:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应
- 折中方法:使用较短的持久连接时间
- 连接断开方式
- 限制请求数量,默认为
100
个,之后就断开连接 - 限制时间,可配置,建议配置且不要配置太大
- 限制请求数量,默认为
- 注意事项
- 在
HTTP/1.0
版本中默认使用非持久连接,在HTTP/1.1
版本中默认使用持久连接 - 在
httpd2.4
中支持毫秒级持久时间,可以使用较短的持久连接时间
- 在
# 配置
KeepAlive On|Off # 启动,下面的配置才有效
MaxKeepAliveRequests # 最大持久连接的请求数量
KeepAliveTimeout # 最大持久连接的超时时间,单位为秒钟
# 测试方法,持久连接在telnet中可以多次请求不中断
$ telnet 192.168.31.94 80
> GET / HTTP/1.1
> Host: 192.168.31.94
2.3 选择MPM
模式
目前在
Apache 2.x
版本中MPM
只能选择一个,同一台服务器是无法使用多个MPM
模块的,不过在Apache 2.4
版中,已经增加了可以同时选择使用多个MPM
模块。
MPM
模式使用
- 功能介绍
MPM
(Multipath Process Module
)多道处理模块- 有三种模式:
prefork
、worker
、event
- 默认为
/usr/sbin/httpd
,其使用prefork
模式
- 注意事项
httpd2.2
不支持同时编译多个模块,所以只能编译时选定一个rpm
安装的包提供三个二进制程序文件,分别用于实现对不同MPM
机制的支持
三大模块介绍
prefork
模块- 为
UNIX/Linux
系统的默认选择模块 prefork
模块通过预先派生一定数量的子进程来等待用户请求- 优势在于当一个进程崩溃之后并不会影响其他的进程工作,具有很大的调节能力
- 为
worker
模块- 使用混合的多线程多进程模型,使用进程处理用户请求
- 启动多个进程且每个进程派生多个线程来服务请求,所以稳定性更加好
event
模块
模块说明
# 查看当前的MPM模式
[root@MiWiFi-R3-srv ~]# ps -aux | grep httpd
root 5806 0.0 0.4 185924 2316 ? Ss Nov28 0:04 /usr/sbin/httpd
apache 5809 0.0 0.4 186060 2212 ? S Nov28 0:00 /usr/sbin/httpd
apache 5810 0.0 0.4 186060 2296 ? S Nov28 0:00 /usr/sbin/httpd
......
# 查看静态编译的模块
$ httpd -l
# 查看所以模块(包括静态编译及动态装载的模块)
$ httpd -M
- 更换使用的
httpd
程序- 修改配置文件
/etc/sysconfig/httpd
,启用HTTPD
参数 - 需要重启服务才能生效配置
- 修改配置文件
# 查看ps aux | grep httpd
# 如果修改为worker之后,httpd命令就变为httpd.worker
[root@MiWiFi-R3-srv ~]# cat /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
PIDFILE=/var/run/httpd/httpd.pid
- 根据
httpd
程序进行加载配置
# httpd.conf主配置文件
# prefork的配置:httpd2.2中event还不稳定
StartServers 8 # 服务启动时启动的子进程数,即主控进程启动的子进程数
MinSpareServers 5 # 最少空闲的子进程数
MaxSpareServers 20 # 最大空闲的子进程数
ServerLimit 256 # 服务器进程数量最大值,限制MaxClients
MaxClients 256 # 允许同时伺服的最大接入请求数量,数值取决于资源
MaxRequestsPerChild 4000 # 每个子进程在其生存期允许伺服的最大请求数量,超过时就重新启动
# worker的配置:多进程多线程模型
StartServers 4 # 服务启动时启动的进程数,主控进程启动的子进程数
MaxClients 300 # 服务器端最大启动的线程数量,数值取决于资源
MinSpareThreads 25 # 最少空闲线程数
MaxSpareThreads 75 # 最大空闲线程数
ThreadsPerChild 25 # 每个进程最大能够启动的线程数
MaxRequestsPerChild 0 # 每个线程最大的响应次数,0表示不做限制
通过PV
和UV
粗略计算带宽
- 【访问量】**
PV
:**即页面浏览量或点击量;在一定统计周期内用户每次刷新网页一次即被计算一次 - 【独立访客】**
UV
:**访问您网站的一台电脑客户端为一个访客;00:00-24:00
内相同的客户端只被计算一次 - 【独立
IP
】**IP
:**指独立IP
数;00:00-24:00
内相同IP
地址之被计算一次 网站独享带宽 = 一天总的PV值 ÷ 一天总时间(换算为秒) * 平均页面大小(单位为KB) * 8
粗略计算内存消耗
- 计算单个线程内存消耗量来设置线程数量
- 使用
ps
、top
等命令查看Apache
单个线程的消耗内存(如2MB
),那么prefork
模型默认线程数256
,则使用256x2=512MB
内存,从而根据物理机的实际内存定义启动的线程数量
2.4 使用DSO
加载模块
- 配置指令实现模块加载和卸载
- 格式:
LoadModule <mod_name> <mod_path>
- 模块路径可使用相对地址,相对于
ServerRoot
(/etc/httpd
)指向的路径而言 - 配置完成之后,需要使用
restart
才能生效
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
2.5 定义DocumentRoot
路径
DocumentRoot
指向的路径为URL
路径的起始位置- 保证功能正常运行,暂时关闭
selinux
和iptables
# 基于URL实现访问控制
DocumentRoot "/var/www/html"
# 基于文件系统实现访问控制
# 定义DocumentRoot
DocumentRoot "/var/www/htocs"
# 访问网站下的bash二进制包会映射到/var/www/htdocs/下查找
http://www.escape.com/download/bash-4.4.2-3.el6.x86_64.rpm
--> /var/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
2.6 定义默认主页面
- 定义的默认页面可以有多个,自左往右查找
# httpd.conf文件中配置
DirectoryIndex index.html index.php index.html.var
2.7 指定路径别名
- 路径别名用于对路径地址进行映射
- 格式:
Alias /URL/ "/PATH/TO/SOMEDIR/"
# 定义Alias别名
Alias /bbs/ "/forum/htdocs"
# 访问网站的bbs会映射到/forum/htdocs目录下的bbs子目录
http://www.escape.com/bbs/index.html
--> /forum/htdocs/bbs/index.html
2.8 设定默认字符集
- 支持很多字符集,如
GBK
、GB2312
、GB18030
AddDefaultCharset UTF-8
2.9 压缩页面设置
使用
mod_deflate
模块压缩页面优化传输速度,能够让httpd
使用压缩功能。
- 适用场景
- (1) 好处是节约带宽,但是额外消耗
CPU
时钟周期;可能有些较老浏览器不支持 - (2) 压缩适于压缩的资源,例如文本文件、图片等效果显著
- (1) 好处是节约带宽,但是额外消耗
- 使用方法
- 复制如下内容到
httpd.conf
文件中 - 确保
deflate_module
模块已经启用
- 复制如下内容到
# 输出过滤器设置为DEFLATE
SetOutputFilter 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. 定义不需要压缩的浏览器
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
2.10 禁止DNS
查询
- 禁止
DNS
查询提高服务器的请求效率
HostnameLookups off
2.11 服务器安全检查
防范方法
- 保证
Apache
服务器的软件和组件的稳定性和安全性,及时打补丁 - 保证不使用危险的字符,如
*
、|
等 - 设置会话超时时间与
cookie
过期时间,以避免暴力破解 - 服务器崩溃时,不会像客户端显示调试信息
- 禁止不是用的模块
常用检测工具
mod_security
模块nikto
网站Web
检查工具chkrootkit
系统漏洞检查工具
3. 高级配置
安装包不需要追求最新的,稳定高效安全最为重要。
3.1 站点访问控制
在
httpd2.4
中需要做授权才能正常使用
访问控制机制分类
- 基于来源地址
- 基于用户账号
路径资源分类
- 文件系统路径
<Directory ""> </Directory>
指明目录路径<DirectoryMatch ""> </DirectoryMatch>
尽量不要使用,效率低<File ""> </File>
针对单个文件<FileMatch ""> </FileMatch>
尽量不要使用,效率低
URL
路径<Location ""> </Location>
还有指明请求方式的功能等特殊方法<LocationMatch ""> </LocationMatch>
尽量不要使用,效率低
3.1.1 基于来源地址的访问控制
在
Directory
中“基于来源地址”实现访问控制机制,这里主要针对于httpd2.2
进行说明。
(1)Options
属性
- 介绍
- 定义用户对
Directory
中的资源访问的控制选项 - 常用特性:
Indexes
、FollowSymLinks
、ExecCGI
- 较少使用特性:
Includes
、SymLinksifOwnerMatch
、MultiViews
- 定义用户对
- 属性选项
None
:所以特性都不支持All
:所以特性都支持Indexes
: 索引FollowSymlinks
:允许跟踪符号链接文件Includes
:服务器端包含SymLinksifOwnerMatch
:允许跟踪符号链接文件,但需要链接目标文件和源文件属组一直ExecCGI
:允许CGI
脚本执行MultiViews
:根据用户浏览器的语言环境显示针对的内容,内容协商机制,效率低
- 注意事项
- 如果网站没有设置默认页面且启用
Indexes
选项,列出当前访问路径下的文件,但是你会发现设置之后,显示的是欢迎页面,这是因为在/etc/httpd/conf.d/welcome.conf
中系统做了配置,将其移除,则显示文件列表,需要注意的是还要和DocumentRoot
对于起来,否则匹配和设置不一致,导致无法生效;有时网站做下载站的时候需要使用 - 如果网站使用
FollowSymlinks
选项,通过ln -sv /etc/issue /www/html/issue.html
连接的文件,能够让用户访问到/www/html/issue.html
文件
- 如果网站没有设置默认页面且启用
# 可以使用在全局,也可以使用在特定Directory容器内
Options Indexes FollowSymLinks
Options -Indexes FollowSymLinks
<Directory "/var/www/html">
Options Indexes FollowSymLinks
</Directory>
(2)基于来源地址的访问控制机制
Order
指明:检查次序,后者为默认机制- 白名单:
Order allow,deny
- 黑名单:
Order deny,allow
- 白名单:
- 允许访问:
Allow from 来源地址
- 拒绝访问:
Deny from 来源地址
- 来源地址地址可以是
IP
地址、网络地址、主机名IP
地址:192.168.31.173
- 网络地址:
172.16
- 网络地址:
172.16.0.0
- 网络地址:
172.16.0.0/16
- 网络地址:
172.16.0.0/255.255.0.0
- 主机名是
DNS
服务器中定义的FQDN
# 在/var/www/html中定义白名单,拒绝192.168.31.173的访问,允许192.168网络的访问
<Directory "/var/www/html">
Options Indexes FollowSymLinks
Order allow,deny
Deny from 192.168.31.173
Allow from 192.168
Allow from all
</Directory>
(3)是否允许Directory
定义下的文件自行进行设置
- 解释
AllowOverride
: 是否允许被覆盖- 在
Directory
目录下的文件中创建一个隐藏文件.htaccess
,在其中进行各目录自己的权限规则 - 虽然这样很灵活,但是风险很大,所以很少使用
- 是否允许在设置目录定义的规则覆盖各个子目录下的
.htaccess
规则
- 方法
AllowOverride None
- 可选的值:
All
、None
、FileInfo
、AuthConfig
、Limit
3.1.2 基于用户账号的访问控制
认证概念:服务器需要通过某种方式来验证用户的身份的合法性,一旦服务器知道了用户的身份就可以判定用户是否可以访问受限资源,通常使用用户名和密码验证。
认证质询
WWW-Authenticate
:响应码为401
,拒绝客户端请求,并说明要求客户提供账号和密码
注意事项
- 一般情况下,我们会优先使用表单的进行认证机制
- 在没有表单认证机制的情况下,可以使用
basic
认证,因为是明文传送且不够安全,可将其放入https
中保证安全 - 认证是指客户端用户填入账号和密码后再次发送请求报文,认证通过,则服务器发送响应的资源
认证类型
- 防止密码信息在传输过程中被窃取加的保护方式
basic
:明文传输,一般使用为base64
编码digest
:消息摘要,使用 md5 编码,老版本浏览器不支持
Basic
认证
# (1) 定义安全域
<Directory ""> # 指定需要控制的文件目录
Options None
AllowOverride None
AuthType Basic # 认证类型
AuthName "STRING" # 认证提示信息
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" # 用户认证文件
Require user username1 username2 ... # 可选,需要哪些用户可以登录
</Directory>
# 允许账号文件中的所有用户登录访问
Require valid-user
# (2) 提供账号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用
-m: md5加密用户密码;
-s: sha1加密用户密码;
-D: 删除指定用户
# (3) 实现基于组进行认证,要提供用户账号文件和组文件
<Directory "">
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 ... # 可选,需要哪些组可以登录
</Directory>
# 组文件格式: 每一行定义一个组
webadmin: tom bob
sysadmin: root escape
# 实例说明
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmin
3.2 虚拟主机
一般虚拟主机不要和中心主机混用,所以,要使用虚拟主机,先禁用中心主机(注释
DocumentRoot
)
- 虚拟主机是指一个物理服务器上运行多个
Web
站点- 在
HTTP/1.1
之后,Apache
才开始同时支持基于IP
和基于主机名的虚拟主机。
虚拟主机实现的三种方案
- (1) 基于
ip
地址- 为每个虚拟主机准备至少一个独立的
ip
地址 ip
地址用户很难记忆,所以也比较少用
- 为每个虚拟主机准备至少一个独立的
- (2) 基于端口号(
port
)- 为每个虚拟主机准备至少一个专用
port
- 需要记忆端口号,生成环境中很少使用
- 为每个虚拟主机准备至少一个专用
- (3) 基于主机名(
hostname
)- 为每个虚拟主机准备至少一个专用
hostname
- 一般都是使用主机名的方式应用虚拟主机,所以使用最多
- 为每个虚拟主机准备至少一个专用
- 注释:可混合使用上述三种方式中任意方式
虚拟主机配置
- 每个虚拟主机都有专用配置:包括日志、访问控制、虚拟主机的别名等指令
# 虚拟主机一般配置如下
<VirtualHost "IP:PORT">
SeverName # [主要] 定义虚拟主机名称
DocumentRoot "" # [主要] 定义网站访问根目录
ServerAlias
ErrorLog
CustomLog
<Directory "">
......
</Directory>
</VirtualHost>
检测配置语法
- 检测语法错误:
httpd -t
- 检测虚拟主机配置:
httpd -S
service httpd configtest
3.2.1 基于IP
地址的虚拟主机
优点特性
- 可以让那些不支持
HTTP/1.1
的浏览器能够正常访问 - 能够支持
SSL
安全套接字功能,SSL
需要独立的IP
地址和主机名才能进行关联
(1) 配置虚拟IP
地址
# 查看eth0网卡
$ifconfig
192.168.31.6
# 配置网卡别名
$ ifconfig eth0:0 192.168.31.7 netmask 255.255.255.0 up
# 查看配置的eth0:0
$ ifconfig eth0:0
(2) 配置虚拟主机
ServerName web1.escape.com
DocumentRoot "/vhosts/web1/htdocs"
ServerName web2.escape.com
DocumentRoot "/vhosts/web2/htdocs"
让虚拟主机支持SSL
- 在基于
IP
地址的虚拟主机中可以为其开启SSL
功能加上SSL
证书来支持SSL
Listen 443
ServerName web1.escape.com
DocumentRoot "/vhosts/web1/htdocs"
SSLEngine on
SSLCertificateFile /srv/www/ssl/escape.crt
SSKcertificateKeyFile /srv/www/ssl/escape.key
3.2.2 基于端口号的虚拟主机
ServerName web1.escape.com
DocumentRoot "/vhosts/web1/htdocs"
ServerName web2.escape.com
DocumentRoot "/vhosts/web2/htdocs"
ServerName web3.escape.com
DocumentRoot "/vhosts/web3/htdocs"
3.2.3 基于主机名的虚拟主机
基于主机名的虚拟主机是根据客户端提交的
HTTP
头中标识主机名的部分决定的。因此多个虚拟主机可以共用同一个IP
地址来同时启用多个虚拟主机服务,但是需要设置DNS
,在DNS
中增加与虚拟主机名相对应得IP
地址。
注意事项
httpd2.2
中需要启用NameVirtualHost
指令,httpd2.4
中不再需要,且需要一致- 由于
SSL
协议的特性决定了基于名称的虚拟主机无法成为SSL
服务器,及时配置了SSL
,因为SSL
只能工作在独立的IP
地址上,不允许多个Web
站点公用同一个IP
地址 - 配置基于主机名的虚拟主机需要设置对于主机名的
DNS
解析,如果不设置使用IP
地址就只能访问到第一个虚拟主机了。本机测试通过修改本机的hosts
文件,即可达到同样效果
(1) 设置DNS
解析
# 本机的hosts文件达到DNS进行解析的效果
$ vim /etc/hosts
172.16.100.6 web1.escape.com
172.16.100.6 web2.escape.com
172.16.100.6 web3.escape.com
(2) 设置NameVirtualHost
指令
# 三种选其一即可,通常指定IP地址配置
# 服务器监听在本机的所有IP地址的80端口上
NameVirtualHost *:80
# 服务器监听在本机172.16.100.6的80端口上
NameVirtualHost 172.16.100.6:80
# 服务器监听在本机IPv6地址的80端口上
NameVirtualHost [fe80::20c:29ff:feae:471b]:80
(3) 设置虚拟主机配置
# 使用httpd -S检测语法错误,没有问题重启服务器即可生效
ServerName web1.escape.com
DocumentRoot "/vhosts/web1/htdocs"
ServerName web2.escape.com
DocumentRoot "/vhosts/web2/htdocs"
ServerName web3.escape.com
DocumentRoot "/vhosts/web3/htdocs"
3.3 动态虚拟主机
3.3.1 vhost_alias_mudule
模块
通常使用上述三种方式就可以满足大多数人的需求,但是对于服务器剧情或者
ISP
提供者来说,一个物理服务器可能提供上百上千个Web
站点都是正常的。这里虚拟主机通常都是基于名称的,每个主机都有自己的主机名和DNS
记录,对于动态的虚拟主机,Apache
提供了vhost_alias_mudule
模块来满足需求。
vhost_alias_mudule
模块提供了四个指令用来生成虚拟主机
生成虚拟主机指令
- 基于名称
VirtualDocumentRoot
VirtualScriptAlias
- 基于
IP
地址VirtualDocumentRootIP
VirtualScriptAliasIP
指令含义
分类符号
- 上面的四个指令都是通过分类符来从
URL
中获取标记,并将标记作为VirtualDocumentRoot
或是VirtualScriptAlias
的路径,以供Apache
来生成虚拟主机
实例说明
UseCanonicalName
指令
# 会将ServerName这个域名用于所有自引用URL、SERVER_NAME、CGI中的服务端口
UseCanonicalName on
# Apache将会由用户提供的主机名与端口信息来建立自引用URL,同时为客户端服务
UseCanonicalName off
# 为了那些基于IP地址的虚拟主机来支持那些不支持HTTP/1.1的浏览器所使用
# 使用此选项时,Apache将对客户端连入的服务器的IP地址进行反向DNS查询,建立自引用的URL
UseCanonicalName DNS
- 服务配置
# 当客户端使用http://www.jonsk.com:443/index.html访问时
# %1获取的是www,%2获取的是jonsk,%p获取的是443
# 于是VirtualDocumentRoot的路径就是/srv/www/vhosts/www/jonsk/443/index.html
UseCanonicalName off
VirtualDocumentRoot /srv/www/vhosts/%1/%2/%p
3.3.1 rewrite_module
模块
使用
vhost_alias_mudule
模块来建立大量的虚拟主机时非常方便的,但是他只能设置除了主机名外,其他配置完全相同的虚拟主机。而使用rewrite_module
模块建立大量虚拟主机不存在这个问题。
rewrite_module
模块通过正则表达式来重写URL
,因此也可以用来创建大量虚拟主机rewrite_module
模块因为使用正则表达式,所以性能上要低一些
# 当客户端使用http://www.jonsk.com访问时
# 通过正则表达式对所有进来请求的HTTP_HOST进行确认
# 然后过滤出www和com,再将匹配jonsk到/srv/www/jonsk目录中去
RewriteEngine on
RewriteConf %{HTTP_HOST} ^(WWW\.)?([^.]+).com$
RewriteRule ^(.*)$ /srv/www/%2$1
3.4 日志控制
Apache
用于记录服务器生成的信息,分为错误日志和访问日志。
Apache
的错误日志是由核心模块mod_core
提供的Apache
的错误日志是由核心模块lod_log_config
提供的,最好使用ECLF
格式记录
3.4.1 LogLevel
指令
- 通过
LogLevel
指令指定选用的日志级别
编号 | 日志级别 | 说明 |
---|---|---|
1 | debug |
调试信息 |
2 | info |
普通信息 |
3 | notice |
提示信息 |
4 | warn |
告警信息 |
5 | error |
一般信息 |
6 | crit |
关键信息 |
7 | alert |
马上需要处理的信息 |
8 | emerg |
致命的错误或者导致系统无法使用 |
# 定义错误日志记录级别
LogLevel warn
3.4.2 错误日志
- 使用
ErrorLog
指令定义存放的错误信息位置 - 相对于
/etc/httpd/logs
链接文件的/var/log/httpd
目录
# 错误log文件路径
ErrorLog logs/error_log
# 关闭错误文件
ErrorLog /dev/null
# 错误文件参数还可以是管道,可将日志送到一个处理器中,处理器可以是一个程序或者脚本
ErrorLog "|/usr/local/bin/httpd_errors"
3.4.3 访问日志
CustomLog
指令:定义访问日志文件和格式CustomLog logs/access_log combined
LogFormat
指令:定义访问日志格式保存格式LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
3.4.4 日志循环
如果访问量巨大的Apache
服务器上,日志文件会变的很大。因此需要对日志以时间为单位进行循环处理,借用管道将日志送入外部的日志处理程序进行日志的循环处理,Apache
本身并不处理。
手动处理
$ mv /var/log/httpd/access.log /var/log/httpd/access.log.20171111
$ apachectl graceful
自动处理
Apache
自身提供了一个日志循环工具rotatelogs
,以秒为单位
# 访问日志,以24小时进行一次分割需要设置86400
CustomLog "|/usr/local/apache/bin/rotatelogs logs/access_log_%Y_%m_%d 86400 480" combined
# 错误日志,以24小时进行一次分割需要设置86400
ErrorLog "|/usr/local/apache/bin/rotatelogs logs/access_log_%Y_%m_%d 86400 480"
3.4.5 syslog
来控制和存储日志
Apache
除了使用自身的日志外,还可以使用syslog
、syslog-ng
等日志服务来存储日志。syslog
不但提供内核日志功能,还可以为各种程序通过syslogd
来进行日志记录,默认情况下Apache
使用local7
工具,可以在/etc/syslog.conf
文件中进行定义。
# 编辑syslog配置文件,星号在这里指本项服务生产的所有日志消息都发送到指定文件中
$ vim /etc/syslog.conf
local.* /var/log/apache_log
# httpd.conf文件中配置,二选一
ErrorLog syslog
ErrorLog syslog:local7
# 重启httpd服务
$ apachctl restart
3.4.6 跟踪用户日志
Apache
日志处理监控服务是否正常以外,还可以记录用户的访问记录,并对记录进行分析。如分析用户在那个页面停留的时间最长、最关心那些商品等。使用cookie
技术能够追踪用户信息。
Apache
提供mod_cookies
模块对cookie
进行支持Apache
提供mod_usertrack
模块用来专门控制cookie
- 在负载均衡时
Apache
无法保持会话,因此需要将所有主机的CookieName
的值保持一致。
启用cookie
功能
CustomLog /var/log/apache/cookie_log "%{cookie}n %r %t"
mod_usertrack
模块
CookieTracking
指令用来开启cookie
跟踪功能CookieName
指令用于修改cookie
名称,cookie
默认使用Apache
作为名称CookieExpires
指令用于指定cookie
的有效时间,单位默认为秒CookieStyle
指令用于设置cookie
类型CookieDomain
指令用于设置cookie
的作用域
# 加载模块
LoadModule usertrack_module lib/apache/mod_usertrack.so
# 开启cookie跟踪功能
CookieTracking on
# 修改cookie名称
CookieName .escape.com
# 设置cookie有效时间
CookieExpires 300
CookieExpires "3 days"
# 设置cookie类型
CookieStyle Cookie
CookieStyle Cookie2
CookieStyle Netscape
# 设置cookie的作用域
CookieDomain .escape.com
# 日志中记录cookie
# 记录从客户端收到的cookie,使用的cookie类型不同
CustomLog log/cookies_in.log "%{UNIQUE_ID}e %{Cookie}i"
CustomLog log/cookies2_in.log "%{UNIQUE_ID}e %{Cookie2}i"
# 记录从服务器发送的cookie,使用的cookie类型不同
CustomLog log/cookies_out.log "%{UNIQUE_ID}e %{Cookie}i"
CustomLog log/cookies2_out.log "%{UNIQUE_ID}e %{Cookie2}i"
3.4.7 日志分析软件
Webalizer
- 介绍
Webalizer
是C
语言编写的,能够处理CLF
、ECLF
、W3C
扩展格式的日志分析软件
- 优点
- 支持中文
- 提供大量的配置选项来生成报表
- 支持直接以
gzip
或者bzip2
压缩的日志文件 - 对于日志没有大小的显示,支持
IPv4
、IPv6
地址和地理定位
# 编译安装
$ Webalizer /var/log/apache/access.log
Awstats
- 介绍
Awstats
是一套Perl
编写的免费日志分析工具,可以为网络、流媒体等服务提供数据统计功能
- 优点
- 支持中文
- 运行速度快
- 提供大量的配置选项来生成报表
- 可以使用命令行或者是页面的形式查看分析日志
# 在awstats.conf文件中配置主机名或者IP地址
SiteDomain=192.168.31.94
DirDate="/var/lob/awstats"
# 打开awstats分析页面
http://localhost/awstats/swstats.pl
3.4.8 合并虚拟主机日志
- 虚拟主机中配置错误日志和访问日志
ServerName www.escape.com
DocumentRoot "srv/www"
ErrorLog /var/log/apache/error_log_www.escape.com
CustomLog /var/log/apache/access_log_www.escape.com
- 合并方法
# 在httpd.conf配置vhost,在虚拟主机配置中进行引入
CustomLog "%h %l %u %t \"%r\" %>s %b" vhost
3.5 支持SSL
功能
在默认情况下,
Apache
通常使用明文直接在网络上传输数据,这样虽然可以减轻服务器压力,但是很容易泄露用户信息。为了保证数据在传输的时候不会被改变和监听,我们使用安全套接字层协议(SSL
)标准,对通信进行加密。
SSL
协议是基于OpenSSL
的加密协议,采用公开秘钥进行加密- 所以的传输数据都是加密传输,像
FTP
、HTTP
等协议能透过地建立与SSL
协议之上Apache
提供mod_ssl
模块提供对于SSL
协议的支持
3.5.1 SSL
的简单会话过程
(1) 客户端发送可供选择的加密方式,并向服务器请求证书;
(2) 服务器端发送证书以及选定的加密方式给客户端;
(3) 客户端取得证书并进行证书验证:
如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;
(b) 验正证书的内容的合法性:完整性验正
(c) 检查证书的有效期限;
(d) 检查证书是否被吊销;
(e) 证书中拥有者的名字,与访问的目标主机要一致;
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
(5) 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
3.5.2 安装mod_ssl
模块
- 在安装
mod_ssl
模块之前先确认已经安装了OpenSSL
库 - 在
CentOS
中,通过yum
安装默认都已经编译了ssl
功能,只需要启用即可
# 只需要在编译时加上--enable-ssl参数即可启用mod_ssl模块
$ ./configure --prefix=/usr/local/httpd-2.4.21-ssl -enable-sshl
# 编译、测试、安装
$ make
$ make test
$ make install
3.5.3 签发证书
在启用
SSL
需要数字证书,这个证书将会用来加密所有使用SSL
协议传输的数据。
- 推荐使用
OpenSSL
所提供的CA.pl
或CA.sh
工具来建立自己的证书,还可以使用OpenSSL
命令生成证书- 小范围测试使用
OpenSSL
,大范围维护大量证书企业使用OpenCA
工具- 点击获取更多使用信息:OpenSSL 实现创建私有 CA、签署证书请求详解
证书
- 主证书即顶级
CA
证书用于签发服务器和客户端证书 - 服务器证书主要用于标识服务器并加密所有传输的数据
- 客户端证书主要用于对客户端的身份认证
商业证书机构
OpenSSL
配置
- 配置文件地址
/etc/pki/tls/openssl.cnf
- 如下所示为
openssl.cnf
文件配置段内容摘要
[root@MiWiFi-R3-srv ~]# cat /etc/pki/tls/openssl.cnf
# OpenSSL example configuration file.
# This is mostly being used for generation of certificate requests.
######################################################################################
[ ca ] # CA相关配置段
default_ca = CA_default # 默认CA在[CA_default]配置
######################################################################################
[ CA_default ] # 默认当做CA的工作环境
dir = /etc/pki/CA # 默认的工作目录,变量形式
certs = $dir/certs # 默认的签发的证书位置
crl_dir = $dir/crl # 默认的吊销的证书位置
database = $dir/index.txt # 默认的颁发过的证书索引文件
new_certs_dir = $dir/newcerts # 默认的签署证书位置
certificate = $dir/cacert.pem # 指明CA的自签证书
serial = $dir/serial # 指明当前证书序列号,第一次要指定
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem # CA自己的私钥
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
default_days = 365 # 证书的默认有效期
default_crl_days = 30 # 默认声明有效期
default_md = sha256 # 默认的生成算法
preserve = no # keep passed DN ordering
####################################################################
[ req ] # 向CA证书签署发起注册请求相关属性
default_bits = 2048
default_md = sha256
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
(1)生成顶级CA
证书(192.168.31.6
)
- 这里使用
OpenSSL
命令生成CA
证书 - 在确定配置为
CA
的服务器主机上生成一个自签证书,并为CA
提供所需要的目录及文件 - 在真正的通信过程中
CA
服务器主机不需要网络参与,只需要参与到签名中,不需要提供服务
[root@MiWiFi-R3-srv ~]# cd /etc/pki/CA
# 生成CA私钥,cakey.pem
# 因为在默认配置文件中默认配置/etc/pki/CA/private/cakey.pem,所以指定目录和文件名要和配置文件一致
# 将umask命令进行包裹起来使其适用范围仅在括号中,生成CA私钥需要有权限规定
# 适用des3加密的方式,如果不指定使用默认的加密方式,不需要输入密码短语
[root@MiWiFi-R3-srv CA]# (umask 077; openssl genrsa -des3 -out /etc/pki/CA/private/cakey.pem 2048)
Generating RSA private key, 1024 bit long modulus
...++++++
..............++++++
e is 65537 (0x10001)
Enter pass phrase for ca/cakey.key: # 输入密码短语
Verifying - Enter pass phrase for ca/cakey.key: # 再次输入密码短语
# 生成CA自签证书,cakey.pem
# req: 证书请求及生成工具
# -new: 生成新证书签署请求
# -x509: 专用于创建私有CA时,生成自签格式证书,非自签无需增加此参数
# -key: 指明的是私钥的位置,因为此处会自动抽取出私钥中的公钥
# -out: 生成的请求文件路径;如果自签操作将直接生成签署过的证书
# -days: 证书的有效时长,单位是day
[root@MiWiFi-R3-srv CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out
Enter pass phrase for ca/cakey.key: # 输入密码短语
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN # 两个字符表示的国家代码,CN为中国
State or Province Name (full name) []:Beijing # 输入省份名称
Locality Name (eg, city) [Default City]:Beijing # 输入城市名称
Organization Name (eg, company) [Default Company Ltd]:cn # 组织机构名称(默认为公司)
Organizational Unit Name (eg, section) []:cn # 组织机构单元名称(eg.部门)
Common Name (eg, your name or your server's hostname) []:escape # 持有者名或者所在服务器主机名,即域名
Email Address []:[email protected] # 输入电子邮箱地址,可以省略
# 为CA提供所需的目录及文件
# /etc/pki/CA/certs为创建签发证书
# /etc/pki/CA/crl为吊销证书
# /etc/pki/CA/newcerts为新证书目录
# 创建证书序列号文件、证书索引文件
[root@MiWiFi-R3-srv CA]# touch /etc/pki/CA/index.txt
# 第一次创建的时候需要给予证书序列号
[root@MiWiFi-R3-srv CA]# echo "01" > /etc/pki/CA/serial
(2)生成服务器证书(192.168.31.7
)
- 服务器申请证书签署实现
SSL
安全通信 - 要用到证书进行安全通信的服务器,需要向
CA
请求签署证书 - 需要签署的服务无需和
CA
证书签署机构主机在同一台服务器上
# 服务器端创建ssl目录
[root@MiWiFi-R3-srv ssl]# mkdir /etc/httpd/ssl
[root@MiWiFi-R3-srv ssl]# cd /etc/httpd/ssl
# 服务器生成私钥
[root@MiWiFi-R3-srv ssl]# (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
.........................+++
.............................................+++
e is 65537 (0x10001)
# 服务器生成证书签署请求
# *.csr表示证书签署请求文件
# 输入内容要保证和签署机构CA签署机构信息一致
[root@MiWiFi-R3-srv ssl]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:cn
Organizational Unit Name (eg, section) []:cn
Common Name (eg, your name or your server's hostname) []:www.escape.com
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:escape
An optional company name []:cn
# 将请求通过可靠方式发送给CA主机
[root@MiWiFi-R3-srv ssl]# scp /etc/httpd/ssl/httpd.csr [email protected]:/tmp/
# 在CA主机上签署证书
# *.crt表示证书文件
# 此处需要自己去查看信息是否正确,并确定是否给予签署证书
[root@MiWiFi-R3-srv ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Dec 2 02:57:06 2017 GMT
Not After : Dec 2 02:57:06 2018 GMT
Subject:
countryName = CN
stateOrProvinceName = Beijing
organizationName = cn
organizationalUnitName = cn
commonName = www.escape.com
emailAddress = [email protected]
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
A6:FF:C8:AC:7F:72:A1:01:81:5E:72:81:33:E2:A1:37:09:A3:4F:CF
X509v3 Authority Key Identifier:
keyid:E0:F5:88:3F:84:02:CD:C3:CE:14:D7:20:39:63:F8:AC:75:53:C9:7B
Certificate is to be certified until Dec 2 02:57:06 2018 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
# 查看所签署的证书信息
# 【方式一】查看索引文件
# V表示已经签署的,01表示证书序列号,/C=CN/ST=Beijing/O=… ...表示主题信息(主题标示)
[root@MiWiFi-R3-srv ~]# cat /etc/pki/CA/index.txt
V 181202025706Z 01 unknown /C=CN/ST=Beijng/O=cn/OU=cn/CN=www.escape.com/emailAddress=[email protected]
# 【方式二】查看证书中的信息(CA或者服务端均可)
# -serial表示序列号 -subject表示主题信息
[root@MiWiFi-R3-srv ~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject serial=01
subject=/C=CN/ST=Beijng/O=cn/OU=cn/CN=www.escape.com/emailAddress=[email protected]
# 将CA签署机构的.crt证书发送给服务器
[root@MiWiFi-R3-srv ~]# scp /etc/pki/CA/certs/httpd.crt [email protected]:/etc/httpd/ssl
# 删除服务器和CA主机上签署前的*.csr文件,确保安全
CA主机 ==> rm -rf /tmp/httpd.csr
httpd主机 ==> rm -rf /etc/httpd/ssl/httpd.csr
(3)生成客户端证书
- 签发方式和服务器端的一致,使用上述方式即可获取客户端
SSL
证书 - 为了方便客户端的安装和使用,将客户端
client.crt
转换为pkcs12
格式
# 将客户端client.crt转换为pkcs12格式
[root@MiWiFi-R3-srv ~]# openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.pfx
- 把 windows 中用 pfx 证书转为 appache/nginx 用到 key 和 crt 组成的证书
- Setup SSL using .PFX file on nginx/apache2
-nocerts
=> No certificates at all will be output.-clcerts
=> Only output client certificates (not CA certificates).-nokeys
=> No private keys will be output.-nodes
=> Don’t encrypt the private keys at all.
# pfx文件是受密码保护的证书档案,其中包含您的证书和私钥。
# 生成RSA信息
$ openssl pkcs12 -in ./YOUR-PFX-FILE.pfx -nocerts -nodes -out domain.private.rsa
# 生成CRT信息(删除domain.public.crt和domain.bundle.crt临时文件)
$ openssl pkcs12 -in ./YOUR-PFX-FILE.pfx -clcerts -nokeys -out domain.public.crt
$ openssl pkcs12 -in ./YOUR-PFX-FILE.pfx -cacerts -out domain.bundle.crt
$ cat domain.public.crt domain.bundle.crt > domain.crt
# 生成解密后的KEY信息(删除domain.encrypted.key临时文件)
# 这个domain.encrypted.key也可以称之为domain.encrypted.pem
$ openssl pkcs12 -in ./YOUR-PFX-FILE.pfx -nocerts -out domain.encrypted.key
$ openssl rsa -in domain.encrypted.key -out domain.key
# 授权(需要时操作)
$ sudo chmod 600 domain.*
$ sudo chown root:root domain.tld.*
# 对应如下Nginx配置
server {
listen 443 ssl;
server_name domain.com;
ssl_certificate /path/to/your/domain.chained.crt;
ssl_certificate_key /path/to/your/domain.decrypt.key;
# ssl_certificate_key /path/to/your/domain.private.rsa;
root /mnt/www/nginx;
index index.html;
}
3.5.4 配置启用SSL
功能
# 配置httpd支持使用ssl功能
$ yum -y install mod_ssl
$ httpd -M | grep ssl
$ rpm -ql mod_ssl
# 修改SSL配置文件,/etc/httpd/conf.d/ssl.conf(二进制安装)
# 全局配置
Listen 443 # 监听443端口
AddType application/x-x509-ca-cert .crt # 定义以.crt后缀的文件为证书文件
AddType application/x-pkcs7-crl .crl # 定义以.crl后缀的文件为证书文件
SSLPassPhraseDialog builtin # 定义SSL在启动时使用哪种方式对私钥文件进行解密
# 虚拟主机配置
SSLEngine on # 是否启用
SSLProtocol all -SSLv2 # 支持所有SSL协议但是除过SSLv2,因为不安全
SSLCertificateFile /etc/httpd/ssl/httpd.crt # 设置证书文件位置
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key # 设置私钥文件位置
DocumentRoot "/vhosts/www/htdocs" # 提供页面服务的目录
ServerName 192.168.31.7 # 设置服务器名称,建议使用IP地址而非域名
ServerAdmin [email protected] # 设置邮件地址
ErrorLog "/vhosts/www/htdocs/logs/error_log" # 设置错误日志位置
TransferLog "/vhosts/www/htdocs/logs/access_log" # 设置访问日志位置
SSLOptions +StdEnvVars # 启动对cgi-bin目录的支持
# 重启httpd服务,会需要输入密码短语
# 如果客户端连接服务器,提示该网站的安全证书不受信任,这是因为证书使我们自己签发的
./apachectl restart
# 测试基于https访问相应的主机; 192.168.31.7
$ openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
eg: openssl s_client -connect 192.168.31.7:443 -CAfile 192.168.31.7:/etc/pki/CA/cacert.pem
3.5.5 配置使用客户端证书认证
上节中,我们只是通过Apache
服务器来进行数据加密认证的,如果需要对客户身份使用证书验证,则需要在ssl.conf
文件中对其进行配置,即可实现SSL
的双向认证机制。
# 配置ssl.conf文件,重启httpd服务
SSLVerifyClient require
SSLVerifyDepth 1
4. 身份认证
Apache
在用户认证方面提供了大量的认证模块,有15
个之多,提供了很多特性和支持。
- 认证类型模块:提供认证用户身份信息的功能
- 认证支持模块:为服务器使用第三方认证软件的支持
- 授权支持模块:会判断通过认证的用户是否属于特定组而允许或拒绝访问受限文件或目录
- 身份认证模块分类
编号 | 模块类型 | 模块名称 | 介绍模块功能 | 配置中参数 |
---|---|---|---|---|
1 | 认证类型模块 | mod_auth_basic |
使用明文认证用户身份 | - |
2 | 认证类型模块 | mod_auth_digest |
使用MD5 摘要认证身份 |
- |
3 | 认证支持模块 | mod_authn_alias |
为用户别名认证提供支持 | - |
4 | 认证支持模块 | mod_authn_anon |
为匿名用户认证提供支持 | - |
5 | 认证支持模块 | mod_authn_dbd |
为认证提供SQL 数据库支持 |
dbd |
6 | 认证支持模块 | mod_authn_dbm |
为认证提供DBM 数据库支持 |
dbm |
7 | 认证支持模块 | mod_authn_file |
使用纯文本文件未认证提供支持 | file |
8 | 认证支持模块 | mod_authn_default |
在未正确配置认证模块的情况下拒绝一切认证信息 | - |
9 | 认证支持模块 | mod_authnz_ldap |
为认证提供LDAP 服务的支持 |
ldap |
10 | 授权支持模块 | mod_authnz_ldap |
为认证提供LDAP 服务的支持 |
- |
11 | 授权支持模块 | mod_authz_dbm |
使用DBM 数据库为组提供认证支持 |
- |
12 | 授权支持模块 | mod_authz_groupfile |
使用纯文本为用户组提供认证支持 | - |
13 | 授权支持模块 | mod_authz_owner |
基于文件的所有者进行认证 | - |
14 | 授权支持模块 | mod_authz_user |
为每个用户提供认证支持 | - |
15 | 授权支持模块 | mod_authz_default |
在未正确配置认证模块的情况下拒绝一切授权请求 | - |
16 | 基于系统的访问控制 | mod_authz_host |
基于主机名、IP 地址、请求特征的认证提供支持 |
- |
- 如果使用
Apache
进行基于用户账号的认证/授权时,必须在这三大类中至少选择一个,否则无法正常工作
4.1 认证类型模块
在
Apache
中,mod_auth_digest
模块除了可以完成mod_auth_basic
模块的认证功能以外,还可以使用MD5
摘要认证,更加安全和可靠。
mod_auth_basic
模块
- 介绍
mod_auth_basic
模块需要认证支持模块的协助下才能实现HTTP
的基本认证- 对该模块支持的认证支持模块有:
mod_authn_dbd
/mod_authn_dbm
/mod_authn_file
/mod_authnz_ldap
- 四种认证支持模块至少选择一种
- 指令
AuthBasicProvide
指令用于设置该区域的认证方式,即上面提及的四种认证支持模块AuthBasicAuthoriative
指令用于决定由AuthBasicProvide
所指的认证方式失败后,是否将认证与授权交由第三方模块进行处理,默认为on
表示开启,即当认证失败后禁止访问,如果设置为off
则交由第三方模块处理
# 使用mod_authn_file模块的方式
# 指定需要控制的文件目录
Options None
AllowOverride None
AuthType Basic # 认证类型
AuthName "STRING" # 认证提示信息
AuthBasicProvide file # 认证支持模块
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" # 用户认证文件
Require user username1 username2 ... # 可选,需要哪些用户可以登录
# 使用mod_auth_basic模块和mod_authn_dbm模块联合认证
AuthType Basic # 认证类型
AuthName "STRING"
AuthBasicProvide dbm # 支持mod_authn_dbm模块作为认证与授权方式
AuthDBMType SDBM # 定义存放密码的数据库文件为SDBM
AuthDBMUserFile /www/etc/dbmpasswd # 存放位置为/www/etc/dbmpasswd
Require valid-user # 指定所以用户如果通过认证都可以访问secure目录
mod_auth_digest
模块
- 介绍
mod_auth_digest
模块需要认证支持模块的协助下才能实现HTTP
的基本认证- 对该模块支持的认证支持模块有:
mod_authn_dbd
/mod_authn_dbm
/mod_authn_file
/mod_authnz_ldap
- 四种认证支持模块至少选择一种
- 指令
AuthDigestDomain
指令用于指定一个或多个在同一保护区域中需要进行摘要认证的URI
AuthDigestNonceLifetime
指令用于设置服务器超时时间,超过时重新认证,推荐60-600
之间AuthDigestProvider
指令用于指定认证支持模块AuthDigestShmemSize
指令用于设置服务器在追踪客户端可以使用的共享内存字节数,可以使用KB
/MB
# 使用mod_auth_digest模块和mod_authn_file模块联合认证
AuthType Digest # 认证类型
AuthName "private area" # 认证提示信息
# 指定需要保护的区域为http://mirror.my.dom/secure
AuthDigestDomain /secure/ http://mirror.my.dom/secure
AuthDigestProvide file # 支持mod_authn_file模块作为认证与授权方式
AuthUserFile /www/etc/password # 密码存放位置
Require valid-user # 指定所以用户如果通过认证都可以访问secure目录
4.2 认证支持模块
这里只对比较重要的认证支持模块进行说明
mod_authn_dbd
模块
- 介绍
- 可以为
mod_auth_basic
模块和mod_auth_digest
模块提供SQL
数据库进行身份认证功能
- 可以为
- 启用需求
- 在
mod_auth_basic
模块或mod_auth_digest
模块中指定使用mod_authn_dbd
模块的认证支持 - 需要使用
mod_dbd
模块提供一个后端数据库驱动程序和数据库连接为mod_authn_dbd
模块提供支持
- 在
- 指令
AuthDBDUserPWQuery
指令用于设置搜索用户密码的SQL
查询语句AuthDBDUserRealmQuery
指令用于同时为用户名和认证区域的密码进行SQL
查询,是两个查询
# AuthDBDUserPWQuery使用范例
AuthDBDUserPWQuery "SELECT password FORM authn WHERE username = %s"
# AuthDBDUserRealmQuery使用范例
AuthDBDUserRealmQuery "SELECT password FROM authn WHERE username = %s AND realm = %s"
# 演示效果
DBDriver pgsql # 使用的数据库
DBDParams "dbname=htpasswd user=Apache password=xxxxxx" # 数据库名称、用户名、密码
DBDMin 1 # 最小连接数
DBDMax 10 # 最大连接数
DBDKeep 2
DBDExptime 60 # 超时时间
AuthType Basic # 认证类型
AuthName "Server" # 认证提示信息
AuthBasicProvide dbd # 认证支持模块
AuthDBDUserPWQuery "SELECT password FORM authn WHERE username = %s"
Require valid-user # 可选,需要哪些用户可以登录
4.2 认证支持模块
这里只对比较重要的认证支持模块进行说明
mod_authn_dbd
模块
- 介绍
- 可以为
mod_auth_basic
模块和mod_auth_digest
模块提供SQL
数据库进行身份认证功能
- 可以为
- 启用需求
- 在
mod_auth_basic
模块或mod_auth_digest
模块中指定使用mod_authn_dbd
模块的认证支持 - 需要使用
mod_dbd
模块提供一个后端数据库驱动程序和数据库连接为mod_authn_dbd
模块提供支持
- 在
- 指令
AuthDBDUserPWQuery
指令用于设置搜索用户密码的SQL
查询语句AuthDBDUserRealmQuery
指令用于同时为用户名和认证区域的密码进行SQL
查询,是两个查询
# 定义存放密码的数据库文件为SDBM
AuthDBMType SDBM
# 存放位置为/www/etc/dbmpasswd
AuthDBMUserFile /www/etc/dbmpasswd
- dbmmanage 程序
# 增加一个用户
$ dbmmanage .htpasswd_SDBM adduser escape
# 查看数据库文件内容
$ dbmmanage .htpasswd_SDBM view
# 更新用户密码
$ dbmmanage .htpasswd_SDBM update escape
# 从数据库中删除用户
$ dbmmanage .htpasswd_SDBM delete escape
mod_authn_file
模块
- 介绍
- 可以为
mod_auth_basic
模块和mod_auth_digest
模块提供纯文本文件的认证方式 - 只需要将用户名和密码存储在一个纯文本文件中,就可以使用了
- 可以为
- 创建工具
- 对于
mod_auth_digest
模块,可以使用Apache
提供的htpasswd
程序来创建和修改密码 - 对于
mod_auth_digest
模块,可以使用Apache
提供的htdigest
程序来创建和修改密码
- 对于
- 指令
AuthUserFile
指令用于指定文本文件的路径和名称
# 指定需要控制的文件目录
AuthType Basic # 认证类型
AuthName "file" # 认证提示信息
AuthBasicProvide file # 认证支持模块
AuthUserFile /usr/local/auth/passwd # 用户认证文件
Require user escape bob tom peter # 可选,需要哪些用户可以登录
htpasswd
程序
# 创建一个新的密码文件并增加一个名为escape的用户
$ htpasswd -c .htpasswd escape
# 从.htpasswd文件中删除escape用户
$ htpasswd -D .htpasswd escape
# 更新escape用户密码
$ htpasswd .htpasswd escape
# 查看文件内容
$ cat .htpasswd
escape:DHOILmkDkQTDs
htdigest
程序
# 创建一个新的密码文件并增加一个名为escape的用户
$ htdigest -c .htpasswd "htdocs" escape
# 更新escape用户密码
$ htdigest .htpasswd escape
# 查看文件内容
$ cat .htpasswd
escape:ce5432DHOILmkDkQTDs9992dsx
4.3 授权支持模块
这里只对比较重要的授权支持模块进行说明
- 授权支持模块的作用是为那些通过用户身份认证的用户或组提供访问授权
- 授权支持模块必须依赖于之前的身份认证模块进行身份认证
mod_authz_dbm
模块
- 特点
- 通过使用
DBM
数据库文件为组提供授权支持功能 - 可以使用
SDBM
、GDBM
、NDBM
、DB
四种数据库类型的文件来存放用户组和密码 - 数据库文件格式:
加密密码 : 组名单
- 通过使用
- 指令
AuthDBMType
指令用于设置数据库类型AuthDBMGroupFile
指令用于设置用户组和密码文件的位置AuthzDBMAuthoritative
指令用于设置当认证失败时,是否将授权操作交给更底层的模块来处理,推荐使用on
开启禁止传递下去
# 使用类型
AuthDBMType SDBM
# 设置用户组文件的位置
AuthDBMGroupFile /www/userbase
# /www/userbase文件内容
加密密码:组名单
mod_authz_groupfile
模块
- 特点
- 类似于
mod_authz_dbm
模块,但是mod_authz_groupfile
模块只能提供基于文本文件的存储方式,文本授权
- 类似于
- 指令
AuthGroupFile
指令用于设置用户组的纯文本文件位置AuthzGroupAuthoritative
指令用于设置当认证失败时,是否将授权操作交给更底层的模块来处理,推荐使用on
开启禁止传递下去
# 设置用户组文件的位置
AuthGroupFile /www/groupbase
# /www/groupbase文件内容
mygroup: bob jery
admin: escape
mod_authz_owner
模块
- 特点
- 根据文件所有者的身份来提供相应的授权
- 两种授权方式:一是根据文件所有者的身份授权,二是根据文件所有者的组授权
- 指令
AuthzOwnerAuthoritative
指令用于设置当认证失败时,是否将授权操作交给更底层的模块来处理,推荐使用on
开启禁止传递下去
# 基于文件所有者的身份授权,file-owner
<Directory /home/*/public_html/private>
AuthType Basic
AuthName "My Private Files"
AuthBasicProvider dbm
AuthDBMUserFile /usr/local/etc/.htdbm-all
Satisfy All
require file-owner
</Directory>
# 基于文件所有者的组授权,file-group
<Directory /home/*/public_html/private>
AuthType Basic
AuthName "My Private Files"
AuthBasicProvider dbm
AuthDBMUserFile /usr/local/etc/.htdbm-all
AuthDBMGroupFile /usr/local/etc/.htdbm-all
Satisfy All
require file-group
</Directory>
mod_authz_user
模块
- 特点
- 可以允许或拒绝经过认真的用户访问受保护区域
- 两种授权方式:一是根据在
Require user
中列出的用户对访问进行控制,二是根据Require valid-user
指令简单允许所有成功通过认证的用户进行访问
- 指令
AuthzUserAuthoritative
指令用于设置当认证失败时,是否将授权操作交给更底层的模块来处理,推荐使用on
开启禁止传递下去
# 列出的用户可以进行受限资源的访问
Require user
# 允许所有成功通过认证的用户进行访问
Require valid-user
4.4 mod_authz_host
模块
mod_authz_host
模块是在Apache
上使用最多的限制用户访问的模块,由于它实现了基于主机名、IP
地址、请求特征的访问控制,因此它不属于三大认证模块的任何一部分。
mod_authz_host
模块提供三个指令:Allow
指令、Deny
指令、Order
指令- 提供的指令可以直接在
<Directory>
、<Files>
、<Location>
和.htaccess
文件中使用
三个指令
Allow
指令用于指定那些客户允许访问Deny
指令用于指定那些客户不允许访问Order
指令设置默认的访问状态并配置Allow
和Deny
指令指令的生效顺序,后者为默认机制
# 允许.com结尾的用户,拒绝192.168.31.111和www.escape.com用户
Allow from .com
Deny from 192.168.31.111
Deny from www.escape.com
# 使用主机名时,Apache会对每个客户端的IP地址进行两次DNS查询:
# 一次正向查询保证IP地址没有伪造
# 一次反向查询保证主机名没有伪造
# 只有当两次查询结果一致时,才会被允许访问
# 如果用户量很大,Apache会花大量时间在DNS查询上,所以不建议使用基于主机名进行访问控制
# 允许使用主机名、IP地址、网络地址、IPv6地址、环境变量等方式
Allow from 172.16.2.3
Allow from 10.1.0.0.16
Deny from 172.16.3.0/255.255.255.128
# 使用mod_setenvif提供的SetEnvIf指令定义浏览器类型进行过滤
SetEnvIf User-Agent ^KnockKnock/2\.0 let_me_in
<Directory /docroot>
Order Deny,Allow
Deny from All
Allow from env=let_me_in
</Directory>
# 黑名单,先执行Deny在执行Allow,所以172.16.2.3可以访问
Order Deny,Allow
Deny from all
Allow from 172.16.2.3
# 白名单,先执行Allow在执行Deny,所以172.16.2.3不能访问
Order Allow,Deny
Deny from all
Allow from 172.16.2.3
4.5 mod_authnz_ldap
模块
LDAP
是轻量级目录访问协议,它是一种有层次、树形结构的,如电话薄。它是以国家、省份、市区、单位的字母或笔画顺序排列的电话号码所组成。由于LDAP
是一种已经指定的数据结构的存储方式,并对查询进行了优化,因此它非常适合用户查询使用或者身份认证。
mod_authnz_ldap
模块提供用户的身份认证和授权
身份认证
- (1) 通过客户端提供的用户名与
AuthLDAPURL
指令以及设置的属性资料进行绑定 - (2) 绑定成功后搜索用户名,如果没有找到直接拒绝访问,如果找到获取
DN
(一组字符串)和密码 - (3) 使用获得的
DN
和密码进行第二次绑定,如果绑定成功则认证完成
授权访问
- (1)
LDAP
用户名,require ldap-user
- (2)
LDAP
组名,require ldap-group
- (3)
LDAP DN
- (4)
LDAP
属性 - (5)
LDAP
过滤器
5. 涉及的命令工具
5.1 curl
命令
curl
是基于URL
语法在命令行方式下工作的文件传输工具,它支持FTP
,HTTP
,HTTPS
, ,TELNET
等等协议,功能十分强大。
格式
curl [options] [URL...]
curl 的常用选项
-A/--user-agent <string>
:设置用户代理发送给服务器-basic
:使用HTTP
的basic
基本认证--tcp-nodelay
:使用TCP_NODELAY
选项-e/--referer <URL>
:来源网址--cacert <file>
:CA
证书 (SSL
)--compressed
:要求返回是压缩的格式-H/--header <line>
:自定义首部信息传递给服务器-I/--head
:只显示响应报文首部信息--limit-rate <rate>
:设置传输速度-u/--user <user[:password]>
:设置服务器的用户和密码-0/--http1.0
:使用 HTTP 1.0
5.2 压力测试工具
tcpcopy
是网易开发的一个分布式在线压力测试工具,将站点的请求进行镜像转发,生产环境的copy
。
压力测试工具介绍
编号 | 工具 | 特点 |
---|---|---|
1 | ab |
测试效果有限 |
2 | webbench |
测试效果有限 |
3 | http_load |
测试效果有限 |
4 | jmeter |
测试效果很棒,开源软件,需要自行编译执行流程 |
5 | loadrunner |
测试效果异常强大,专业级付费工具,需要自行编译执行流程 |
AB
测试服务器性能
- 格式
ab [OPTIONS] URL
- 参数
-n
表示总的请求数-c
表示模拟的并发数-k
表示以持久连接模式测试
- 注意事项
- 使用时,一般
n
大于c
- 如果模拟并发数
-c
过大,需要调整打开的文件数,使用ulimit -n #
命令
- 使用时,一般
$ ab -n 10000 -c 100 http://192.168.31.7/index.html