最近在深入学习 Apache 服务器配置时,发现很多朋友对 Apache 的高级功能还不够了解。作为一个在运维路上摸爬滚打的技术人,我想把这些实用的配置技巧分享给大家。今天这篇文章会带你从连接保持优化开始,一路走到访问控制和日志管理,最后用 AWStats 来分析网站数据。这些都是生产环境中必备的技能!
HTTP 协议本身是无状态的,每次请求都需要建立 TCP 连接(三次握手)和断开连接(四次挥手)。想象一下,一个网页包含多个图片、CSS、JS 文件,如果每个资源都要重新建立连接,那性能损耗会非常大。
连接保持(KeepAlive) 就是让客户端通过同一个 TCP 连接发送多个 HTTP 请求,能够:
编辑 httpd-default.conf
文件:
# 开启连接保持功能
KeepAlive On
# 连接超时时间(秒)- 两次请求间的最大间隔
KeepAliveTimeout 15
# 单个连接最大请求数
MaxKeepAliveRequests 100
配置建议:
KeepAlive On
KeepAlive Off
(节省内存)这是最直接的访问控制方式,通过 Require
指令实现:
Require all granted
# 只允许这个 IP 访问管理目录
Require ip 192.168.1.100
Require all granted
# 禁止内网用户访问
Require not ip 192.168.0.0/24 192.168.1.0/24
对于敏感目录,IP 限制还不够,需要用户名密码验证。
# 创建第一个用户(-c 参数表示创建新文件)
/usr/local/httpd/bin/htpasswd -c /usr/local/httpd/conf/.htpasswd admin
# 添加更多用户(不要 -c 参数)
/usr/local/httpd/bin/htpasswd /usr/local/httpd/conf/.htpasswd user1
# 认证提示信息
AuthName "Restricted Area - Please Login"
# 认证类型
AuthType Basic
# 用户文件路径
AuthUserFile /usr/local/httpd/conf/.htpasswd
# 要求验证用户
Require valid-user
# 或者只允许特定用户:Require user admin
重启服务生效:
systemctl restart httpd
Require 指令的逻辑关系:
常用 Require 指令:
Require all granted # 允许所有主机访问
Require all denied # 拒绝所有主机访问
Require local # 仅允许本地主机访问
Require host example.com # 允许指定域名访问
Require not host spam.com # 拒绝指定域名访问
Require ip 192.168.1.0/24 # 允许指定网段访问
Require not ip 10.0.0.0/8 # 拒绝指定网段访问
随着网站访问量增长,日志文件会变得巨大。一个几 GB 的日志文件不仅占用磁盘空间,打开分析也非常耗时。
问题:
解决方案:
# 创建日志目录
mkdir /var/log/httpd/
# 编辑主配置文件
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
参数说明:
-l
:使用本地时间(而非 GMT 时间)%Y%m%d
:年月日格式(如:20241225)86400
:86400秒 = 24小时,即每天分割一次重启服务:
systemctl restart httpd
# 查看分割后的日志文件
ll /var/log/httpd/
# 输出示例:
# -rw-r--r-- 1 root root 150 1月 11 20:36 access_20241225.log
# -rw-r--r-- 1 root root 588 1月 11 20:35 error_20241225.log
cronolog 是一个更灵活的日志分割工具,支持更多的时间格式。
安装 cronolog:
# 下载安装 cronolog
tar zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure && make && make install
配置 cronolog 分割:
# 编辑 httpd.conf
vim /usr/local/httpd/conf/httpd.conf
# 配置错误日志和访问日志
ErrorLog "|/usr/local/sbin/cronolog /var/log/httpd/www.example.com-error_%Y%m%d.log"
CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/www.example.com-access_%Y%m%d.log" combined
重启服务并验证:
systemctl restart httpd
# 查看分割后的日志文件
ll /var/log/httpd/ | grep "www.example.com"
# 输出示例:
# -rw-r--r-- 1 root root 150 1月 11 20:45 www.example.com-access_20241225.log
# -rw-r--r-- 1 root root 588 1月 11 20:45 www.example.com-error_20241225.log
分割策略建议:
日志清理脚本示例:
#!/bin/bash
# 清理 30 天前的日志文件
find /var/log/httpd/ -name "*.log" -mtime +30 -delete
# 压缩 7 天前的日志文件
find /var/log/httpd/ -name "*.log" -mtime +7 -exec gzip {} \;
光有日志还不够,我们需要分析这些数据来了解网站运营情况。AWStats 是一个强大的开源日志分析工具。
AWStats 特点:
能够分析的数据:
# 下载并解压 AWStats
tar zxf awstats-7.7.tar.gz
mv awstats-7.7 /usr/local/awstats
# 设置权限
chmod +x /usr/local/awstats/tools/*
cd /usr/local/awstats/tools/
./awstats_configure.pl
1. 指定 httpd 配置文件路径:
-----> Check for web server install
Enter full config file path of your Web server.
Example: /etc/httpd/httpd.conf
Example: /usr/local/apache2/conf/httpd.conf
Config file path ('none' to skip web server setup):
> /usr/local/httpd/conf/httpd.conf
2. 创建站点配置:
-----> 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
Your web site, virtual server or profile name:
> www.example.com
-----> Define config file path
Directory path to store config file(s) (Enter for default):
> [直接回车使用默认路径 /etc/awstats]
# 编辑 httpd.conf
vim /usr/local/httpd/conf/httpd.conf
# 加载 CGI 模块
LoadModule cgid_module modules/mod_cgid.so
LoadModule cgi_module modules/mod_cgi.so
# AWStats 目录权限配置
Options None
AllowOverride None
# 注释掉旧的权限配置
# Order allow,deny
# Allow from all
# 添加新的权限配置
Require all granted
vim /etc/awstats/awstats.www.example.com.conf
关键配置项:
# 指定要分析的日志文件路径
LogFile="/usr/local/httpd/logs/access_log"
# 指定统计数据存储目录
DirData="/var/lib/awstats"
# 站点域名
SiteDomain="www.example.com"
# 日志格式(通常使用 combined 格式)
LogFormat=1
# 是否解析主机名(建议关闭以提高性能)
DNSLookup=0
# 数据更新频率设置
AllowToUpdateStatsFromBrowser=0
创建数据目录:
mkdir -p /var/lib/awstats
chown apache:apache /var/lib/awstats
cd /usr/local/awstats/tools/
chmod +x awstats_updateall.pl
./awstats_updateall.pl now
输出示例:
Running '"/usr/local/awstats/wwwroot/cgi-bin/awstats.pl" -update -config=www.example.com'
Create/Update database for config "/etc/awstats/awstats.www.example.com.conf"
From data in log file "/usr/local/httpd/logs/access_log"...
Phase 1 : First bypass old records, searching new record...
Parsed lines in file: 1250
Found 1250 new qualified records.
# 编辑定时任务
crontab -e
# 添加以下内容(每5分钟分析一次)
*/5 * * * * /usr/local/awstats/tools/awstats_updateall.pl now >/dev/null 2>&1
# 或者每小时分析一次(推荐)
0 * * * * /usr/local/awstats/tools/awstats_updateall.pl now >/dev/null 2>&1
http://your-server-ip/awstats/awstats.pl?config=www.example.com
# 创建自动跳转页面
vim /usr/local/httpd/htdocs/stats.html
DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>网站统计 - 正在跳转...title>
<meta http-equiv="refresh" content="0; url=/awstats/awstats.pl?config=www.example.com">
head>
<body>
<div style="text-align: center; margin-top: 100px;">
<h2>正在跳转到网站统计页面...h2>
<p>如果页面没有自动跳转,请点击 <a href="/awstats/awstats.pl?config=www.example.com">这里a>p>
div>
body>
html>
1. 访问量统计:
2. 时间分析:
3. 访客分析:
4. 来源分析:
# 在配置文件中添加以下设置
# 关闭 DNS 解析(提高处理速度)
DNSLookup=0
# 排除不需要统计的文件类型
NotPageList="css js class gif jpg jpeg png bmp ico rss xml swf"
# 排除搜索引擎爬虫
SkipRobots=1
# 设置数据保留时间(月数)
KeepBackupOfHistoricFiles=12
# 限制 AWStats 访问权限
Options None
AllowOverride None
# 只允许管理员 IP 访问
Require ip 192.168.1.100
# 或者设置密码保护
AuthType Basic
AuthName "AWStats Admin"
AuthUserFile /usr/local/httpd/conf/.awstats_passwd
Require valid-user
问题:KeepAlive 开启后服务器内存占用过高
# 解决方案:调整相关参数
KeepAliveTimeout 5 # 减少超时时间
MaxKeepAliveRequests 50 # 减少最大请求数
ServerLimit 16 # 限制服务器进程数
MaxRequestWorkers 400 # 限制最大工作进程
问题:某些客户端不支持 KeepAlive
# 解决方案:针对特定浏览器关闭 KeepAlive
BrowserMatch "MSIE [2-5]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
问题:配置访问控制后出现 403 Forbidden
# 检查目录权限
ls -la /usr/local/httpd/htdocs/
# 检查 SELinux 状态
getenforce
# 如果是 Enforcing,临时关闭测试
setenforce 0
# 检查配置文件语法
/usr/local/httpd/bin/httpd -t
问题:htpasswd 创建的用户无法登录
# 检查密码文件权限
chmod 644 /usr/local/httpd/conf/.htpasswd
chown apache:apache /usr/local/httpd/conf/.htpasswd
# 检查文件内容格式
cat /usr/local/httpd/conf/.htpasswd
问题:rotatelogs 分割的日志文件权限错误
# 在 httpd.conf 中设置日志文件所有者
User apache
Group apache
# 或者使用 logrotate 替代方案
vim /etc/logrotate.d/httpd
/var/log/httpd/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 644 apache apache
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}
问题:AWStats 页面显示 Internal Server Error
# 检查 CGI 模块是否加载
/usr/local/httpd/bin/httpd -M | grep cgi
# 检查脚本权限
chmod +x /usr/local/awstats/wwwroot/cgi-bin/awstats.pl
# 查看错误日志
tail -f /usr/local/httpd/logs/error_log
问题:AWStats 无法解析日志格式
# 在配置文件中指定正确的日志格式
LogFormat=1 # Combined 格式
# 或者
LogFormat="%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
问题:AWStats 统计数据不准确
# 清除旧的统计数据重新分析
rm -rf /var/lib/awstats/*
/usr/local/awstats/tools/awstats_updateall.pl now
# 检查日志文件是否正常轮转
ls -la /var/log/httpd/
通过这篇文章,我们完整地走了一遍 Apache 高级配置的核心功能:
连接保持优化
️ 多层访问控制
智能日志管理
数据驱动决策
立即行动:
持续优化:
安全加固:
有问题欢迎随时交流讨论!