目录
引言
Apache HTTP Server 之所以受到众多企业的青睐,得益于其源代码开源,跨平台、功能模块化、可灵活定制等优点,其其不仅性能稳定,在安全性方面的表现也十分出色。
一、Apache 连接保持
-
HTTP 是属于应用层的面向对象协议,是基于 TCP 协议之上的可靠传输。每次在进行HTTP 连接之前,需要先进行TCP 连接,在 HTTP 连接结束后要对TCT 连接进行终止,每个 TCP 连接都需要进行三次握手与四次断开。HTTP协议不会对之前发生过的请求和响应进行管理,所以建立与关闭连接对于 HTTP 而言会消耗更多的内存与 CPU 资源。能不能允许通过同一个TCP 连接发出多个请求,从而减少与多个连接相关的延迟,解决办法就是连接保持。
-
对于 HTTP/1.1,就是尽量地保持客户端的连接,通过一个连接传送多个 HTTP 请求响应,对于客户端可以提高50%以上的响应时间,对于服务器可以降低资源开销。
-
Apache 通过设置配置文件 httpd-default.conf 中相关的连接保持参数来开启与控制连接保持功能。
① KeepAlive 决定是否打开连接保持功能,后面接 OFF 表示关闭,接 ON 表示打开。可以根据网站的并发请求量决定是否打开,即在高并发时打开连接保持功能,并发量不高时关闭此功能。
② KeepAliveTimeout 表示一次连接多次请求之间的最大间隔时间,即两次请求之间超过该时间,连接就会自动断开,从而避免客户端占用连接资源
③ 在一次长连接中可以传输的最大请求数量可以使用 MaxKeepAliveRequstes 设置,超过此最大请求数量就会断开连接。最大值的设置决定干网站中网页的内容,一般设置数量会多于网站中所有的元素。
二、Apache 的访问控制
为了更好地控制对网站资源的访问,可以为特定的网站目录添加访问授权。
1. 客户机地址限制
- 通过配置项 Order、Deny from、Allow from,可以根据客户机的主机名或 IP 地址来决定是否允许客户端访问。其中,Order 配置项用于设置限制顺序,Deny from 和 Allow from 配置项用于设置具体限制内容。
- Order 配置项可以设置为 “allow.deny” 或 “deny,allow”,以决定主机应用 “允许” 和 “拒绝” 策略的先后顺序。
allow,deny:先“允许”后“拒绝”,默认拒绝所有未明确允许的客户机地址。
deny,allow: 先“拒绝”后“允许”,默认允许所有未明确拒绝的客尸机地址。
- 使用 Allow from 和 Deny from 配置项时,需要设置客户机地址以构成完整的限制策略,地址的形式可以是 IP 地址、网络地址、主机名或域名,使用名称 “all” 时表示任意地址。限制策略的格式如下所示
Deny from address1 address2 ···
Allow from address1 address2 ···
- 通常情况下,网站服务器是对所有客户机开放的,网页文档目录并未做任何限制,因此使用的是"Allow from all”的策略,表示允许从任何客户机访问,策略格式如下所示
<Directory "/usr/local/httpd/htdocs">
……省略部分内容
Order allow,deny
Alow from all
</Directory>
- 需要使用 “仅允许” 的限制策略时,应将处理顺序改为“allow.deny”,并明确设置允许策略,只允许一部分主机访问。例如,若只希望网段192.168.0.0/24和192.168.1.0/24能够访问,则目录区域应做如下设置
<Directory "/usr/local/httpd/htdocs/wwwtest”>
……省略部分内容
Order allow,deny
Allow from 192.168.0.0/24 192.168.1.0/24
</Directory>
- 反之,需要使用 “仅拒绝” 的限制策略时,应将处理顺序改为“deny,allow",并明确设置拒绝策略,只禁止一部分主机访问。例如,若只希望禁止来自两个内网网段192.168.0.0/24和192.168.1.0/24的主机访问,但允许其他任何主机访问,可以使用如下限制策略
<Directory "/usr/local/httpd/htdocs/wwwroot”>
……省略部分内容
Order deny,allow
Deny from 192.168.0.0/24 192.168.1.0/24
</Directory>
- 当通过未被授权的客户机访问网站目录时,将会被拒绝访问
2. 用户授权控制
- httpd 服务器支持使用摘要认证(Digest)和基本认证(Basic)两种方式。使用摘要认证需要在编译 httpd 之前添加 “- -enable-auth-digest” 选项,但并不是所有的浏览器都支持摘要认证,而基本认证是 httpd 服务的基本功能,不需要预先配置特别的选项。
- 基于用户的访问控制包含认证(Authentication)和授权(Authorization)两个过程。认证是指识别用户身份的过程,授权是指允许特定用户访问特定目录区域的过程。
2.1 创建用户认证数据文件
-
httpd 的基本认证通过校验用户名、密码组合来判断是否允许用户访问。授权访问的用户账号需要事先建立,并保存在固定的数据文件中。
-
使用专门的 htpasswd 工具时,必须指定用户数据文件的位置,添加“-c”选项表示新建此文件。例如,执行以下操作可以新建数据文件/usr/local/httpd/conf/.awspwd,其中包含一个名为 webadmin 的用户信息。
[root@www~]# cd /usr/local/httpd/
[root@www httpd]# bin/htpasswd -c /usr/local/httpd/conf/.awspwd webadmin
New password: #根据提示设置密码
Re-type new password:
Adding password for user webadmin
[root@www httpd]# cat /usr/loeal/httpd/conf/.awspwd #确认用户数据文件
webadmin:2tmD3LVFynBAE
- 若省略“-c”选项,则表示指定的用户数据文件已经存在,用于添加新的用户或修改现有用户的密码。例如,需要向 .awspwd 数据文件中添加一个新用户 lisi 时,可以执行以下操作
[root@www httpd]# bin/htpasswd /usr/local/httpd/conf/.awspwd lisi
New password:
Re-type new password:
Adding password for user kece
[root@www httpd]# cat/usr/local/httpd/conf.awspwd #确认用户数据文件
webadmin:2tmD3LVFynBAE
lisi:In2Xw/KOGc.oA
2.2 添加用户授权配置
- 有了授权用户账号以后,还需要修改 httpd.conf 配置文件,在特定目录区域中添加授权配置,以启用基本认证并设置允许哪些用户访问。例加, 若只允许 .awspwd 数据文件中的某一用户访问系统,可以执行如下操作
[root@www~]#vim/usr/local/httpd/conf/httpd.conf
......
<Directory "/usr/local/httpd/htdocs/autest">
......
AuthName "Auth Directory"
AuthType Basic
AuthUserFile /usr/local/httpd/conf/.awspwd
require valid-user
</Directory>
[root@www- ]#/usr/local/httpd/bin/apachectl restart #重启服务使新配置生效
- 在上述配置中,相关配置项的含义如下:
① AuthName: 定义受保护的领域名称,该内容将在浏览器弹出的认证对话框中显示。
② AuthType: 设置认证的类型,Basic表示基本认证。
③ AuthUserFile: 设置用于保存用户账号、密码的认证文件路径。
④ require valid-user: 要求只有认证文件中的合法用户才能访问。其中,valid-user表示所有合法用户,,若只授权给单个用户,可改为指定的用户名,如 webadmin。
2.3 验证用户访问授权
当访问系统时,浏览器会首先弹出认证对话框,如下图所示。只有输入正确的用户名和密码才能查看日志分析报告,否则将会被拒绝访问。
三、Apache 日志分割
-
随着网站的访问量越来越大,默认情况下 Apache 服务器产生的单个日志文件也会越来越大,如果不对日志进行分割,那么日志文件占用磁盘空间很大的话势必会将整个日志文件删除,这样会丢失很多对网站比较宝贵的信息,而这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等。
-
另外,服务器遇到故障时,运维人员要打开日志文件进行分析,打开的过程会消耗很长时间,也势必会增加处理故障的时间。因此管理好这些海量的日志对网站的意义重大,我们会将 Apache 的日志按每天的日期进行自动分隔。
1. Apache 自带 rotatelogs 分割工具
- 使用 Apache 自带 rotatelogs 分割工具,将 Apache 的日志进行按每天的日期自动分割
vim /usr/local/httpd/conf/httpd.conf
#275行,修改
ErrorLog "| /usr/local/bin/rotatelogs -l /var/log/httpd/error_%Y%m%d.log 86400"
#分剖错误日志
#305行,修改
CustomLog "| /usr/local/bin/rotatelogs -l /var/log/httpd/accesss_%Y%m%d.log 86400"combined
#分割访问日志
#开头的|为管道符号。
#-l选项表示使用本地时间为时间基准
#86400表示一天,即每天生成一个新的日志文件
mkdir /var/log/httpd #创建分剖后的日志文件保存目录
systemctl restart httpd
ls /var/log/httpd #查看日志文件
2. 使用第三方工具 cronolog 分割
- 先解压源码包
tar zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
- 然后编译安装
./configure
make && make install
- 修改 Apache 的虚拟主机 httpd-vhost.conf 文件,将上面的内容修改为下面所示的内容:
<VirtualHost *:80>
ServerAdmin administrator@kqn.cn
DocumentRoot "/usr/local/apache/htdocs"
ServerName www.test.com
ErrorLog "/usr/local/sbin/cronolog /usr/local/apachelogs/www.test.com-error _%Y%m%d.log"
CustomLog " /usr/local sbin/cronolog /usr/local/apachelogs/www.test.com-access_ %Y%m%d.log"combined
</VirtualHost>
- 重启 Apache 服务,查看日志是否被分割
注意:Apache 写日志是根据文件的 i 节点,而不是文件名,所以有时候我们将Apache 日志文件重命名了,如果不重启 Apache 它还是会往重命名后的文件里面写入东西。
四、AWStats 日志分析
在 httpd 服务器的访问日志文件 access_log 中,记录了大量的客户机访问信息,通过分析这些信息,可以及时了解 Web 站点的访问情况,如每天或特定时间段的访问 IP 数量、点击量最大的页面等。
1. 部署 AWStats 分析系统
AWStats 是使用 Perl 语言开发的一款开源日志分析系统,它不仅可以用来分析Apache 网站服务器的访问日志,也可以用来完成自动化的日志统计与分析工作
- 安装 AWStats 软件包
cd /opt
tar zxvf awstats-7.6.tar.gz
mv /opt/awstats-7.6 /usr/local/awstats
- 为要统计的站点建立配置文件
#切换到awstats/tools目录下执行脚本
cd /usr/local/awstats/tools
./awstats_configure.pl
- 之后会进入一个交互式的配置过程,检测 awstats 的安装目录、httpd 服务的配置文件路径、日志记录格式等系统环境,并提示用户指定站点名称、设置配置文件路径
① 指定 httpd 主配置文件的路径
.....
Config file path ( 'none' to skip web server setup) :
>/usr/local/httpd/conf/httpd.conf #输入httpd服务主配置文件的路径
>Your web site, virtual server or profile name :
>www.xxx.com #输入要统计的站点域名
② 设置日志类型
将 httpd 服务器的日志记录格式改为“combined”,服务器可以在日志文件中记录更加详细的 Web 访问信息。因此,当提示是否修改日志类型时,建议选择“y”。然后配置脚本,将会自动修改 httpd.conf 配置文件,以添加访问 AWStats 系统的相关配置内容。
——>Check and complete web server config file 'usr/local/httpd/conf/httpd.conf'
Warming: You Apache config file contains directives to write 'common' log files
This means that some features can't work(os, browsers and keywords detection).
Do you want me to setup Apache to write 'combined log files [yN] ? y
Add 'Alias /awstatsclasses "/usr/local/awstats/wwwroot/classes/"'
Add 'Alias /awstatsess "/usr/local/awstats/wwwroot/ess/"'
Add 'Alias /awstatsicons "/usr/local/awstats/wwwroot/icon/"'
Add 'ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"'
Add '<Directory>' directive
AWStats directives added to Apache config file.
----> Update model config file '/usr/local/awstats/wwwroot/cgi-bin/awstats.model.conf'
File awstats.model.conf updated.
③ 为指定 Web 站点创建配置文件
- 根据提示继续选择 “y” 以创建站点配置文件,并指定要统计的目标网站名称、站点配置文件的存放位置(默认为/etc/awstats)
----> Need to create a new config file ?
Do you want me to build a new AWStats config/profile
file (required if first install) [y/N]? y #确认创建新的站点配置文件
-----> Define config file name to create
What is the name of your web site or profile analysis ?
Example: www.mysite.com
Example: demo
Your web site, virtual server or profile name
> www.xxx.com #指定要统计的目标网站名称
-----> Define config file path
In which directory do you plan to store your config file(s)?
Default:/etc/awstats
Directory path to store config file(s) (Enter for default): #直接按Enter键接受默认设置
>
-----> Create config file '/etc/awstats/awstats.www.bt.com.conf
Config file /etc/awstats/awstats.www.bt.com.conf created.
- 修改自动生成的 awstats访问权限
vim /usr/local/httpd/conf/httpd.conf
#275行左右
Errorlog "logs/error_log"
#303行左右
CustomLog "logs/access_log" combined
.......
----143行左右--------
<IfModule !mpm_prefork_module>
LoadModule cgid_module modules/mod_cgid.s #取消注释
</IfModule>
<IfModule mpm_prefork_module>
LoadModule cgi_module modules/mod_cgi.so #取消注释
</IfModule>
-----481行左右------
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf #将该行注释掉
#跳至末行修改
<Directory "/usr/local/awstats/wwwroot">
Options None
AllowOverride None
#Order allow,deny #注释
#Allow from all #注释
Require all granted #添加此行
</Directory>
- 修改站点统计配置文件
vim /etc/awstats/awstats.www.gcc.com.conf
LogFile="/usr/local/httpd/logs/access_log" #设置Web日志文件位置
DirData="/var/lib/awstats"
#DisData用来指定数据目录,可采用默认值,但是需要创建指定的目录
mkdir /var/lib/awstats
- 执行日志分析,并设置 cron 计划任务
由于 Web 日志文件的内容是在不断地更新的,为了及时反馈网站的访问情况,日志分析工作也要定期、自动的执行,通过 crond 服务可设置计划任务,一般建议每五分钟执行一次日志分析任务
systemctl restart httpd.service
cd /usr/local/awstats/tools/
./awstats_updateall.pl now #更新数据(根据站点配置文件指定的日志文件路径)
#设置定时任务进行刷新
crontab -e
*/5 * * * * /usr/local/awstats/tools/awstats_updateall.pl now
systemctl start crond
systemctl enable crond
2. 访问 AWStats 分析系统
- 访问站点后即可看到 AWStats 日志分析系统的统计页面,该页面分别按访问时间、用户来源、所用浏览器等类别分别列出各种详细的网站访问情况(若出现403 Forbidden 错误,关闭SELinux 即可正常访问)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
echo "192.168.8.132 www.xxx.com” >>etc/hosts
#浏览器访问
http://www.xxx.com/awstats/awstats.pl?config=www.xxx.com
- 优化网页地址
vim /usr/local/httpd/htdocs/aws.html
<html>
<head>
<meta http-equiv=refresh content="0;url=http:// www.kgc.com/awstats/awstats.pl?config=www.kgc.com">
</head>
<body></body>
</html>
HTML文件结构解释:
<html> </html> :用于HTML文件结构最外层表示的标签
<head> </head> :用于HTML网页内容描述信息的头标签
<body < / body> :用于显示网页内容的内容标签
<meta>:定义了HTML文档中的元数据,比如针对搜索引擎和更新频度的描述和关键词。这里的
http-equiv-refresh用于实现网页自动跳转
总结
- Apache 通过设置配置文件中相关的连接保持参数来开启与控制连接保持功能
- httpd 服务通过 Order、Allow from 、Deny from 配置项实现客户机地址访问控制
- 为网站目录设置用户授权时,需先通过htpasswd 工具创建用户认证数据文件。
- httpd 服务器的日志文件包括访问日志 access_log 与错误日志 error_log