HTTP 是属于应用层的面向对象协议, 基于 TCP 协议之上的可靠传输。 每次在进行HTTP 连接之前, 需要先进行 TCP 连接, 在 HTTP 连接结束后要对 TCP 连接进行终止, 每个 TCP 连接都需要进行三次握手与四次断开。 HTTP 协议不会对之前发生过的请求和响应进行管理, 所以频繁地建立与关闭连接对于 HTTP 而言会消耗更多的内存与 CPU 资源。 能不能允许通过同一个TCP 连接发出多个请求, 从而减少与多个连接相关的延迟, 解决办法就是连接保持。
对于 HTTP/1.1, 就是尽量地保持客户端的连接, 通过一个连接传送多个 HTTP 请求响应, 对于客户端可以提高 50%以上的响应时间, 对于服务器可以降低资源开销。
Apache通过设置配置文件httpd-default.conf中相关的连接保持参数来开启与控制连接保持功能。
KeepAlive: 决定是否打开连接保持功能, 后面接 OFF 表示关闭, 接 ON 表示打开, 可以根据网站的并发请求量决定是否打开, 即在高并发时打开连接保持功能, 并发量不高时关闭此功能。
KeepAliveTimeout: 表示一次连接多次请求之间的最大间隔时间, 即两次请求之间超过该时间连接就会自动断开, 从而避免客户端占用连接资源。
MaxKeepAliveRequests: 用于设置在一次长连接中可以传输的最大请求数量, 超过此最大请求数量就会断开连接, 最大值的设置决定于网站中网页的内容, 一般设置数量会多于网站中所有的元素。
1.客户机地址限制
通过 Require 配置项, 可以根据客户端的主机名或 IP 地址来决定是否允许客户端访问。在 httpd 服务主配置文件的、 、 、 配置段中均可以使用 Require 配置项来控制客户端的访问。 使用 Require 配置项时, 需要设置客户端地址以构成完整的限制策略, 地址形式可以是 IP 地址、 网络地址、 主机名或域名。 当 Require 配置项之后为“all”时, 表示匹配任意地址。 限制策略的格式如下所示。
Require all granted: 允许所有主机访问;
Require all denied: 拒绝所有主机访问;
Require local: 仅允许本地主机访问;
Require [not] host <主机名或域名列表>: 允许或拒绝指定主机或域名访问;
Require [not] ip <IP 地址或网段列表>: 允许或拒绝指定 IP 地址网络访问。
通常情况下, 网站服务器是对所有客户机开放的, 网页文档目录并未做任何限制, 因此使用的是“Require all granted”的策略, 表示允许从任何客户机访问, 策略格式如下所示。
<Directory "/usr/local/httpd/htdocs">
........(省略部分内容)
Require all granted
</Directory>
定义限制策略时, 多个不带“not”的 Require 配置语句之间是“或”的关系, 即任意一条Require 配置语句满足条件均可访问。 若既出现了不带“not”的 Require 配置语句, 又出现了带“not”的 Require 配置语句, 则配置语句之间是“与”的关系, 即同时满足所有 Require 配置语句才能访问。
需要使用“仅允许”的限制策略时, 应使用 Require 配置语句明确设置允许策略, 只允许一部分主机访问。 例如, 若只希望 IP 地址为 192.168.25.1 的主机能够访问, 目录区域应做如下设置。
<Directory "/usr/local/httpd/htdocs">
........(省略部分内容)
Require ip 192.168.25.1
</Directory>
反之, 需要使用“仅拒绝”的限制策略时, 灵活使用 Require 与 Require not 配置语句设置 拒 绝 访 问 策 略 , 仅 禁 止 一 部 分 主 机 访 问 。 在 使 用 not 禁 止 访 问 时 要 将 其 置 于容器中, 并在容器中设置相应的限制策略。 例如, 若只希望禁止来自两个内网网段 192.168.0.0/24 和 192.168.1.0/24 的主机访问, 但允许其他任何主机访
问, 可以使用如下限制策略。
<Directory "/usr/local/httpd/htdocs">
........(省略部分内容)
<RequireAll>
Require all granted
Require not ip 192.168.0.0/24 192.168.1.0/24
</RequireAll>
</Directory>
当未被授权的客户机访问网站目录时, 将会被拒绝访问。
httpd 服务器支持使用摘要认证(Digest) 和基本认证(Basic) 两种方式。 使用摘要认证需要在编译 httpd 之前添加“–enable-auth-digest”选项, 但并不是所有的浏览器都支持摘要认证; 而基本认证是 httpd 服务的基本功能, 不需要预先配置特别的选项。
基于用户的访问控制包含认证( Authentication) 和授权( Authorization) 两个过程。认证是指识别用户身份的过程, 授权是指允许特定用户访问特定目录区域的过程。 下面将以基本认证方式为例, 添加用户授权限制。
httpd 的基本认证通过校验用户名、 密码组合来判断是否允许用户访问。 授权访问的用户账号需要事先建立, 并保存在固定的数据文件中。 使用专门的 htpasswd 工具程序, 可以创建授权用户数据文件, 并维护其中的用户账号。
使用 htpasswd 工具时, 必须指定用户数据文件的位置, 添加“-c”选项表示新建立此文件。 例如, 执行以下操作可以新建数据文件/usr/local/httpd/conf/.awspwd, 其中包含一个名为 zhangsan 的用户信息。
[root@localhost bin]# htpasswd -c /usr/local/httpd/conf/.awspwd zhangsan
New password:
Re-type new password:
Adding password for user zhangsa
[root@localhost bin]# cat /usr/local/httpd/conf/.awspwd
zhangsan:$apr1$I4YluMBM$LfR0ogYzWTrh3UiGgGza..
若省略“-c”选项, 则表示指定的用户数据文件已经存在, 用于添加新的用户或修改现有用户的密码。 例如, 需要向.awspwd 数据文件中添加一个新用户 lisi 时, 可以执行以下操作。
[root@localhost bin]# htpasswd /usr/local/httpd/conf/.awspwd lisi
New password:
Re-type new password:
Adding password for user lisi
[root@localhost bin]# cat /usr/local/httpd/conf/.awspwd
zhangsan:$apr1$I4YluMBM$LfR0ogYzWTrh3UiGgGza..
lisi:$apr1$go0BtC2S$JsT5xJEhjQPih.7tRJNE7.
有了授权用户账号以后, 还需要修改 httpd.conf 配置文件, 在特定的目录区域中添加授权配置, 以启用基本认证并设置允许哪些用户访问。 例如, 若只允许.awspwd 数据文件中的任一用户访问系统, 可以执行以下操作。
[root@localhost bin]# vim /usr/local/httpd/conf/httpd.conf
........
<Directory "/usr/local/httpd/htdocs">
........
AuthName "DocumenRoot"
AuthType Basic
AuthUserFile /usr/local/httpd/conf/.awspwd
Require valid-user
</Directory>
[root@localhost bin]# systemctl restart httpd
在上述配置内容中, 相关配置项的含义如下。
AuthName: 定义受保护的领域名称, 该内容将在浏览器弹出的认证对话框中显示。
AuthType: 设置认证的类型, Basic 表示基本认证。
AuthUserFile: 设置用于保存用户账号、 密码的认证文件路径。
require valid-user: 要求只有认证文件中的合法用户才能访问。 其中, valid-user 表示所有合法用户, 若只授权给单个用户, 可改为指定的用户名(如 zhangsan)。
当访问系统时, 浏览器会首先弹出认证对话框。 只有输入正确的用户名
和密码后才能查看特定目录下的网站资源, 否则将拒绝访问。
随着网站的访问量越来越大, 默认情况下 Apache 服务器产生的单个日志文件也会越来越大, 如果不对日志进行分割, 那么如果日志文件占用磁盘空间很大的话势必会将整个日志文件删除, 这样也丢失了很多对网站比较宝贵的信息, 而这些日志可以用来进行访问分析、网络安全监察、 网络运行状况监控等。
另外, 如果服务器遇到故障时, 运维人员要打开日志文件进行分析, 打开的过程会消耗很长时间, 也势必会增加处理故障的时间。 因此管理好这些海量的日志对网站的意义很大,我们会将 Apache 的日志进行按每天的日期自动分割。 下面介绍两种方法均可实现。
首先, 将 Apache 主配置文件 httpd.conf 打开, 配置网站的日志文件转交给 rotatelogs分割处理。
[root@localhost ~]# mkdir /var/log/httpd
[root@localhost ~]# vim /usr/local/httpd/conf/httpd.conf
.......
ErrorLog "| /usr/local/bin/rotatelogs -l /var/log/httpd/error_%Y%m%d.log 86400"
........
CustomLog "| /usr/local/bin/rotatelogs -l /var/log/httpd/access_%Y%m%d.log 86400" combined
.........
[root@localhost ~]# systemctl restart httpd.service
[root@localhost ~]# ll /var/log/httpd
总用量 4
-rw-r--r--. 1 root root 1109 1月 3 11:47 error_20240103.log
其中 ErrorLog 行是错误日志, -l 表示使用本地时间代替 GMT 时间作为时间基准。 需要注意的是在一个改变 GMT 偏移量(比如夏令时)的环境中使用-l 会导致不可预料的结果。CustomLog 行是定义访问日志格式, 86400 表示一天, 即每天生成一个新的日志文件。
重启 Apache 服务, 查看日志文件是否已经按日期分割。
除了 Apache 自带 rotatelogs 分割工具, 也可使用第三方工具 cronolog 对 Apache 日志进行分割, 具体操作如下所示。
(1) 编译安装 cronolog 工具
[root@localhost ~]# tar zxvf cronolog-1.6.2.tar.gz
[root@localhost ~]# cd cronolog-1.6.2
[root@localhost cronolog-1.6.2]# ./configure
[root@localhost cronolog-1.6.2]# make && make install
(2) 设置 cronolog 工具工具分割 apache 日志
[root@localhost cronolog-1.6.2]# ll /var/log/httpd | grep "www.kgc.com"
lrwxrwxrwx. 1 root root 5 1月 3 12:00 www.kgc.com-error_%Y%m%d.log -> 86400