Linux服务器实战:日志越来越大怎么办?用Logrotate+DNS解决日志管理与内网访问问题

摘要

在 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

这样做主要解决三个问题:

  1. 避免一个日志文件无限增大,占满磁盘。
  2. 不同时间的日志分开保存,排查问题更加方便。
  3. 避免超大的日志文件影响系统处理效率。

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

配合 dailyrotate 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

提供 dignslookuphost 等 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,就可以通过域名访问内部网站。

相关推荐
小此方1 小时前
Linux网络(十):HTTP请求是如何被服务器解析的?从请求报文、路径处理到响应状态码与异常处理
linux·服务器·网络
少司府1 小时前
Linux系统篇(一)指令篇·一:初识Linux及其基本指令
linux·运维·服务器·网络·阿里云·linux系统
Zixhy3 小时前
手撕Reactor模型实现同步高并发服务器及Muduo网络库深入解析
linux·服务器·网络·数据库·c++
迷途之人不知返3 小时前
【进程】-4-进程状态(2):Linux中的进程状态
linux
tedcloud1239 小时前
Wand-Enhancer 怎么搭建?开源 Wand 客户端增强与远程控制工具介绍
大数据·服务器·人工智能·开源·音视频
嘉琪coder10 小时前
我做了一个 Chrome 扩展,把 YouTube 播放列表批量变成 AI 可读的本地 Markdown
chrome·开源·浏览器
Emily1568535987011 小时前
ABB CI867K01 3BSE043660R1
服务器·plc·dcs·abb·ci867k01·3bse043660r1·工控模块
Java陈序员12 小时前
轻量运维面板!一款现代化的服务器控制面板工具!
运维·服务器·python·react.js·github
bosins12 小时前
WSL 迁移指南:如何将 Linux 环境完整复制到另一台电脑
linux·运维·服务器