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
[[email protected] ~]# 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模式 [[email protected] ~]# 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 [[email protected] ~]# 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) 压缩适于压缩的资源,例如文本文件、图片等效果显著
- 使用方法
- 复制如下内容到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文件配置段内容摘要
[[email protected] ~]# 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服务器主机不需要网络参与,只需要参与到签名中,不需要提供服务
[[email protected] ~]# cd /etc/pki/CA # 生成CA私钥,cakey.pem # 因为在默认配置文件中默认配置/etc/pki/CA/private/cakey.pem,所以指定目录和文件名要和配置文件一致 # 将umask命令进行包裹起来使其适用范围仅在括号中,生成CA私钥需要有权限规定 # 适用des3加密的方式,如果不指定使用默认的加密方式,不需要输入密码短语 [[email protected] 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 [[email protected] 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为新证书目录 # 创建证书序列号文件、证书索引文件 [[email protected] CA]# touch /etc/pki/CA/index.txt # 第一次创建的时候需要给予证书序列号 [[email protected] CA]# echo "01" > /etc/pki/CA/serial
(2)生成服务器证书(192.168.31.7)
- 服务器申请证书签署实现SSL安全通信
- 要用到证书进行安全通信的服务器,需要向CA请求签署证书
- 需要签署的服务无需和CA证书签署机构主机在同一台服务器上
# 服务器端创建ssl目录 [[email protected] ssl]# mkdir /etc/httpd/ssl [[email protected] ssl]# cd /etc/httpd/ssl # 服务器生成私钥 [[email protected] 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签署机构信息一致 [[email protected] 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主机 [[email protected] ssl]# scp /etc/httpd/ssl/httpd.csr [email protected]:/tmp/ # 在CA主机上签署证书 # *.crt表示证书文件 # 此处需要自己去查看信息是否正确,并确定是否给予签署证书 [[email protected] ~]# 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=… ...表示主题信息(主题标示) [[email protected] ~]# 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表示主题信息 [[email protected] ~]# 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证书发送给服务器 [[email protected] ~]# 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格式 [[email protected] ~]# 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