Linux日志过大占用磁盘,logrotate日志切割配置

前言

服务器跑了几个月,突然磁盘满了,一查发现是日志文件占了几十G。Nginx的access.log、MySQL的慢查询日志、系统日志……这些日志文件只会越来越大,不会自己变小。手动删了吧,又怕删出问题;不删吧,磁盘迟早满。Linux 自带了 logrotate 工具,专门用来自动切割和清理日志,配置一次以后就不用管了。本文就详细讲一下怎么用 logrotate 管理日志。

什么是 logrotate

logrotate 是 Linux 系统自带的日志管理工具,可以自动完成:

  • 切割日志:把大日志文件按天/按大小切成多个小文件
  • 压缩日志:旧的日志自动 gzip 压缩
  • 删除日志:保留指定天数后自动删除
  • 通知服务:切割完后通知 Nginx/MySQL 等服务重新打开日志文件

系统默认每天运行一次 logrotate,你只需要写好配置文件就行。

logrotate 配置文件结构

全局配置

vi /etc/logrotate.conf

这是全局配置文件,一般不用改。里面定义了默认的行为:

weekly                  # 默认每周切割一次
rotate 4                # 保留4个日志文件
create                  # 切割后创建新的空日志文件
dateext                 # 用日期作为扩展名
include /etc/logrotate.d   # 包含这个目录下的所有配置

单个服务的配置

每个服务的日志配置放在 /etc/logrotate.d/ 目录下:

ls /etc/logrotate.d/

比如 nginx、mysql、syslog 都有各自的配置文件。

实战:配置 Nginx 日志切割

我们以 Nginx 为例,写一个完整的 logrotate 配置。

1. 创建配置文件

vi /etc/logrotate.d/nginx

2. 写入配置

/var/log/nginx/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 644 nginx nginx
    postrotate
        /usr/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endpostrotate
}

3. 参数说明

参数 作用
/var/log/nginx/*.log 要切割的日志文件路径
daily 每天切割一次
rotate 30 保留30个日志文件
compress 旧日志用gzip压缩
delaycompress 延迟压缩,新切割的当天不压缩
missingok 日志文件不存在不报错
notifempty 空文件不切割
create 644 nginx nginx 创建新文件,权限644,属主nginx
postrotate...endpostrotate 切割后执行的命令,通知Nginx重新打开日志文件

常用切割策略

按天切割,保留30天

/var/log/nginx/*.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
    create 644 nginx nginx
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endpostrotate
}

按大小切割,超过100M就切

/var/log/nginx/access.log {
    size 100M
    rotate 10
    compress
    missingok
    notifempty
    create 644 nginx nginx
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endpostrotate
}

同时按天+按大小

/var/log/nginx/*.log {
    daily
    size 100M
    rotate 30
    compress
    missingok
    notifempty
    create 644 nginx nginx
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endpostrotate
}

意思是每天检查一次,如果日志超过100M就切割。

手动测试 logrotate

配置完之后,可以用 debug 模式测试一下,不会真正执行:

logrotate -d /etc/logrotate.d/nginx

参数说明:

  • -d:debug模式,只显示会做什么,不真正执行

如果没问题,手动执行一次:

logrotate -f /etc/logrotate.d/nginx
  • -f:强制切割,不管到没到时间

常见坑

坑1:切割了但服务还在写旧文件

很多人配置完 logrotate,发现日志切完了,但磁盘空间没释放。这是因为 Nginx 还在往旧的日志文件里写(虽然名字改了,但文件句柄还在)。

解决: 一定要配置 postrotate 脚本,通知服务重新打开日志文件。对于 Nginx,就是发送 USR1 信号:

postrotate
    /bin/kill -USR1 `cat /run/nginx.pid`
endpostrotate

坑2:压缩延迟没开,旧日志还占着空间

如果不加 delaycompress,切割完立刻就压缩,但服务可能还在写旧文件,导致压缩失败或者压缩不完整。

解决: 加上 delaycompress,让新切割的日志第二天再压缩。

坑3:日志文件权限不对

切割完创建的新日志文件,如果属主不对,Nginx 就写不进去。

解决: 用 create 644 nginx nginx 指定新文件的属主和权限。

坑4:logrotate 不执行

配置写完了,但日志从来没切割过。检查一下:

# 看logrotate的cron任务有没有
cat /etc/cron.daily/logrotate

# 手动执行一次看有没有报错
logrotate -d /etc/logrotate.d/nginx

总结

logrotate 配置的核心步骤:

  1. 在 /etc/logrotate.d/ 下创建配置文件
  2. 指定日志路径、切割频率、保留数量
  3. 加上 postrotate 通知服务重新打开日志
  4. 用 logrotate -d 测试配置
  5. 系统每天自动执行,不用管了

日志切割是服务器运维的基本功,配好了以后磁盘永远不会被日志撑满。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:33 

Linux查看CPU、内存负载,top命令详解

前言

服务器变慢了?网站卡了?第一反应就是看看 CPU 和内存是不是跑满了。Linux 下最常用的查看系统负载的命令就是 top,相当于 Windows 的任务管理器。但很多人打开 top 后看得一头雾水,不知道各个数字代表什么意思。本文就把 top 命令的输出详解一遍,让你一眼就能看出服务器哪里出了问题。

启动 top 命令

直接在终端输入:

top

就能看到实时的系统监控界面。按 q 键退出。

top 输出详解

top 的输出分为两部分:上面是系统整体信息,下面是各个进程的详细列表。

第一行:系统概况

top - 10:30:45 up 30 days,  2:15,  1 user,  load average: 0.50, 0.40, 0.30
  • 10:30:45:当前系统时间
  • up 30 days, 2:15:系统已经运行了30天2小时15分钟
  • 1 user:当前有1个用户登录
  • load average: 0.50, 0.40, 0.30:系统负载,分别是1分钟、5分钟、15分钟的平均负载

负载怎么看? 负载数值和 CPU 核心数有关。比如4核CPU,负载4.0才算跑满;如果负载超过 CPU 核心数的70%就需要注意了。

第二行:任务进程

Tasks: 120 total,   1 running, 119 sleeping,   0 stopped,   0 zombie
  • 120 total:总共有120个进程
  • 1 running:1个正在运行
  • 119 sleeping:119个休眠中
  • 0 stopped:0个停止
  • 0 zombie:0个僵尸进程

僵尸进程多了要注意,说明有进程没正常退出。

第三行:CPU 使用情况

%Cpu(s):  5.0 us,  2.0 sy,  0.0 ni, 92.0 id,  0.5 wa,  0.0 hi,  0.5 si,  0.0 st
  • us:用户态CPU占用百分比
  • sy:内核态CPU占用百分比
  • ni:改变过优先级的进程占用
  • id:空闲CPU百分比
  • wa:等待I/O的CPU百分比
  • hi:硬中断占用
  • si:软中断占用
  • st:被虚拟机偷走的CPU时间

重点看 us 和 id: 如果 us 很高说明用户进程占了大量CPU;如果 wa 很高说明磁盘I/O是瓶颈。

第四行:内存使用

KiB Mem :  8165036 total,  2000000 free,  4000000 used,  2165036 buff/cache
  • total:总内存
  • free:空闲内存
  • used:已用内存
  • buff/cache:缓存占用

注意: Linux 的内存管理机制和 Windows 不一样,free 很少不代表内存不够用,因为很多内存被用作缓存(buff/cache),需要的时候可以释放出来。

第五行:交换分区

KiB Swap:  2097148 total,  2097148 free,        0 used.  4000000 avail Mem
  • total:交换分区总大小
  • free:空闲交换分区
  • used:已用交换分区
  • avail Mem:可用内存(包括可回收的缓存)

如果 Swap 用了很多,说明物理内存不够用了,系统在把内存数据换到磁盘上,这时候性能会大幅下降。

进程列表

下面是各个进程的详细列表,各列含义:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
1234 root      20   0  100000  20000   5000 S   5.0  0.2   1:23.45 nginx
  • PID:进程ID
  • USER:进程所属用户
  • PR:进程优先级
  • NI:nice值,负值优先级高
  • VIRT:虚拟内存占用
  • RES:物理内存占用(常驻内存)
  • SHR:共享内存
  • S:进程状态(R运行/S睡眠/D不可中断睡眠/Z僵尸)
  • %CPU:CPU占用百分比
  • %MEM:内存占用百分比
  • TIME+:累计CPU时间
  • COMMAND:进程名

top 常用快捷键

在 top 界面里,可以按这些键进行交互:

按键 功能
P 按CPU占用排序(默认)
M 按内存占用排序
N 按PID排序
1 显示每个CPU核心的详细信息
k 杀掉指定PID的进程
q 退出top
h 显示帮助
d 刷新间隔时间(秒)
u 只显示指定用户的进程
c 显示完整命令行

实际排查案例

案例1:CPU 占用很高

打开 top,按 P 键按CPU排序,看哪个进程占的CPU最多。如果是某个异常进程,按 k 输入PID杀掉。

案例2:内存占用很高

按 M 键按内存排序,看哪个进程占的内存最多。如果是数据库占的内存多,那是正常的(数据库会把数据缓存到内存里)。

案例3:系统负载高但CPU不高

如果 load average 很高,但 %us 和 %sy 都不高,看看 %wa 是不是很高。如果 wa 高,说明是磁盘I/O瓶颈,CPU在等磁盘读写。

常见坑

坑1:把 buff/cache 当成已用内存

很多人看到 free 很少就慌了,觉得内存不够用。其实 Linux 把空闲内存都用来做缓存了,buff/cache 那部分是可以随时回收的。看 avail Mem 那列才是真正可用的内存。

坑2:load average 高就以为CPU不够

负载高不一定是CPU的问题。可能是磁盘I/O瓶颈(%wa高),也可能是大量进程在等待资源。要结合CPU使用率一起看。

坑3:杀进程杀错了

用 k 杀进程的时候一定要确认PID是不是对的,别把系统关键进程杀了。杀错了可能直接导致系统挂掉。

总结

top 命令是 Linux 运维最常用的监控工具,记住几个关键点:

  1. 看负载:load average,和CPU核心数对比
  2. 看CPU:%us 高说明用户进程吃CPU,%wa 高说明磁盘I/O瓶颈
  3. 看内存:看 avail Mem,不要只看 free
  4. 排序:按 P 看CPU占用,按 M 看内存占用
  5. 杀进程:按 k 输入PID

日常排查服务器问题,先打开 top 看一眼,大部分问题都能定位到方向。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:30 

Linux crontab定时任务不执行常见原因与排查

前言

配置好了 crontab 定时任务,时间也写对了,但到点就是不执行?这是很多新手都会遇到的坑。crontab 不执行的原因五花八门,从最基础的语法错误到环境变量问题,再到 SELinux 拦截,排查起来很费时间。本文把常见的 crontab 不执行原因都整理出来,按排查顺序一步步来,基本能解决 90% 的问题。

第一步:确认 crond 服务是否运行

最基础也是最容易忽略的——定时任务服务本身有没有启动。

systemctl status crond

如果显示 inactive (dead),说明服务没启动,先启动它:

systemctl start crond
systemctl enable crond

CentOS7 上定时服务叫 crond,Debian/Ubuntu 上叫 cron,别搞混了。

第二步:检查 crontab 语法是否正确

1. 查看当前用户的定时任务

crontab -l

2. crontab 时间格式

* * * * * 命令
- - - - -
| | | | |
| | | | ----- 星期几 (0 - 7) (0和7都是周日)
| | | ------- 月份 (1 - 12)
| | --------- 日期 (1 - 31)
| ----------- 小时 (0 - 23)
------------- 分钟 (0 - 59)

3. 常见语法错误

错误1:分钟写在最前面

# 错误:每天9点执行(错的)
0 9 * * * /root/backup.sh

# 正确:每天9点执行
0 9 * * * /root/backup.sh

等等,这个其实是对的。真正容易错的是:

错误2:命令路径用了相对路径

# 错误:crontab 里找不到 mysql 命令
0 9 * * * mysql -u root -p123456 dbname < /root/backup.sql

# 正确:用绝对路径
0 9 * * * /usr/bin/mysql -u root -p123456 dbname < /root/backup.sql

crontab 的环境变量和你手动登录时不一样! 它的 PATH 很精简,很多命令找不到。所以要么用绝对路径,要么在脚本里先 source 环境变量。

第三步:检查脚本本身有没有执行权限

很多人写了脚本,但忘了加执行权限:

ls -l /root/backup.sh

如果没有 x 权限,加上:

chmod +x /root/backup.sh

第四步:检查脚本内容有没有问题

1. 脚本里用了相对路径

# 错误:相对路径在 crontab 里会出问题
cd /var/www/html
tar -zcf backup.tar.gz .

# 正确:用绝对路径
cd /var/www/html
tar -zcf /root/backup.tar.gz .

2. 脚本里用了交互式命令

比如 read、ssh 需要交互输入的命令,在 crontab 里是跑不了的,因为没有终端。

3. 脚本开头没写 shebang

# 正确的 shebang
#!/bin/bash

如果脚本没有 shebang,或者 shebang 写错了,执行就会失败。

第五步:检查日志

crontab 的执行日志默认在 /var/log/cron 里:

tail -100 /var/log/cron

如果日志里显示任务被执行了,但结果不对,那就是脚本本身的问题。

如果日志里压根没有这个任务的记录,那就是 crontab 服务本身的问题或者任务格式不对。

第六步:检查环境变量问题

这是最隐蔽的坑。你手动跑脚本没问题,但 crontab 里就是不行,十有八九是环境变量的问题。

排查方法:在脚本开头加上环境变量

#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

或者直接在 crontab 里指定:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
0 9 * * * /root/backup.sh

第七步:检查 SELinux 是不是拦截了

如果 SELinux 开着,可能会拦截 crontab 的操作。查看日志:

tail -100 /var/log/audit/audit.log | grep crontab

如果看到 denied 字样,就是 SELinux 拦截了。

第八步:检查邮箱通知

crontab 默认会把执行结果(包括错误信息)发到执行用户的邮箱里:

mail

或者看 /var/spool/mail/root 文件:

tail -100 /var/spool/mail/root

这里面通常会有具体的错误信息,是排查的好帮手。

常见坑

坑1:环境变量缺失

这是最常见的坑。你手动跑脚本能成,crontab 里就不行,因为 crontab 的环境变量和你登录 shell 的不一样。

解决: 在脚本开头加上 export PATH=...,或者所有命令都用绝对路径。

坑2:脚本没有执行权限

写完脚本忘了 chmod +x,crontab 当然跑不了。

坑3:重定向丢了

crontab 默认会把输出发到邮箱,如果你不想收邮件,可以重定向:

0 9 * * * /root/backup.sh > /dev/null 2>&1

> /dev/null 是丢弃标准输出,2>&1 是把错误输出也重定向到标准输出。

坑4:时间格式写错了

比如把 * * * * * 写成了 * * * *,少了一个字段,直接就不执行。

坑5:用户写错了

你用 root 用户写的 crontab,但实际是别的用户需要跑,当然不执行。用 crontab -u 用户名 -l 查看对应用户的任务。

总结

crontab 不执行的排查顺序:

  1. 先确认 crond 服务启动了没
  2. 检查 crontab 语法格式对不对
  3. 脚本有没有执行权限
  4. 脚本里的命令是不是都用了绝对路径
  5. 看 /var/log/cron 日志有没有执行记录
  6. 看 /var/spool/mail/root 有没有错误信息
  7. 检查 SELinux 是不是拦截了

按这个顺序排查,基本都能找到原因。记住 crontab 的环境变量和你手动登录时不一样,所有命令都用绝对路径,能避免 80% 的问题。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:27 

Linux磁盘占用100%怎么排查,大文件查找清理方法

前言

服务器跑着跑着突然网站打不开了,SSH 也反应变慢,一查磁盘使用率 100%。这是运维中非常常见的问题。磁盘满了不仅影响服务正常运行,还可能导致数据丢失、日志写不进去等严重后果。本文就手把手教你怎么快速定位磁盘占用大的文件,以及怎么安全清理。

第一步:查看整体磁盘使用情况

先用 df 命令看看哪个分区满了:

df -h

参数说明:

  • -h:以人类可读的方式显示(G、M)

输出示例:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   38G  2.0G  95% /
devtmpfs        7.8G     0  7.8G   0% /dev
tmpfs           7.8G     0  7.8G   0% /dev/shm
tmpfs           7.8G  480M  7.8G   6% /run
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup

看 Use% 那一列,如果哪个分区到了 100% 或者 90% 以上,那就是问题所在。比如上面 /dev/vda1 用了 95%,根分区快满了。

第二步:定位哪个目录占用最大

知道哪个分区满了,接下来找是哪个目录占了最多空间。用 du 命令:

1. 查看根目录下各目录的大小

du -sh /* 2>/dev/null

参数说明:

  • -s:只显示总计,不显示每个子目录
  • -h:人类可读格式
  • 2>/dev/null:忽略权限不足的报错信息

输出示例:

0       /bin
100M    /boot
...
15G     /home
20G     /var
3G      /usr

从输出可以看出 /var 目录占了 20G,是大头。

2. 继续往下查 /var 目录

du -sh /var/* 2>/dev/null | sort -rh | head -10

参数说明:

  • sort -rh:按大小倒序排列
  • head -10:只显示前10个最大的

输出示例:

15G     /var/log
3G      /var/lib
1G      /var/cache
...

继续往下查,直到找到具体是哪个文件最大。

第三步:查找最大的单个文件

如果目录太大不好定位,直接找整个系统里最大的文件:

1. 查找大于100M的文件

find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{print $5, $9}'

参数说明:

  • -type f:只找文件,不找目录
  • -size +100M:找大于100M的文件
  • 2>/dev/null:忽略权限报错

2. 按大小排序显示前20个最大文件

find / -type f -size +10M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -20

这样就能列出系统里最大的20个文件,一目了然。

常见的磁盘占用大户

根据经验,Linux 磁盘占用大通常是这几个地方:

1. 日志文件(/var/log)

这是最常见的。服务跑久了日志文件会越来越大,尤其是:

  • Nginx 访问日志、错误日志
  • MySQL 慢查询日志、错误日志
  • 系统日志 messages、syslog

排查方法:

du -sh /var/log/* | sort -rh | head -10

2. 已删除但仍被进程占用的文件

有时候你删掉了大文件,但磁盘空间没释放,因为还有进程在占用这个文件的句柄。

排查方法:

lsof | grep deleted

如果看到很多 deleted 状态的文件,说明有进程占用着已删除的文件。重启对应的进程就能释放空间。

3. 缓存文件(/var/cache)

yum 下载的缓存包、APT 的缓存都在这里,时间久了会积累很多。

清理方法:

yum clean all

4. Docker 镜像和容器

如果用了 Docker,镜像、容器、日志都会占很多空间。

排查方法:

docker system df

清理方法:

docker system prune -a

安全清理方法

找到大文件后,不要直接 rm -rf 删了就完事,要注意安全:

1. 日志文件:清空而不是删除

如果是日志文件,不要删文件本身,而是清空内容:

> /var/log/nginx/access.log

或者:

echo "" > /var/log/nginx/access.log

这样文件还在,但内容清空了,不会影响正在写入的进程。

2. 大文件:先确认再删除

删之前一定要确认这个文件是不是真的不需要了:

ls -lh /path/to/file
head -20 /path/to/file  # 看看内容是什么

确认没问题再删:

rm -f /path/to/file

3. 已删除但被占用的文件

如果删掉文件后空间没释放,找到占用的进程并重启:

lsof | grep deleted
# 找到对应的 PID,重启服务
systemctl restart nginx

常见坑

坑1:用 du 查到的大小和 df 不一致

有时候 df 显示磁盘满了,但 du -sh /* 加起来远没到那个数。这通常是因为:

  • 有已删除但仍被进程占用的文件
  • 挂载点下还有其他挂载

解决: 用 lsof | grep deleted 找被占用的已删除文件,重启对应进程释放空间。

坑2:删了文件空间没释放

这就是上面说的坑——文件被进程占用着,虽然删了但空间没释放。必须重启进程才能释放。

坑3:直接删日志文件导致服务异常

很多人直接 rm -f /var/log/nginx/access.log,结果 Nginx 还在往这个已经不存在的文件里写,日志就丢了。正确做法是清空内容而不是删除文件:> /var/log/nginx/access.log。

总结

排查磁盘占用的标准流程:

  1. df -h 看哪个分区满了
  2. du -sh /* | sort -rh 找最大的目录
  3. find / -type f -size +100M 找最大的文件
  4. 确认文件用途后再清理
  5. 日志文件清空内容,不要直接删文件

日常运维建议配置 logrotate 自动切割日志,避免日志越积越大。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:26 

Linux查看服务器开放端口,netstat和ss命令使用教程

前言

部署完网站后,经常需要确认某个端口是否真的开放了,或者排查服务有没有正常监听。Linux 下最常用的两个工具就是 netstat 和 ss。netstat 是老经典,几乎所有系统都自带;ss 是 iproute2 套件里的新工具,性能更好、信息更全。本文把这两个命令的常用用法都整理出来,新手照着抄就行。

netstat 命令用法

1. 查看所有监听端口

netstat -tlnp

参数说明:

  • -t:只显示 TCP 连接
  • -l:只显示监听状态的端口
  • -n:以数字形式显示端口号,不做域名解析
  • -p:显示占用端口的进程名和 PID

输出示例:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1234/sshd
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5678/nginx
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      5678/nginx

2. 查看 UDP 端口

netstat -ulnp

把 -t 换成 -u 就是查看 UDP 端口。

3. 查看所有端口(TCP+UDP)

netstat -tulnp

4. 查看指定端口是否被占用

netstat -tlnp | grep 80

如果 80 端口被占用,会输出对应的进程信息。

5. 查看所有网络连接(不只是监听)

netstat -an

-a 表示显示所有连接,不只是监听状态的。

ss 命令用法

ss 是 netstat 的替代品,在服务器上性能更好,尤其是连接数很多的时候。

1. 查看所有监听端口

ss -tlnp

参数和 netstat 基本一样:

  • -t:TCP
  • -l:监听状态
  • -n:数字形式
  • -p:显示进程

2. 查看 UDP 端口

ss -ulnp

3. 查看所有端口(TCP+UDP)

ss -tulnp

4. 查看指定端口

ss -tlnp | grep 443

5. 查看所有已建立的连接

ss -tn state established

可以用来统计当前服务器有多少个活跃连接。

6. 查看某个IP的连接

ss -tn dst 192.168.1.100

查看和 192.168.1.100 之间的所有连接。

两个命令的区别

对比项 netstat ss
性能 连接数多的时候很慢 非常快
来源 net-tools 包 iproute2 包
兼容性 几乎所有 Linux 都有 新系统默认自带
功能 基础网络查询 更丰富的过滤功能

建议: 日常排查用 ss 更高效,老系统上找不到 ss 再用 netstat。

常见坑

坑1:看不到进程信息

执行 netstat -tlnp 或 ss -tlnp 时,如果看不到 PID/Program name 那一列,说明你不是 root 用户。加上 sudo 再执行:

sudo netstat -tlnp
sudo ss -tlnp

坑2:端口显示是 :: 而不是 0.0.0.0

0.0.0.0:80 表示监听所有 IPv4 地址的 80 端口;:::80 表示监听所有 IPv6 地址的 80 端口(同时也兼容 IPv4)。这两种都能从外网访问,不用担心。

坑3:查不到端口但服务明明启动了

检查一下服务是不是只监听了 127.0.0.1。如果 Local Address 显示的是 127.0.0.1:80,那外网是访问不了的,只能本机访问。需要修改服务配置监听 0.0.0.0。

总结

查看 Linux 开放端口记住这几个核心命令就够了:

  • 常用查看:ss -tlnp 或 netstat -tlnp
  • 查指定端口:ss -tlnp | grep 端口号
  • 查UDP端口:ss -ulnp

日常排查优先用 ss,速度快信息全;老系统没 ss 再用 netstat。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:24 

CentOS7 firewalld开放80、443端口永久生效命令

CentOS 7 默认使用 firewalld 作为防火墙管理工具。很多新手搭建网站后发现外网访问不了,90% 都是因为 80、443 端口没开放。下面是完整的操作步骤,照抄就能用。

1. 先确认防火墙状态

systemctl status firewalld

如果显示 active (running) 说明防火墙正在运行,需要继续下面的操作。如果是 inactive 那就是防火墙没开,问题不在这里。

2. 开放 80 端口(HTTP)

firewall-cmd --zone=public --add-port=80/tcp --permanent

参数说明:

  • --zone=public:作用域为公共区域
  • --add-port=80/tcp:开放 80 端口,TCP 协议
  • --permanent:永久生效,不加这个重启服务器就失效了

3. 开放 443 端口(HTTPS)

firewall-cmd --zone=public --add-port=443/tcp --permanent

4. 一次性开放多个端口

如果需要同时开放多个端口,可以一条命令搞定:

firewall-cmd --zone=public --add-port=80/tcp --add-port=443/tcp --permanent

5. 重载防火墙使配置生效

⚠️ 重点:开放端口后必须重载,否则不生效!

firewall-cmd --reload

6. 查看已开放的端口

确认一下端口有没有真正开放成功:

firewall-cmd --list-ports

正常会输出类似:

80/tcp 443/tcp

7. 常用其他端口开放命令

SSH 端口(默认22,建议改成别的):

firewall-cmd --zone=public --add-port=22/tcp --permanent

MySQL 端口(如果需要远程连接数据库):

firewall-cmd --zone=public --add-port=3306/tcp --permanent

Redis 端口:

firewall-cmd --zone=public --add-port=6379/tcp --permanent

8. 移除/关闭已开放的端口

如果某个端口不需要了,想关掉:

firewall-cmd --zone=public --remove-port=8080/tcp --permanent
firewall-cmd --reload

常见坑

  1. 加了 --permanent 还是不生效?
    忘记 firewall-cmd --reload 了。永久配置写入后必须重载才会加载到运行时。

  2. 端口开放了还是访问不了?
    检查云服务商的安全组(阿里云/腾讯云/华为云都有这个东西),防火墙和安全组是两层,都要开。

  3. firewalld 命令找不到?
    CentOS 7 最小化安装可能没装,执行 yum install firewalld -y 安装。

  4. 临时开放端口(重启就失效)
    去掉 --permanent 参数就是临时开放,重启或 reload 后自动关闭。


遇到服务器、Nginx、MySQL 报错,可以加微信远程协助排查问题。


emer 发布于  2026-10-4 19:22 

Nginx 日志分析技巧

Nginx 日志分析技巧

Nginx 日志是排查问题、分析流量的重要工具。学会看日志,网站问题排查效率翻倍。

1. 日志位置

# 默认访问日志
/var/log/nginx/access.log

# 默认错误日志
/var/log/nginx/error.log

可以在 nginx.conf 里自定义:

access_log /var/log/nginx/www.access.log;
error_log /var/log/nginx/www.error.log;

2. 日志格式

默认日志格式:

127.0.0.1 - - [04/Oct/2026:10:00:00 +0800] "GET / HTTP/1.1" 200 612 "https://www.baidu.com/" "Mozilla/5.0..."

各字段含义:

  • IP 地址
  • 请求时间
  • 请求方法和路径
  • 状态码
  • 响应大小
  • 来源页面
  • User-Agent

3. 常用分析命令

# 查看访问量前10的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head 10

# 查看访问量前10的页面
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head 10

# 查看状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -nr

# 查看 404 请求
grep ' 404 ' access.log

# 查看 502 错误
grep ' 502 ' access.log

4. 排查问题

排查 502 错误:

grep ' 502 ' access.log | tail 20

排查慢请求:
开启慢日志:

slow_request_log /var/log/nginx/slow.log;
slow_request_time 5s;

排查爬虫:

grep 'Baiduspider' access.log
grep 'Googlebot' access.log

5. 流量统计

# 今天总访问量
grep '04/Oct/2026' access.log | wc -l

# 今天总流量
grep '04/Oct/2026' access.log | awk '{sum+=$10} END {print sum/1024/1024 " MB"}'

# 每小时访问量
awk '{print $4}' access.log | cut -d: -f2 | uniq -c

6. 日志切割

日志太大要切割,用 logrotate:

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    notifempty
    create 0640 nginx adm
    postrotate
        systemctl reload nginx
    endscript
}

7. 常用工具

  • GoAccess:实时日志分析工具
  • ELK:Elasticsearch + Logstash + Kibana
  • Zabbix:监控告警

总结

Nginx 日志分析核心:

  • 位置:/var/log/nginx/
  • 命令:awk + sort + uniq
  • 排查:看状态码、看慢请求
  • 切割:用 logrotate

学会这些,日常日志分析基本够用了。


emer 发布于  2026-10-4 11:08 

Linux 防火墙配置技巧

Linux 防火墙配置技巧

服务器安全第一步就是配好防火墙,只开需要的端口,其他全关。

1. firewalld(CentOS 7+ 默认)

# 查看状态
firewall-cmd --state

# 查看已开放端口
firewall-cmd --list-ports

# 开放端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp

# 开放多个端口
firewall-cmd --permanent --add-port=8000-9000/tcp

# 开放指定 IP 访问
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' port protocol='tcp' port=3306 accept"

# 重载配置(必须重载才生效)
firewall-cmd --reload

# 删除端口
firewall-cmd --permanent --remove-port=8080/tcp

2. ufw(Ubuntu 默认)

# 查看状态
ufw status

# 开启防火墙
ufw enable

# 允许 SSH
ufw allow 22

# 允许 80 和 443
ufw allow 80
ufw allow 443

# 允许指定 IP
ufw allow from 192.168.1.100 to any port 3306

# 拒绝某个 IP
ufw deny from 1.2.3.4

# 删除规则
ufw delete allow 8080

3. iptables(经典)

# 查看规则
iptables -L -n

# 允许 22 端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许 80 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 默认拒绝其他
iptables -P INPUT DROP

# 保存规则(CentOS)
service iptables save

4. 安全建议

  • 只开必要端口:SSH、HTTP、HTTPS,其他全关
  • SSH 改端口:不要用默认 22,改成其他端口
  • 限制 SSH 登录 IP:只允许你的 IP 登录 SSH
  • 数据库不对外暴露:MySQL、Redis 只允许本地访问
  • 定期查看日志:/var/log/secure 看有没有暴力破解

5. 常用端口速查

  • 22:SSH
  • 80:HTTP
  • 443:HTTPS
  • 3306:MySQL
  • 6379:Redis
  • 8080:应用端口

总结

Linux 防火墙核心:

  • CentOS 用 firewalld
  • Ubuntu 用 ufw
  • 只开必要端口
  • 数据库不对外暴露
  • SSH 限制 IP 访问

配好防火墙,服务器安全提升一大截。


emer 发布于  2026-10-4 10:52 

Linux 文件权限详解

Linux 文件权限详解

Linux 权限是服务器安全的基础,搞懂权限,服务器才不会乱。

1. 查看权限

用 ls -l 查看文件权限:

ls -l file.txt
-rw-r--r-- 1 user group 1024 Oct 4 10:00 file.txt

开头10个字符就是权限:

  • 第1个:文件类型(- 普通文件,d 目录)
  • 第2-4个:所有者权限
  • 第5-7个:所属组权限
  • 第8-10个:其他人权限

2. 三种权限

  • r(读)= 4
  • w(写)= 2
  • x(执行)= 1

数字加起来就是权限值:

  • 7 = 4+2+1 = rwx
  • 6 = 4+2 = rw-
  • 5 = 4+1 = r-x
  • 4 = 4 = r--

3. 修改权限 chmod

# 给所有者加执行权限
chmod u+x file.txt

# 给所有人只读权限
chmod 444 file.txt

# 所有者读写执行,组和其他人只读
chmod 744 file.txt

4. 修改所有者 chown

# 修改文件所有者
chown user:group file.txt

# 递归修改目录
chown -R user:group /data/www

5. 常用权限

  • 普通文件:644(所有者读写,其他人只读)
  • 目录:755(所有者读写执行,其他人读执行)
  • 脚本文件:755(所有者能执行)

6. 安全建议

  • 网站目录不要用 root 所有者
  • 上传目录禁止执行权限
  • 配置文件权限设为 600,只有所有者能读

总结

Linux 权限核心就是三组(所有者、组、其他人)× 三种(读、写、执行),用数字表示就是 r=4、w=2、x=1。搞懂这个,日常权限管理基本够用了。


emer 发布于  2026-10-4 10:45 

Linux 进程管理命令

Linux 进程管理常用命令

服务器上跑了多少进程?哪个进程占内存多?怎么杀进程?这些命令必须会。

1. 查看进程

# 查看所有进程
ps aux

# 查找指定进程
ps aux | grep nginx

# 实时查看
top

2. top 命令详解

top 是最常用的进程查看工具:

  • 第一行:系统负载
  • 第二行:任务数
  • 第三行:CPU 使用率
  • 第四行:内存使用
  • 第五行:Swap 使用

按 q 退出,按 k 杀进程。

3. 杀进程

# 按 PID 杀
kill 1234

# 强制杀
kill -9 1234

# 按名字杀
pkill nginx

# 杀掉所有同名进程
killall nginx

4. 查看端口占用

# 查看端口被谁占了
netstat -tlnp | grep 80

# 或者用 ss
ss -tlnp | grep 80

5. 查看进程树

# 查看进程父子关系
pstree

# 查看某个进程的子进程
pstree -p 1234

6. 后台运行

# 后台运行
nohup ./script.sh &

# 查看后台任务
jobs

# 把任务调到前台
fg %1

7. 查看资源占用

# 内存占用排行
ps aux --sort=-%mem | head

# CPU 占用排行
ps aux --sort=-%cpu | head

总结

日常运维就这几个命令:ps、top、kill、netstat、nohup。学会这些,服务器进程管理基本够用了。


emer 发布于  2026-10-4 10:38 

Linux 常用命令:从文件操作到进程管理的完整指南

前言

Linux 是后端开发的必修课。很多新手面对黑窗口就发怵,其实只要掌握常用命令,日常开发就够用了。本文整理最常用的 Linux 命令。

一、文件操作

1. 查看目录

# 列出当前目录文件
ls

# 详细信息
ls -l

# 包括隐藏文件
ls -la

# 按时间排序
ls -lt

2. 切换目录

# 进入目录
cd /home/user

# 回到上一级
cd ..

# 回到用户主目录
cd ~

# 回到上次目录
cd -

3. 创建目录

# 创建目录
mkdir test

# 递归创建多级目录
mkdir -p a/b/c

4. 创建文件

# 创建空文件
touch test.txt

# 写入内容
echo "hello" > test.txt

# 追加内容
echo "world" >> test.txt

5. 复制文件

# 复制文件
cp test.txt test2.txt

# 复制目录
cp -r dir1 dir2

6. 移动/重命名

# 移动文件
mv test.txt /tmp/

# 重命名
mv old.txt new.txt

7. 删除文件

# 删除文件
rm test.txt

# 删除目录
rm -rf dir1

警告:rm -rf 很危险,一定要确认路径!

二、查看文件内容

1. cat

# 查看整个文件
cat test.txt

2. less

# 分页查看
less test.log

# 快捷键:
# 空格:下一页
# b:上一页
# /关键字:搜索
# q:退出

3. head / tail

# 看前 10 行
head -10 test.txt

# 看后 10 行
tail -10 test.txt

# 实时看日志(最常用)
tail -f /var/log/nginx/access.log

三、查找文件

1. find

# 按文件名查找
find / -name "nginx.conf"

# 按大小查找(大于 100M)
find / -size +100M

# 按修改时间查找(7 天内修改的)
find / -mtime -7

2. grep

# 在文件里搜索
grep "error" test.log

# 不区分大小写
grep -i "error" test.log

# 显示行号
grep -n "error" test.log

# 递归搜索目录
grep -r "function" /var/www/

# 配合管道使用
ps aux | grep nginx

四、系统状态

1. 查看进程

# 所有进程
ps aux

# 查找进程
ps aux | grep nginx

2. 杀死进程

# 按 PID 杀
kill 1234

# 强制杀
kill -9 1234

# 按名字杀
pkill nginx

3. 查看端口

# 查看所有监听端口
netstat -tlnp

# 查看某个端口
netstat -tlnp | grep 80

4. 查看磁盘

# 磁盘使用情况
df -h

# 当前目录大小
du -sh .

# 每个子目录大小
du -sh *

5. 查看内存

free -h

五、权限管理

1. chmod

# 给文件加执行权限
chmod +x test.sh

# 755:所有者可读写执行,其他人可读执行
chmod 755 test.sh

# 644:所有者可读写,其他人只读
chmod 644 test.txt

2. chown

# 修改文件所有者
chown www:www test.txt

六、压缩解压

1. tar

# 压缩
tar -zcvf website.tar.gz /var/www/html

# 解压
tar -zxvf website.tar.gz

2. zip

# 压缩
zip -r website.zip /var/www/html

# 解压
unzip website.zip

七、网络相关

1. curl

# 访问网页
curl https://www.baidu.com

# 查看响应头
curl -I https://www.baidu.com

# 发 POST 请求
curl -X POST -d "name=张三" https://api.example.com

2. wget

# 下载文件
wget https://example.com/file.zip

八、常用快捷键

快捷键 作用
Ctrl + C 终止当前命令
Ctrl + Z 暂停当前命令
Ctrl + D 退出终端
Tab 自动补全
Ctrl + R 搜索历史命令
!命令 执行最近一次的某命令

九、常用操作速查

操作 命令
看文件 cat / less / tail -f
找文件 find / grep
看进程 ps aux / top
看端口 netstat -tlnp
看磁盘 df -h / du -sh
改权限 chmod / chown

总结

Linux 常用命令的核心要点:

  1. 文件操作:ls / cd / mkdir / cp / mv / rm
  2. 查看内容:cat / less / tail -f
  3. 查找搜索:find / grep
  4. 进程管理:ps / kill / netstat
  5. 系统状态:df / du / free

不用背,用多了自然就记住了。先把这几个常用的练熟,日常开发基本够用。


emer 发布于  2026-10-4 10:17 

Linux 服务器安全加固:10个必须做的基础配置

前言

刚装完的 Linux 服务器就像没锁门的房子,任何人都能进来。本文整理了 10 个最基础但最重要的安全加固配置,帮你把门锁上。

1. 修改 SSH 端口,禁止 root 登录

默认 22 端口是黑客扫描的首选目标,改个端口能挡掉 90% 的自动扫描。

# 编辑 sshd 配置
vi /etc/ssh/sshd_config

# 修改端口
Port 22222

# 禁止 root 登录
PermitRootLogin no

# 重启 sshd
systemctl restart sshd

注意:改完端口后,记得在防火墙和安全组里放行新端口,否则你自己也进不去了。

2. 使用 SSH 密钥登录,禁用密码登录

密码再复杂也扛不住暴力破解,密钥登录才是正道。

# 本地生成密钥对(在你自己的电脑上执行)
ssh-keygen -t ed25519 -C "your_email@example.com"

# 把公钥传到服务器
ssh-copy-id -p 22222 user@your_server_ip

# 服务器上禁用密码登录
vi /etc/ssh/sshd_config
PasswordAuthentication no

3. 配置防火墙,只开必要端口

# 只开 SSH、HTTP、HTTPS
ufw default deny incoming
ufw default allow outgoing
ufw allow 22222/tcp   # SSH
ufw allow 80/tcp      # HTTP
ufw allow 443/tcp     # HTTPS
ufw enable

4. 自动安全更新

# Ubuntu/Debian
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

# CentOS/RHEL
dnf install dnf-automatic
systemctl enable --now dnf-automatic.timer

5. 创建普通用户,配置 sudo

永远不要用 root 跑日常操作,创建一个普通用户,需要时用 sudo 提权。

# 创建用户
adduser deploy

# 加入 sudo 组
usermod -aG sudo deploy

6. 禁用不必要的服务

# 查看正在运行的服务
systemctl list-unit-files --type=service --state=enabled

# 禁用不需要的服务
systemctl disable --now avahi-daemon
systemctl disable --now cups

7. 配置 fail2ban 防暴力破解

apt install fail2ban

# 配置 sshd 防护
vi /etc/fail2ban/jail.local

[sshd]
enabled = true
port = 22222
maxretry = 3
bantime = 3600

systemctl restart fail2ban

8. 设置密码策略

# 编辑 pwquality 配置
vi /etc/security/pwquality.conf

minlen = 12          # 最小长度
dcredit = -1         # 至少1个数字
ucredit = -1         # 至少1个大写字母
lcredit = -1         # 至少1个小写字母
ocredit = -1         # 至少1个特殊字符

9. 监控日志,定期检查

# 查看登录失败记录
grep "Failed password" /var/log/auth.log

# 查看当前登录用户
w

# 查看最近登录记录
last -n 20

10. 定期备份,备份再备份

安全加固做得再好,也不如有一份能快速恢复的备份。

# 简单的文件备份脚本
tar -czf backup_$(date +%Y%m%d).tar.gz /var/www/

把备份文件同步到异地存储,别只放在同一台服务器上。

总结

这 10 条配置不需要高深的技术,但每一条都能实实在在地降低服务器被攻破的风险。建议新服务器装好后,第一件事就是把这 10 条全部过一遍。

安全不是一次性的工作,而是一个持续的过程。定期更新系统、监控日志、检查异常,才能真正把服务器守好。


emer 发布于  2026-10-4 09:53