
摘要
在 Linux 服务器日常运维中,有两个问题非常常见。
第一个是日志文件越来越大。刚开始一个日志文件可能只有几 MB,但服务器运行时间长了以后,日志不断写入,最终可能占满磁盘。一旦磁盘空间不足,就可能影响服务正常运行。
第二个是公司内部网站越来越多。如果每个系统都让员工通过 IP 地址访问,例如 192.168.88.130,不仅不好记,而且后期服务器 IP 发生变化时,还需要重新通知所有人。
这篇文章结合实际服务器场景,使用 logrotate 管理日志文件,再通过 BIND 搭建内部 DNS,让内部网站可以通过类似 www.itwu.local 的域名访问。
日志轮替
为什么需要日志轮替
日志轮替可以简单理解为:日志不能一直写在同一个文件里,而是按照时间或者文件大小进行拆分,并把旧日志进行保存或者删除。
例如:
text
myhttp.log
myhttp.log-2026-05-10
myhttp.log-2026-05-11
myhttp.log-2026-05-12
这样做主要解决三个问题:
- 避免一个日志文件无限增大,占满磁盘。
- 不同时间的日志分开保存,排查问题更加方便。
- 避免超大的日志文件影响系统处理效率。
Linux 中主要使用 logrotate 完成这项工作。
首先检查是否安装:
bash
rpm -qa | grep logrotate
如果没有安装:
bash
dnf install -y logrotate
测试日志轮替时,可以使用:
bash
logrotate -vf /etc/logrotate.d/nginx
其中:
-v:显示详细的轮替过程。-f:强制进行轮替,即使当前还没有达到轮替条件。
这里需要注意,/etc/logrotate.conf 是日志轮替的主配置文件,通常了解它的作用即可,具体服务的配置一般放在 /etc/logrotate.d/ 目录中。
自定义日志轮替案例
假设公司内部有一个 Web 服务,它的日志保存位置是:
text
/data/log/myhttp.log
现在要求每天轮替一次,只保留最近 7 个日志文件,并且旧日志需要自动增加日期。
首先准备测试日志:
bash
mkdir -p /data/log
echo 'hello world hahahahahahaha' > /data/log/myhttp.log
然后创建配置:
bash
vi /etc/logrotate.d/myhttp
配置内容:
bash
/data/log/myhttp.log {
daily
rotate 7
missingok
notifempty
create
dateext
dateformat -%Y-%m-%d
copytruncate
sharedscripts
postrotate
echo 'ok' >> /data/log/a.log 2>/dev/null
endscript
}
代码解释
bash
/data/log/myhttp.log
表示需要进行轮替的日志文件。
bash
daily
表示每天进行一次日志轮替。
bash
rotate 7
表示保留 7 个轮替后的日志。
bash
missingok
如果日志文件不存在,不直接报错。
bash
notifempty
如果日志为空,则不进行轮替。
bash
create
轮替完成后创建新的日志文件。
bash
dateext
dateformat -%Y-%m-%d
让旧日志带上日期,例如:
text
myhttp.log-2026-05-10
bash
copytruncate
复制旧日志内容后清空原文件,这种方式不需要重启正在写日志的程序。
最后:
bash
postrotate
echo 'ok' >> /data/log/a.log
endscript
表示轮替完成以后执行额外操作。
测试配置:
bash
logrotate -f /etc/logrotate.d/myhttp
查看结果:
bash
ls /data/log/
可以看到类似:
text
myhttp.log
myhttp.log-2026-05-10
这个案例的实际意义很明显:服务器上的 Web 日志每天自动拆分,并且只保留指定数量的历史日志,不需要管理员每天手动清理。
日志轮替的实际应用
场景一:Web 服务日志管理
服务器运行 Web 服务后,访问日志和错误日志会持续增加。
可以使用:
bash
/var/log/myhttp/*.log
配合 daily、rotate 7 等配置,让日志每天自动轮替。
管理员排查问题时,可以直接查看某一天的日志,而不是面对一个几 GB 的日志文件。
场景二:服务器磁盘空间控制
如果日志长期不清理,很容易出现:
text
日志不断增长
↓
磁盘空间下降
↓
磁盘占满
↓
服务器服务异常
使用 logrotate 后,可以按照天数保存历史日志,过期日志自动被删除,从而控制日志占用的空间。
DNS域名服务
DNS到底解决什么问题
DNS 可以理解成网络中的"电话簿"。
例如用户访问:
text
www.example.com
DNS 会帮助客户端找到对应的 IP 地址。
在企业环境中,DNS 的作用更加明显。
假设公司内部有一个网站:
text
192.168.88.130
让员工每天输入 IP 地址访问显然不方便。
可以配置:
text
www.itwu.local → 192.168.88.130
以后员工直接访问:
text
www.itwu.local
就可以找到内部网站。
DNS 除了可以进行正向解析,也可以进行反向解析,即:
text
域名 → IP
IP → 域名
DNS工作原理
一次普通的 DNS 查询,大致可以理解成:
text
客户端
↓
递归DNS服务器
↓
根DNS
↓
顶级域DNS
↓
权威DNS
↓
返回IP地址
同时 DNS 还存在缓存机制。
如果之前已经查询过某个域名,DNS 服务器可以根据 TTL 保存查询结果,下次再次访问时就不需要完整查询,可以直接从缓存获得结果,提高解析速度。
使用BIND搭建企业内部DNS
实际需求
假设现在公司内部有很多只能在内网访问的网站。
目前员工只能通过 IP 地址访问,例如:
text
192.168.88.130
公司希望搭建一个内部 DNS:
text
www.itwu.local
↓
192.168.88.130
同时,当内部没有对应域名时,还可以通过 DNS 转发访问外部网络。
服务器规划:
text
node1:DNS服务器
node2:DNS客户端
BIND 是 Linux 中比较常见的 DNS 软件,功能比较完整,同时支持权威、递归和缓存等功能。
安装BIND
在 node1 上执行:
bash
dnf install -y bind bind-utils
其中:
text
bind
主要提供 DNS 服务。
text
bind-utils
提供 dig、nslookup、host 等 DNS 测试工具。
配置DNS主配置文件
先备份:
bash
cp /etc/named.conf /etc/named.conf.bak
编辑:
bash
vi /etc/named.conf
核心配置:
text
options {
listen-on port 53 { any; };
allow-query { any; };
recursion yes;
dnssec-validation no;
forwarders {
119.29.29.29;
223.5.5.5;
8.8.8.8;
114.114.114.114;
};
allow-transfer { none; };
};
代码解释
text
listen-on port 53 { any; };
让 DNS 服务监听 53 端口,并接受相应来源的 DNS 请求。
text
allow-query { any; };
允许客户端进行 DNS 查询。
text
recursion yes;
开启递归查询。
text
forwarders
配置外部 DNS。当本地 DNS 无法解析时,就把请求转发出去。
text
allow-transfer { none; };
禁止其他服务器进行区域传送。
修改完成后不要急着重启,先检查语法:
bash
named-checkconf /etc/named.conf
没有任何提示,说明配置文件语法正常。
配置内部域名解析
创建内部DNS区域
现在规划:
text
www.itwu.local → 192.168.88.130
编辑:
bash
vi /etc/named.rfc1912.zones
增加:
text
zone "itwu.local" IN {
type master;
file "/var/named/itwu.local";
allow-update { none; };
};
这里的 itwu.local 就是企业内部规划的域名。
然后创建区域文件:
bash
vi /var/named/itwu.local
写入:
text
$TTL 1d
@ IN SOA ns1.itwu.local. admin.itwu.local. (
2025110301
1h
30m
1d
1d
)
IN NS ns1.itwu.local.
ns1 IN A 192.168.88.128
www IN A 192.168.88.130
最关键的一行是:
text
www IN A 192.168.88.130
它实际上就是告诉 DNS:
text
www.itwu.local
↓
192.168.88.130
修改权限:
bash
chgrp named /var/named/itwu.local
chmod 640 /var/named/itwu.local
检查区域:
bash
named-checkzone itwu.local /var/named/itwu.local
如果出现:
text
OK
说明区域文件没有问题。
配置反向解析
反向解析不是必须的,它解决的是:
text
192.168.88.130
↓
www
配置区域:
text
zone "88.168.192.in-addr.arpa" IN {
type master;
file "/var/named/192.168.88.rev";
allow-update { none; };
};
反向区域文件:
text
$TTL 1d
@ IN SOA ns1.itwu.local. admin.itwu.local. (
2025110501
1h
30m
1d
1d
)
IN NS ns1.itwu.local.
128 IN PTR ns1
130 IN PTR www
这样查询:
bash
dig -x 192.168.88.130
就可以测试 IP 到域名的反向解析。
启动DNS并让客户端使用
启动服务
配置完成后:
bash
systemctl restart named
同时可以设置开机启动:
bash
systemctl enable --now named
防火墙放行 DNS:
bash
firewall-cmd --zone=public --add-service=dns --permanent
firewall-cmd --reload
DNS 使用的是 53 端口,并且需要允许 UDP 和 TCP 流量。
客户端配置DNS
在 node2 上配置 DNS:
bash
nmcli con modify ens160 ipv4.dns 192.168.88.128
nmcli con down ens160
nmcli conn up ens160
检查:
bash
nmcli device show ens160 | grep -i dns
如果看到:
text
IP4.DNS[1]: 192.168.88.128
说明客户端已经开始使用内部 DNS。
安装测试工具:
bash
dnf -y install bind-utils
测试:
bash
dig www.itwu.local
如果看到:
text
ANSWER SECTION:
www.itwu.local. 86400 IN A 192.168.88.130
就说明正向解析已经成功。
实际应用场景
场景一:企业内部网站统一访问
公司有多个内部系统:
text
www.itwu.local
mail.itwu.local
image.itwu.local
news.itwu.local
员工不需要记住每台服务器的 IP,只需要通过域名访问。
这就是内部 DNS 最直接的应用。
场景二:服务器IP发生变化
如果网站原来是:
text
www.itwu.local → 192.168.88.130
以后服务器更换成新的 IP,只需要修改 DNS 的 A 记录。
员工仍然访问:
text
www.itwu.local
不需要一个个修改访问地址。
场景三:服务器日志长期运行
Web 服务每天都会产生大量日志。
通过:
text
daily
rotate 7
dateext
可以自动完成日志拆分和历史日志管理。
管理员不用每天手动执行 rm 删除旧日志,也可以保留最近一段时间的记录方便排查问题。
QA环节
Q1:为什么日志需要轮替?
因为日志会不断增长,如果一直写入一个文件,最终可能占满磁盘。logrotate 可以按照时间或者其他条件拆分日志,并清理过期日志。
Q2:logrotate -f 是干什么的?
它用于强制进行日志轮替,即使当前没有达到配置中的轮替条件,也会立即执行,特别适合测试配置。
Q3:DNS正向解析是什么?
就是:
text
域名 → IP地址
例如:
text
www.itwu.local → 192.168.88.130
Q4:为什么配置DNS后还需要测试?
因为 DNS 配置涉及主配置文件、区域文件、防火墙以及客户端 DNS 配置。任何一处出现问题,都可能导致域名无法解析。
所以配置完成后,需要使用:
bash
named-checkconf
named-checkzone
dig
逐步检查。
总结
这次实验实际上解决的是两个非常典型的 Linux 运维问题。
第一是日志管理。通过 logrotate 把不断增长的日志按照日期进行轮替,并保留指定数量的历史文件,避免日志最终把磁盘空间占满。
第二是企业内部域名管理。通过 BIND 搭建内部 DNS,把:
text
www.itwu.local
解析到:
text
192.168.88.130
客户端只需要配置内部 DNS,就可以通过域名访问内部网站。