Linux软件包管理,yum常用命令汇总

前言

CentOS 装软件怎么装?装完怎么卸?找不到某个软件包名怎么办?这些都需要用到 yum 命令。yum 是 CentOS/RHEL 系统的软件包管理器,自动解决依赖关系,比 rpm 好用多了。本文就把 yum 常用命令汇总一下,装软件、卸软件、查软件都能用。

安装软件

安装软件包

yum install nginx -y

-y 表示自动确认,不用手动输 y。

安装多个软件包

yum install nginx mysql php -y

重新安装

yum reinstall nginx -y

软件装坏了想重装,用这个。

卸载软件

卸载软件包

yum remove nginx -y

卸载并删除依赖

yum autoremove nginx -y

把安装 nginx 时自动装上的依赖也一起删掉。

更新软件

更新所有软件

yum update -y

注意: 这个会把所有软件都更新一遍,包括内核。生产环境慎用,可能会把系统搞挂。

更新某个软件

yum update nginx -y

只更新 nginx。

检查哪些软件可以更新

yum check-update

查找软件

搜索软件包

yum search nginx

模糊搜索,输出所有名字或描述里包含 nginx 的包。

查找文件属于哪个包

yum provides /usr/sbin/nginx

你知道某个文件路径,但不知道是哪个包装的,用这个查。

查看软件包信息

yum info nginx

输出软件包的详细信息:版本、大小、描述等。

查看已安装软件

列出所有已安装的包

yum list installed

太多了可以配合 grep:

yum list installed | grep nginx

查看某个软件装没装

yum list installed nginx

仓库管理

查看已启用的仓库

yum repolist

查看所有仓库(包括禁用的)

yum repolist all

清理缓存

yum clean all

yum 下载的包会缓存下来,占磁盘空间。定期清理一下。

重建缓存

yum makecache

常用场景

场景1:装 Nginx

yum install nginx -y
systemctl start nginx
systemctl enable nginx

场景2:不知道软件包名

想装个下载工具,但不知道叫什么。

yum search wget

或者:

yum search curl

场景3:某个命令找不到

输入 ifconfig 提示 command not found,不知道是哪个包装的。

yum provides ifconfig

会告诉你是 net-tools 包提供的,装一下:

yum install net-tools -y

场景4:软件版本太旧

CentOS7 自带的软件版本都比较老,比如 Nginx 是 1.20。想用新版本,需要加第三方源。

装 EPEL 源:

yum install epel-release -y

装完 EPEL 源之后,就能装更多软件包了。

常见坑

坑1:yum install 不加 -y

不加 -y 的话,安装到一半会停下来问你 Is this ok [y/d/N],自动化脚本里很容易卡在这里。

解决: 命令后面加 -y:

yum install nginx -y

坑2:yum update 把系统搞挂了

生产环境跑了 yum update -y,结果内核更新了,重启之后服务起不来。

解决: 生产环境不要随便 yum update,要更新就单独更新某个软件:

yum update nginx -y

坑3:找不到软件包

用默认源搜不到某个软件,比如 Docker、Node.js 这些。

解决: 加第三方源,比如 EPEL:

yum install epel-release -y

坑4:yum 缓存满了

yum 缓存的包占了很多磁盘空间。

解决: 定期清理:

yum clean all

总结

yum 常用命令:

命令 作用
yum install 包名 -y 安装软件
yum remove 包名 -y 卸载软件
yum update 包名 -y 更新软件
yum search 关键词 搜索软件
yum provides 文件路径 查文件属于哪个包
yum info 包名 查看软件包信息
yum list installed 列出已安装的包
yum repolist 查看仓库列表
yum clean all 清理缓存

记住这几个,CentOS 日常装软件就够用了。

遇到问题加QQ23979811 协助处理


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

Linux文件权限详解,chmod和chown命令使用

前言

Nginx 报 403 Forbidden?文件改完了不生效?权限不对导致各种奇怪问题?Linux 的文件权限是新手最容易搞混的地方。什么是 rwx?755 和 644 有什么区别?chown 和 chmod 分别是干嘛的?本文就把 Linux 文件权限讲明白,让你一看就懂。

查看文件权限

用 ls -l 查看文件详细信息:

ls -l /var/www/html/index.html

输出示例:

-rw-r--r-- 1 nginx nginx 1234 Oct  5 10:30 /var/www/html/index.html

权限字符串详解

最开头的 -rw-r--r-- 就是权限,拆解一下:

-  rw-  r--  r--
①  ②    ③    ④
  • ① 文件类型: - 是普通文件,d 是目录,l 是链接
  • ② 所有者权限(user): rw- = 可读可写,不可执行
  • ③ 所属组权限(group): r-- = 只读
  • ④ 其他人权限(other): r-- = 只读

rwx 含义

字符 含义 数字
r 读(read) 4
w 写(write) 2
x 执行(execute) 1

所以:

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

常用权限数字

数字 权限 说明
755 rwxr-xr-x 所有者可读写执行,其他人可读执行(常用目录、脚本)
644 rw-r--r-- 所有者可读写,其他人只读(常用文件)
700 rwx------ 只有所有者能读写执行(私密文件)
600 rw------- 只有所有者能读写(私密文件)
777 rwxrwxrwx 所有人都能读写执行(不安全,尽量别用)

记住两个最常用的:

  • 目录用 755
  • 文件用 644

chmod 修改权限

数字方式

chmod 755 /var/www/html

把目录权限改成 755。

chmod 644 /var/www/html/index.html

把文件权限改成 644。

递归修改

chmod -R 755 /var/www/html/

把目录下所有文件和子目录都改成 755。

注意: 递归修改的时候要小心,一般文件应该是 644,目录是 755。如果全部改成 755,文件就能执行了,不安全。

字母方式

chmod u+x script.sh

给所有者加执行权限。

chmod g+w file.txt

给所属组加写权限。

chmod o-r file.txt

去掉其他人的读权限。

  • u:所有者
  • g:所属组
  • o:其他人
  • +:加权限
  • -:减权限

chown 修改所有者

修改文件所有者

chown nginx /var/www/html/index.html

把文件所有者改成 nginx。

修改所有者和所属组

chown nginx:nginx /var/www/html/index.html

所有者改成 nginx,所属组也改成 nginx。

递归修改

chown -R nginx:nginx /var/www/html/

把整个目录的所有者和所属组都改成 nginx。

实际应用场景

场景1:Nginx 报 403

Nginx 访问网站报 403 Forbidden,一般是权限不对。

ls -l /var/www/html/index.html

看所有者和权限。如果文件是 root 的,Nginx 进程读不到,就会 403。

chown nginx:nginx /var/www/html/index.html
chmod 644 /var/www/html/index.html

场景2:脚本不能执行

写了个 shell 脚本,运行提示 Permission denied。

chmod +x script.sh

加执行权限就能跑了。

场景3:目录权限不对

网站目录权限不对,上传的图片打不开。

chmod -R 755 /var/www/html/
chown -R nginx:nginx /var/www/html/

常见坑

坑1:chmod 777 解决一切

很多人一遇到权限问题就 chmod 777,这是最懒也最不安全的做法。777 意味着所有人都能读写执行,黑客上传个木马就直接跑了。

正确做法: 文件用 644,目录用 755,所有者设成运行服务的用户。

坑2:只改权限不改所有者

权限对了,但所有者不对,服务还是读不到文件。

解决: 权限和所有者都要对。比如 Nginx 运行用户是 nginx,文件所有者也要是 nginx。

坑3:递归 chmod 把文件也改成 755

chmod -R 755 把所有文件都改成可执行了,不安全。

正确做法: 目录用 755,文件用 644。可以用 find 分开改:

find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

坑4:改了权限不生效

改了权限但还是不对,看看是不是有 SELinux 在捣乱。

解决: 先临时关掉 SELinux 测试:

setenforce 0

如果关了就好了,说明是 SELinux 的问题。

总结

Linux 文件权限核心:

  1. rwx = 4+2+1
  2. 目录用 755,文件用 644
  3. chmod 改权限,chown 改所有者
  4. 不要随便用 777

记住两个最常用的:目录 755,文件 644。遇到权限问题先 ls -l 看看,再改,别上来就 777。

遇到问题加QQ23979811 协助处理


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

Linux用户和组管理,useradd和groupadd命令使用

前言

服务器上需要给开发人员开个账号?或者给不同的人分配不同的权限?这就需要用到 Linux 的用户和组管理。Linux 是多用户系统,每个用户有自己的家目录和权限。学会用户和组管理,是运维的基本功。本文就讲一下怎么创建、删除、修改用户和组。

创建用户

基本创建

useradd testuser

这样就创建了一个叫 testuser 的用户。默认会:

  • 创建一个同名的组
  • 创建家目录 /home/testuser
  • 指定 shell 为 /bin/bash

设置密码

passwd testuser

输入两次密码就好了。注意: 新建的用户默认是不能登录的,必须设密码才能登录。

创建用户时指定参数

useradd -m -s /bin/bash -G wheel testuser

参数说明:

  • -m:自动创建家目录
  • -s /bin/bash:指定默认 shell
  • -G wheel:把用户加入 wheel 组(可以用 sudo)

查看用户信息

id testuser

输出用户的 UID、GID、所属组。

cat /etc/passwd

查看所有用户。

删除用户

userdel testuser

这样只删用户,不删家目录。

如果要连家目录一起删:

userdel -r testuser

注意: -r 会把用户的家目录和邮件都删掉,小心操作。

修改用户

修改用户名

usermod -n newname oldname

修改用户的家目录

usermod -d /home/newhome testuser

把用户加入某个组

usermod -aG wheel testuser

-aG 表示追加到组,不要只用 -G,不然会把原来的组都覆盖掉。

锁定用户

usermod -L testuser

锁定后用户不能登录。

解锁用户

usermod -U testuser

组管理

创建组

groupadd developers

删除组

groupdel developers

查看用户属于哪些组

groups testuser

把用户加入组

usermod -aG developers testuser

从组里删除用户

gpasswd -d testuser developers

sudo 权限

把用户加入 wheel 组(CentOS 默认支持 sudo 的组)

usermod -aG wheel testuser

这样 testuser 就可以用 sudo 执行 root 命令了。

编辑 sudoers 文件

visudo

在文件里添加:

testuser ALL=(ALL)       ALL

这样 testuser 也有 sudo 权限。

注意: 一定要用 visudo 编辑,不要直接改 /etc/sudoers,改坏了 sudo 就用不了了。

查看登录历史

谁在线

w

历史登录记录

last

谁在执行 sudo

lastcomm

实际应用场景

场景1:给开发人员开账号

useradd -m -s /bin/bash dev01
passwd dev01
usermod -aG developers dev01

场景2:给运维开 sudo 权限

useradd -m -s /bin/bash ops01
passwd ops01
usermod -aG wheel ops01

场景3:删除离职员工账号

userdel -r olduser

常见坑

坑1:userdel 没加 -r,家目录还在

只删了用户,家目录 /home/testuser 还在,占着磁盘空间。

解决: 删用户的时候加 -r:

userdel -r testuser

坑2:usermod -G 把原来的组覆盖了

用 -G 而不是 -aG,结果用户原来的组都没了,只剩新的组。

解决: 追加组用 -aG:

usermod -aG developers testuser

坑3:新建用户不能登录

创建了用户,但没设密码,结果不能登录。

解决: 创建完用户一定要设密码:

passwd testuser

坑4:visudo 改错了

直接用 vi 改 /etc/sudoers,改错了导致 sudo 用不了。

解决: 一定要用 visudo 命令编辑,它会检查语法。

总结

用户和组管理的核心命令:

  1. useradd:创建用户
  2. passwd:设置密码
  3. userdel -r:删除用户(连家目录)
  4. usermod -aG:把用户加入组
  5. groupadd:创建组
  6. groups:查看用户属于哪些组
  7. visudo:编辑 sudo 权限

用户管理是 Linux 安全的基础,每个用户用自己的账号,不要所有人都用 root。

遇到问题加QQ23979811 协助处理


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

Linux查看和修改系统时间,date和timedatectl命令

前言

服务器时间不对?日志时间戳对不上?定时任务不准?这些问题都和系统时间有关。Linux 服务器的时间很重要,日志、定时任务、证书过期时间都依赖系统时间。时间不准会出各种奇怪的问题。本文就讲一下怎么查看和修改 Linux 系统时间,以及怎么设置时区。

查看系统时间

方法一:date 命令

date

输出示例:

Mon Oct  5 10:30:45 CST 2026

CST 就是中国标准时间(China Standard Time)。

方法二:timedatectl 命令(推荐)

timedatectl

输出示例:

               Local time: Mon 2026-10-05 10:30:45 CST
           Universal time: Mon 2026-10-05 02:30:45 UTC
                 RTC time: Mon 2026-10-05 02:30:46
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

这个命令显示的信息更全:本地时间、UTC时间、硬件时间、时区、是否同步、NTP服务状态。

设置时区

查看当前时区

timedatectl

看 Time zone 那行。

查看所有可用时区

timedatectl list-timezones

或者:

ls /usr/share/zoneinfo/

设置时区为上海

timedatectl set-timezone Asia/Shanghai

这是最常用的,国内服务器一般都设成这个。

验证

timedatectl

看 Time zone 那行是不是变成了 Asia/Shanghai。

手动设置时间

不推荐手动设置

一般情况下,时间不准了应该用 NTP 自动同步,不要手动设。手动设的时间过一段时间又会不准。

但如果确实需要手动设:

设置日期和时间

date -s "2026-10-05 10:30:45"

只设置时间

date -s "10:30:45"

只设置日期

date -s "2026-10-05"

NTP 时间同步

安装 NTP 服务

CentOS7 用 chronyd:

yum install chrony -y

启动并设置开机自启

systemctl start chronyd
systemctl enable chronyd

查看同步状态

timedatectl

看 System clock synchronized: yes 就是同步成功了。

手动同步一次

chronyc makestep

常见时间格式

date 命令可以格式化输出:

输出年月日

date +%Y-%m-%d

输出:

2026-10-05

输出时分秒

date +%H:%M:%S

输出完整日期时间

date +"%Y-%m-%d %H:%M:%S"

时间戳

date +%s

输出 Unix 时间戳(秒数)。

从时间戳转换

date -d @1728100000

实际应用场景

场景1:日志时间不对

看日志发现时间戳不对,先查系统时间:

date

如果时间不对,改时区:

timedatectl set-timezone Asia/Shanghai

场景2:定时任务不准

crontab 定时任务执行时间不对,先看系统时间:

date

时间不对就同步 NTP。

场景3:证书过期时间不对

SSL 证书过期时间对不上,也是系统时间的问题。

场景4:脚本里用到时间戳

写脚本的时候需要获取当前时间戳:

now=$(date +%s)

常见坑

坑1:时区不对导致日志时间差8小时

服务器装完默认是 UTC 时区,比北京时间晚8小时。

解决: 设置成上海时区:

timedatectl set-timezone Asia/Shanghai

坑2:改了时间但硬件时间没同步

手动改了系统时间,重启之后又变回去了,因为硬件时间(RTC)没改。

解决: 用 NTP 同步就不用管这个,NTP 会自动同步硬件时间。

坑3:NTP 服务没启动

装了 NTP 但没启动,时间还是不同步。

解决:

systemctl start chronyd
systemctl enable chronyd

坑4:手动设时间后过一会儿又不准了

手动设的时间不准,因为系统时钟会漂移。

解决: 用 NTP 自动同步,不要手动设。

总结

查看和修改系统时间的核心命令:

  1. date:快速看当前时间
  2. timedatectl:看完整时间信息(时区、NTP同步状态)
  3. timedatectl set-timezone Asia/Shanghai:设置时区
  4. chronyd:NTP时间同步服务

服务器时间一定要准,用 NTP 自动同步,不要手动设。国内服务器时区设成 Asia/Shanghai。

遇到问题加QQ23979811 协助处理


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

Linux添加Swap交换分区,解决内存不足问题

前言

服务器内存不够用了?MySQL 启动就报内存不足?或者运行着运行着就被 OOM Killer 杀进程了?这时候除了加内存条,还有个应急办法——加 Swap 交换分区。Swap 就是把磁盘的一部分当内存用,虽然慢,但能救急。本文就讲一下怎么在 Linux 下添加 Swap 交换分区。

什么是 Swap

Swap 交换分区,就是把磁盘的一部分空间当作内存来用。当物理内存不够的时候,系统会把不常用的内存数据换到磁盘上,腾出物理内存给正在用的进程。

注意: Swap 只是应急方案,不能当内存用。磁盘比内存慢几百倍,如果频繁使用 Swap,系统会非常卡。

第一步:查看当前 Swap 情况

先看看现在有没有 Swap,多大:

free -h

输出示例:

              total        used        free      shared  buff/cache   available
Mem:          1.8Gi       1.2Gi       200Mi        50Mi       400Mi       300Mi
Swap:            0B          0B          0B

上面的例子里 Swap 是 0B,说明没有配置 Swap。

也可以看:

swapon -s

第二步:创建 Swap 文件

我们用文件的方式创建 Swap,比分区方式灵活,随时可以删。

1. 创建一个 2G 的 Swap 文件

dd if=/dev/zero of=/swapfile bs=1M count=2048

参数说明:

  • if=/dev/zero:输入源,零设备
  • of=/swapfile:输出文件
  • bs=1M:块大小1M
  • count=2048:2048块,也就是2G

2. 设置文件权限

chmod 600 /swapfile

必须设置成 600,不然系统不认。

3. 格式化成 Swap

mkswap /swapfile

输出会显示:

Setting up swapspace version 1, size = 2097151 KiB
no label, UUID=xxxx-xxxx

第三步:启用 Swap

swapon /swapfile

查看是否启用成功:

free -h

现在应该能看到 Swap 那行有数值了。

第四步:配置开机自动挂载

写入 /etc/fstab,重启后自动启用。

vi /etc/fstab

在最后一行添加:

/swapfile swap swap defaults 0 0

第五步:调整 Swap 使用优先级

Linux 默认是尽量用物理内存,Swap 只用在内存不够的时候。这个策略一般不用改。

如果想调整 Swap 的使用倾向,可以改 /etc/sysctl.conf:

vm.swappiness = 10

swappiness 值范围是 0~100:

  • 0:尽量不用 Swap
  • 100:积极使用 Swap
  • 10:推荐值,内存不够才用 Swap

改完执行:

sysctl -p

常见操作

查看 Swap 使用情况

swapon -s

关闭 Swap

swapoff /swapfile

删除 Swap

swapoff /swapfile
rm /swapfile

然后把 /etc/fstab 里那行也删掉。

实际应用场景

场景1:MySQL 启动报内存不足

MySQL 启动的时候需要加载很多数据到内存,如果内存不够会直接启动失败。加个 Swap 就能启动了。

场景2:临时跑大任务

有时候要临时跑个大任务,内存不够,加个 Swap 救急。

场景3:防止 OOM Killer 杀进程

内存不够的时候,系统会用 OOM Killer 杀掉占内存最多的进程。加个 Swap 能缓冲一下,避免直接被杀。

常见坑

坑1:Swap 文件权限不对

创建完 Swap 文件之后忘了 chmod 600,结果 swapon 报错。

解决: 一定要先设置权限:

chmod 600 /swapfile

坑2:/etc/fstab 写错了

和挂载硬盘一样,/etc/fstab 写错了重启会进不去系统。

解决: 改完先执行 swapon -a 测试一下。

坑3:Swap 太大了影响性能

Swap 不是越大越好。如果 Swap 用得很频繁,系统会非常卡,因为磁盘比内存慢几百倍。

建议: Swap 大小设成物理内存的 0.5~2 倍就够了。比如 2G 内存,Swap 设 2~4G 就行。

坑4:SSD 上放 Swap 还好,机械硬盘上放 Swap 很卡

如果是机械硬盘,频繁读写 Swap 会非常卡。SSD 还好一点。

总结

添加 Swap 的完整流程:

  1. dd 创建 Swap 文件
  2. chmod 600 设置权限
  3. mkswap 格式化
  4. swapon 启用
  5. 写 /etc/fstab 开机自动挂载
  6. 调整 swappiness 优先级

Swap 只是应急方案,真正解决内存不足还是要加物理内存。但应急的时候,Swap 确实能救一命。

遇到问题加QQ23979811 协助处理


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

Linux添加新硬盘并挂载,fdisk和mkfs分区格式化

前言

服务器磁盘满了,加了一块新硬盘,但不知道怎么用?新硬盘插上去之后,Linux 是不能直接用的,需要先分区、格式化、挂载,最后还要配置开机自动挂载。整个流程看起来复杂,其实就几步。本文就以 CentOS7 为例,完整讲一下新硬盘从插入到挂载的全过程。

第一步:查看新硬盘有没有识别到

加完硬盘之后,先看看系统有没有识别到。

fdisk -l

输出会列出所有磁盘设备。一般系统盘是 /dev/sda,新硬盘就是 /dev/sdb、/dev/sdc 这样。

找到新硬盘,大小和你加的硬盘一致的那个就是。比如新硬盘是100G,找大小100G的那个设备。

注意: 千万别搞错设备名!格式化错了盘,数据就全没了。一定要确认大小对得上。

第二步:给新硬盘分区

用 fdisk 命令给新硬盘分区。这里我们分一个主分区,用完全部空间。

fdisk /dev/sdb

进入 fdisk 交互界面,按以下步骤操作:

1. 输入 n 创建新分区

Command (m for help): n

2. 选择主分区

Select (default p): p

3. 分区号选默认1

Partition number (1-4, default 1): 1

4. 起始扇区选默认

直接回车:

First sector (2048-209715199, default 2048): 回车

5. 结束扇区选默认(用完全部空间)

直接回车:

Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199): 回车

6. 输入 w 保存退出

Command (m for help): w

这样就分好区了,分区设备是 /dev/sdb1。

第三步:格式化分区

分完区之后,需要格式化成文件系统。一般用 ext4 或 xfs。

CentOS7 默认用 xfs:

mkfs.xfs /dev/sdb1

如果要用 ext4:

mkfs.ext4 /dev/sdb1

等待格式化完成,一般很快,几十秒就好。

第四步:创建挂载目录

先创建一个目录用来挂载新硬盘:

mkdir /data

第五步:挂载分区

把分区挂载到刚才创建的目录:

mount /dev/sdb1 /data

查看挂载结果:

df -h

输出里应该能看到 /dev/sdb1 挂载在 /data 目录。

第六步:配置开机自动挂载

上面的挂载重启之后就没了,需要写入 /etc/fstab 才能开机自动挂载。

1. 查看分区的 UUID

blkid /dev/sdb1

输出示例:

/dev/sdb1: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="xfs"

复制这个 UUID。

2. 编辑 /etc/fstab

vi /etc/fstab

在最后一行添加:

UUID=刚才复制的UUID /data xfs defaults 0 0

各字段含义:

  • 第一列:设备UUID
  • 第二列:挂载点
  • 第三列:文件系统类型(xfs 或 ext4)
  • 第四列:挂载参数(defaults 就够了)
  • 第五列:dump备份标记(0表示不备份)
  • 第六列:开机检查顺序(0表示不检查)

3. 测试配置是否正确

mount -a

如果没有报错,说明配置正确。如果报错了,千万别重启!重启可能进不去系统。

常见坑

坑1:格式化错了盘

这是最危险的坑!格式化错了盘,数据就全没了。

解决: 格式化之前一定要确认设备名是对的,用 fdisk -l 看大小,确认大小和你加的新硬盘一致再操作。

坑2:/etc/fstab 写错了,重启进不去系统

如果 /etc/fstab 写错了,重启的时候会卡在挂载界面,进不去系统。

解决: 改完 /etc/fstab 之后一定要先跑 mount -a 测试,确认没报错再重启。

坑3:挂载目录里有文件

如果挂载目录里已经有文件了,挂载之后原来的文件就看不到了(不是删了,是被覆盖了)。

解决: 挂载之前确认挂载目录是空的,或者先把原来的文件移走。

坑4:用设备名写 fstab,重启后变了

如果用 /dev/sdb1 写 fstab,下次重启之后硬盘顺序变了,可能就挂载错了。

解决: 用 UUID 写 fstab,UUID 是唯一的,不会变。

总结

新硬盘挂载的完整流程:

  1. fdisk -l:确认新硬盘设备名
  2. fdisk /dev/sdb:分区
  3. mkfs.xfs /dev/sdb1:格式化
  4. mkdir /data:创建挂载目录
  5. mount /dev/sdb1 /data:临时挂载
  6. blkid 查UUID:获取UUID
  7. 写 /etc/fstab:配置开机自动挂载
  8. mount -a:测试配置

整个流程走一遍以后,加硬盘就是熟练活了。

遇到问题加QQ23979811 协助处理


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

Linux查看系统版本和内核信息,cat /etc/os-release和uname命令

前言

刚拿到一台服务器,第一步就是看看是什么系统、什么版本、内核是多少。不同的系统版本配置方法不一样,CentOS7 和 CentOS8 的防火墙命令都不一样,Ubuntu 和 CentOS 的包管理器也不一样。所以第一件事就是确认系统版本。本文就讲一下怎么查看 Linux 系统版本和内核信息。

查看系统版本

方法一:cat /etc/os-release(推荐)

这是最通用的方法,所有现代 Linux 发行版都有这个文件:

cat /etc/os-release

CentOS7 输出示例:

NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

Ubuntu 输出示例:

NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"

重点看 NAME、VERSION、VERSION_ID 这几行。

方法二:cat /etc/redhat-release(CentOS/RHEL专用)

CentOS 和 RHEL 系统可以直接看这个文件:

cat /etc/redhat-release

输出:

CentOS Linux release 7.9.2009 (Core)

方法三:lsb_release -a

lsb_release -a

输出:

Distributor ID: CentOS
Description:    CentOS Linux release 7.9.2009 (Core)
Release:        7.9.2009
Codename:       Core

注意: 有些系统默认没装 lsb_release,需要先安装:

yum install redhat-lsb -y

方法四:hostnamectl

hostnamectl

输出会显示系统信息,包括操作系统和内核版本:

   Static hostname: localhost.localdomain
         Icon name: computer-vm
           Chassis: vm
        Machine ID: xxxxxxxx
           Boot ID: xxxxxxxx
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.el7.x86_64
      Architecture: x86-64

这个命令同时显示系统版本和内核版本,很方便。

查看内核版本

方法一:uname -a(最常用)

uname -a

输出示例:

Linux localhost 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:58 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

各段含义:

  • Linux:内核名
  • localhost:主机名
  • 3.10.0-1160.el7.x86_64:内核版本
  • #1 SMP ...:编译信息
  • x86_64 x86_64 x86_64:硬件架构、处理器类型、操作系统类型

方法二:uname -r

只看内核版本号:

uname -r

输出:

3.10.0-1160.el7.x86_64

内核版本号拆解:

  • 3:主版本
  • 10:次版本
  • 0:修订版本
  • 1160:RHEL补丁号
  • el7:Enterprise Linux 7
  • x86_64:64位

方法三:cat /proc/version

cat /proc/version

输出:

Linux version 3.10.0-1160.el7.x86_64 (mockbuild@x86-01.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:58 UTC 2020

查看系统架构

uname -m

输出:

x86_64

说明是64位系统。如果输出 i686 就是32位。

或者用:

arch

实际应用场景

场景1:刚拿到服务器,先确认系统版本

cat /etc/os-release
uname -r

确认是 CentOS7 还是 Ubuntu,内核版本是多少。

场景2:安装软件前确认版本

不同版本的系统安装方法不一样,CentOS7 用 yum,Ubuntu 用 apt。先确认版本再装软件。

场景3:排查内核兼容性问题

有些软件要求特定内核版本,先看看当前内核版本够不够。

uname -r

场景4:确认是32位还是64位

uname -m

常见坑

坑1:cat /etc/issue 不准

很多老教程说用 cat /etc/issue 看系统版本,但这个文件可能被改过,不一定准。推荐用 /etc/os-release。

坑2:把内核版本和系统版本搞混

内核版本是 uname -r 显示的,系统版本是 /etc/os-release 显示的。这两个不一样,别搞混了。

坑3:CentOS 各小版本不影响大版本

CentOS7.9 和 CentOS7.6 都是 CentOS7,大部分操作是一样的。只要大版本对就行,不用纠结小版本号。

总结

查看系统版本和内核信息的核心命令:

  1. cat /etc/os-release:看系统版本(最通用)
  2. cat /etc/redhat-release:CentOS/RHEL 专用
  3. uname -a:看内核版本和系统架构
  4. uname -r:只看内核版本号
  5. hostnamectl:同时看系统版本和内核版本

拿到一台新服务器,先跑这几个命令确认系统环境,再开始做其他操作。

遇到问题加QQ23979811 协助处理


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

Linux查看进程启动时间,ps和lsof命令使用

前言

想知道某个进程跑了多久?或者想知道哪个进程打开了某个文件?这时候就需要用到 ps 和 lsof 两个命令了。ps 用来查看进程信息,包括启动时间、运行状态等;lsof 用来查看进程打开了哪些文件。这两个命令是运维排查问题的必备工具。本文就详细讲一下这两个命令的使用。

ps 命令

基本用法

ps aux

输出所有进程的详细信息。

输出示例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 128000  5000 ?        Ss   Oct01   0:05 /usr/lib/systemd/systemd
root      123  0.0  0.2 150000 10000 ?        Ss   Oct01   0:10 /usr/sbin/sshd
nginx    4567  0.0  0.3 200000 15000 ?        S    Oct05   0:02 nginx: worker process

各列含义

列 含义
USER 进程所属用户
PID 进程ID
%CPU CPU占用百分比
%MEM 内存占用百分比
VSZ 虚拟内存大小
RSS 物理内存大小
TTY 终端
STAT 进程状态
START 启动时间
TIME 累计CPU时间
COMMAND 启动命令

查看进程启动时间

ps -p PID -o lstart

比如查看PID为123的进程的启动时间:

ps -p 123 -o lstart

输出:

STARTED
Mon Oct  1 10:30:45 2026

查看某个进程的详细信息

ps aux | grep nginx

按CPU占用排序

ps aux --sort=-%cpu | head -10

按内存占用排序

ps aux --sort=-%mem | head -10

lsof 命令

lsof = list open files,用来查看进程打开了哪些文件。

基本用法

lsof

列出所有进程打开的所有文件。

查看某个进程打开的文件

lsof -p PID

比如查看PID为123的进程打开了哪些文件:

lsof -p 123

查看某个文件被哪个进程占用

lsof 文件路径

比如查看 /var/log/nginx/access.log 被哪个进程占用:

lsof /var/log/nginx/access.log

查看某个端口被哪个进程占用

lsof -i :80

查看80端口被哪个进程占用。

查看某个用户打开的文件

lsof -u nginx

查看nginx用户打开的所有文件。

查看某个目录下被打开的文件

lsof +D /var/log/

查看 /var/log/ 目录下所有被打开的文件。

实际排查案例

案例1:磁盘空间没释放

删了一个大文件,但磁盘空间没释放。这是因为还有进程在写这个文件。

lsof | grep deleted

输出所有已删除但还被进程占用的文件。找到对应的PID,重启那个进程就能释放空间了。

案例2:端口被占用

启动Nginx的时候报错"Address already in use",说明80端口被占用了。

lsof -i :80

看是哪个进程占了80端口,杀掉或者换个端口。

案例3:进程启动时间不对

怀疑某个服务被重启过,看看启动时间。

ps -ef | grep nginx

或者更详细的:

ps -p PID -o lstart

案例4:找出谁在写日志

想知道哪个进程在写某个日志文件。

lsof /var/log/messages

常见坑

坑1:删了文件磁盘空间没释放

这是最常见的坑。删了大文件,但磁盘空间没释放,因为还有进程在写这个文件。

解决: 用 lsof | grep deleted 找到还在写这个文件的进程,重启那个进程,或者直接清空文件内容:

> /var/log/nginx/access.log

坑2:ps aux 和 ps -ef 搞混了

ps aux 和 ps -ef 输出格式不一样,但信息基本一样。aux 是BSD格式,-ef 是System V格式。看个人习惯。

坑3:lsof 输出太多

lsof 不加参数会输出一大堆,根本看不过来。一定要加参数过滤:-p、-i、-u、+D 等。

总结

查看进程信息的核心命令:

  1. ps aux:看所有进程的基本信息
  2. ps -p PID -o lstart:看某个进程的启动时间
  3. lsof -p PID:看某个进程打开了哪些文件
  4. lsof -i :端口:看某个端口被哪个进程占用
  5. lsof | grep deleted:看哪些已删除文件还被进程占用

ps 和 lsof 是运维排查问题的基本功,遇到问题先跑一遍这两个命令,大部分问题都能定位到方向。

遇到问题加QQ23979811 协助处理


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

Linux查看网络连接数,ss和netstat命令统计

前言

服务器被攻击了?网站访问量突然暴涨?想看看当前有多少人在连接你的服务器?这时候就需要查看网络连接数了。ss 和 netstat 是两个最常用的网络连接查看命令,ss 是新版,速度更快,推荐优先用。本文就讲一下怎么用这两个命令统计网络连接数、排查网络问题。

ss 命令(推荐)

ss 是 iproute2 包自带的,比 netstat 快很多,尤其是连接数很多的时候。

基本用法

ss

显示所有TCP和UDP连接。

统计各状态连接数

ss -s

输出示例:

Total: 120
TCP:   80 (estab 30, closed 40, orphaned 0, timewait 20)

Transport Total     IP        IPv6
RAW       0         0         0
UDP       5         3         2
TCP       80        60        20
INET      85        63        22
FRAG      0         0         0

这就是全局统计,一眼就能看出当前有多少连接。

查看TCP连接

ss -t

只显示TCP连接。

查看所有监听端口

ss -tlnp

参数说明:

  • -t:TCP
  • -l:只显示监听状态的
  • -n:不解析域名,直接显示IP和端口
  • -p:显示进程名

统计某个端口的连接数

比如统计80端口的连接数:

ss -tn | grep :80 | wc -l

统计各状态的TCP连接数

ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn

输出示例:

40 ESTAB
30 TIME-WAIT
10 LISTEN
5 CLOSE-WAIT

netstat 命令

netstat 是老牌命令,很多老脚本还在用。

基本用法

netstat -tlnp

查看监听的TCP端口。

统计各状态连接数

netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

统计某个端口的连接数

netstat -an | grep :80 | wc -l

查看哪个进程在监听某个端口

netstat -tlnp | grep :80

连接状态详解

TCP连接有很多状态,常见的:

状态 含义
ESTABLISHED 已建立连接,正在通信
LISTEN 监听中,等待连接
TIME_WAIT 主动关闭方等待,防止旧包干扰新连接
CLOSE_WAIT 被动关闭方等待,说明程序没正确关闭连接
FIN_WAIT1 主动关闭方,等待对方回应
FIN_WAIT2 主动关闭方,已经收到对方回应

重点关注:

  • ESTABLISHED 多:说明当前活跃连接多,正常
  • TIME_WAIT 多:说明短连接很多,正常但要注意
  • CLOSE_WAIT 多:说明程序有bug,没正确关闭连接

实际排查案例

案例1:看看当前有多少人访问网站

ss -tn | grep :80 | grep ESTAB | wc -l

统计80端口已建立连接的数量。

案例2:看看哪个IP连接最多

ss -tn state established '( sport = :80 )' | awk '{print $4}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn | head -10

输出连接最多的前10个IP。

案例3:看看是不是被攻击了

如果突然有大量 TIME_WAIT 或 CLOSE_WAIT,可能是被攻击了。

ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn

常见坑

坑1:连接数多就是被攻击了

连接数多不一定是被攻击。如果是正常的网站访问量上涨,连接数多是正常的。要看连接来源IP分布和连接状态。

坑2:TIME_WAIT 多就优化

TIME_WAIT 是TCP协议的正常机制,不需要太紧张。除非 TIME_WAIT 数量特别多(几万几十万),影响了性能,再考虑优化。

坑3:CLOSE_WAIT 多不处理

CLOSE_WAIT 多说明你的程序有bug,没有正确关闭连接。时间长了会把文件句柄用完,导致新连接建不起来。这是程序问题,要改代码。

总结

查看网络连接数的核心命令:

  1. ss -s:快速看全局统计
  2. ss -tlnp:看监听端口和对应进程
  3. ss -tan | awk '{print $1}' | sort | uniq -c:统计各状态连接数
  4. netstat:老命令,兼容性好,但慢

推荐用 ss,比 netstat 快很多,尤其是连接数很多的时候。

遇到问题加QQ23979811 协助处理


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

Linux查看磁盘I/O性能,iostat命令详解

前言

服务器变慢了,CPU不高、内存也够,但就是卡。这时候就要看看是不是磁盘I/O瓶颈了。很多时候系统慢不是CPU不够,而是磁盘读写太慢,CPU一直在等磁盘。iostat 就是专门用来查看磁盘I/O性能的工具,配合 vmstat 一起用,能快速定位I/O问题。本文就详细讲一下 iostat 命令的使用。

安装 iostat

CentOS7 默认可能没装 iostat,先装一下:

yum install sysstat -y

iostat 属于 sysstat 包,装完就有了。

基本用法

直接输入:

iostat

输出示例:

Linux 3.10.0-1160.el7.x86_64 (localhost)    10/05/2026  _x86_64_    (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.00    0.00    2.00    1.00    0.00   92.00

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               10.00        50.00       100.00     500000     1000000

输出详解

CPU 部分

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.00    0.00    2.00    1.00    0.00   92.00
列 含义
%user 用户态CPU占用
%nice 改变过优先级的进程占用
%system 内核态CPU占用
%iowait 等待磁盘I/O的CPU占比(重点看这个)
%steal 被虚拟机偷走的CPU
%idle 空闲CPU

重点看 %iowait: 如果这个值很高(比如超过20%),说明磁盘I/O是瓶颈,CPU大部分时间在等磁盘读写。

磁盘部分

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               10.00        50.00       100.00     500000     1000000
列 含义
Device 设备名
tps 每秒传输次数(IOPS)
kB_read/s 每秒读取的数据量
kB_wrtn/s 每秒写入的数据量
kB_read 总共读取的数据量
kB_wrtn 总共写入的数据量

实时监控

每2秒刷新一次

iostat 2

按 Ctrl+C 退出。

每2秒刷新一次,总共刷新5次

iostat 2 5

只看磁盘部分,不看CPU

iostat -d 2

更详细的磁盘统计

显示扩展统计信息

iostat -x

输出会多出很多列,这才是真正分析磁盘性能的关键:

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda              0.00     5.00    1.00    9.00    50.00   100.00    30.00     0.10    5.00    2.00    6.00   1.00   1.00

重点列说明:

列 含义 判断标准
await 平均I/O等待时间(毫秒) 超过20ms就要注意,超过100ms说明磁盘很慢
svctm 平均I/O服务时间(毫秒) 越小越好
%util 磁盘利用率 接近100%说明磁盘跑满了
avgqu-sz 平均I/O队列长度 越大说明排队越严重

最重要的两个指标:

  1. %util:如果接近100%,说明磁盘已经跑满了
  2. await:如果很大,说明每次I/O等待时间很长,磁盘很慢

常用参数组合

实时监控磁盘性能

iostat -x 2

每2秒刷新一次,显示扩展信息。

只看某个磁盘

iostat -x sda 2

以MB为单位显示

iostat -m

显示设备映射关系

iostat -N

实际排查案例

案例1:系统变慢,怀疑磁盘I/O

vmstat 1

看 wa 列,如果很高(超过20%),说明磁盘I/O是瓶颈。

然后用 iostat 详细看:

iostat -x 2

看 %util 是不是接近100%,await 是不是很大。

案例2:哪个磁盘跑得最忙

iostat -x 2

看 %util 列,哪个磁盘的 %util 最高,就是哪个磁盘是瓶颈。

案例3:读写比例

iostat -x 2

看 r/s 和 w/s,是读多还是写多,针对性优化。

常见坑

坑1:%util 100% 就以为磁盘坏了

%util 100% 说明磁盘在处理I/O请求,但不一定是磁盘性能不行。可能是I/O请求量太大,也可能是磁盘确实慢。要结合 await 一起看。

坑2:只看 tps 不看 await

tps 高不一定是问题,要看每次I/O的等待时间 await。如果 await 很小,说明磁盘处理得很快,tps高也没关系。

坑3:把 iowait 当成CPU问题

%iowait 高说明CPU在等磁盘,不是CPU不够用。这时候加CPU没用,要优化磁盘I/O。

总结

查看磁盘I/O性能的核心命令:

  1. iostat:快速看磁盘整体读写情况
  2. iostat -x 2:实时监控,重点看 %util 和 await
  3. vmstat 1:看 wa 列,确认是不是I/O瓶颈

记住两个关键指标:

  • %util 接近100%:磁盘跑满了
  • await 超过20ms:磁盘响应慢了

遇到问题加QQ23979811 协助处理


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

Linux查看内存使用情况,free和vmstat命令详解

前言

服务器卡了,第一反应就是看看内存够不够用。很多人一看到 free 很少就慌了,觉得内存不够要扩容。其实 Linux 的内存管理和 Windows 不一样,free 少不代表内存真的不够。本文就讲一下怎么用 free 和 vmstat 两个命令正确查看内存使用情况。

free 命令

基本用法

直接输入:

free

输出示例:

              total        used        free      shared  buff/cache   available
Mem:        8165036     4000000     2000000       50000     2165036     4000000
Swap:       2097148           0     2097148

输出详解

列 含义
total 总内存大小
used 已使用的内存
free 完全空闲的内存
shared 共享内存
buff/cache 缓存和缓冲区占用的内存
available 真正可用的内存(重点看这列)

重点:available 才是真正可用的内存

很多人只看 free 列,看到只剩几百M就慌了。其实 Linux 会把空闲内存都用来做缓存(buff/cache),这些缓存是可以随时回收的。

看 available 列才是真正可用的内存。 比如上面的例子,free 只有2G,但 available 有4G,说明还有4G内存可以用。

free 常用参数

free -h

以人类可读的格式显示(自动用G/M/K单位):

              total        used        free      shared  buff/cache   available
Mem:           7.8Gi       3.8Gi       1.9Gi        50Mi       2.1Gi       3.8Gi
Swap:          2.0Gi          0B       2.0Gi
free -m

以MB为单位显示。

free -g

以GB为单位显示。

free -s 5

每5秒刷新一次。

free -c 3

总共显示3次后退出。

vmstat 命令

基本用法

直接输入:

vmstat

输出示例:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 2000000  50000 2100000    0    0    10    20   100   50  5  2 92  1  0

输出详解

procs 进程部分:

  • r:等待运行的进程数
  • b:处于不可中断睡眠的进程数

memory 内存部分:

  • swpd:已用的交换分区大小
  • free:空闲内存
  • buff:缓冲区大小
  • cache:缓存大小

swap 交换分区部分:

  • si:从磁盘交换到内存的速度(KB/s)
  • so:从内存交换到磁盘的速度(KB/s)

io 磁盘I/O部分:

  • bi:从磁盘读取的速度(块/s)
  • bo:写入磁盘的速度(块/s)

cpu CPU部分:

  • us:用户态CPU占用
  • sy:内核态CPU占用
  • id:空闲CPU
  • wa:等待I/O的CPU
  • st:被虚拟机偷走的CPU

vmstat 常用参数

vmstat 1

每秒刷新一次,按 Ctrl+C 退出。

vmstat 1 5

每秒刷新一次,总共刷新5次。

vmstat -s

显示内存统计信息。

怎么判断内存够不够用

看 available 够不够

free -h

看 available 列,如果 available 还有几百M以上,说明内存够用。

看 swap 用了多少

free -h

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

看 si 和 so

vmstat 1

如果 si 和 so 列长期不为0,说明系统在频繁换页,内存不够用了。

实际排查案例

案例1:内存够不够

free -h

看 available 列,如果还有几个G,说明内存够用。

案例2:系统变慢,怀疑内存不足

vmstat 1

看 si 和 so 是不是很高,如果很高说明在频繁换页,内存不够。

案例3:哪个进程占内存最多

top

按 M 键按内存排序,看哪个进程占的内存最多。

常见坑

坑1:把 free 少当成内存不足

Linux 的内存管理机制和 Windows 不一样,空闲内存都用来做缓存了,buff/cache 那部分是可以随时回收的。看 available 列才是真正可用的内存。

坑2:看到 swap 用了就慌

如果 swap 用了一点,但 si 和 so 都是0,说明那是历史遗留的,不影响性能。只有当 si 和 so 长期不为0的时候才是问题。

坑3:内存不够就随便扩容

内存不够的原因可能有很多:

  • 某个程序内存泄漏
  • 数据库缓存配置太大
  • 日志缓存没配置

先找出原因,再决定要不要扩容。

总结

查看内存使用情况的核心命令:

  1. free -h:快速看内存总览,重点看 available 列
  2. vmstat 1:实时监控内存和换页情况,看 si 和 so
  3. top 按M:看哪个进程占内存最多

记住一个原则:Linux 的 free 少不是问题,available 少才是问题。

遇到问题加QQ23979811 协助处理


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

Linux查看系统运行时间,uptime和w命令使用

前言

想知道服务器已经连续运行了多少天?现在有多少人在线?系统负载怎么样?这些问题用 uptime 和 w 两个命令就能搞定。这两个命令虽然简单,但都是运维日常最常用的,一个看运行时间和负载,一个看谁在线。本文就把这两个命令讲透。

uptime 命令

基本用法

直接输入:

uptime

输出示例:

 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分钟的平均值

负载怎么看

负载(load average)是衡量系统繁忙程度的指标。数值越高说明越忙。

判断标准:

  • 负载数值和CPU核心数有关
  • 比如4核CPU,负载4.0才算跑满
  • 一般来说,负载不要超过CPU核心数的70%
  • 比如4核CPU,负载在2.8以下算正常

uptime 常用参数

uptime -V

查看版本号。

uptime -h

查看帮助。

w 命令

基本用法

直接输入:

w

输出示例:

 10:30:45 up 30 days,  2:15,  1 user,  load average: 0.50, 0.40, 0.30
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.1.100    10:20    5.00s  0.05s  0.00s w

输出详解

第一行和 uptime 完全一样:系统时间、运行时间、在线用户数、负载。

下面是当前登录的用户列表:

列 含义
USER 登录用户名
TTY 终端类型(pts/0 表示远程SSH连接)
FROM 登录来源IP
LOGIN@ 登录时间
IDLE 空闲时间
JCPU 该终端所有进程占用的CPU时间
PCPU 当前进程占用的CPU时间
WHAT 当前正在运行的命令

w 常用参数

w -h

不显示第一行标题,只显示用户列表。

w -s

精简模式,不显示 JCPU 和 PCPU 列。

w root

只查看某个用户的登录信息。

who 命令

除了 uptime 和 w,还有个 who 命令,更简单:

who

输出:

root     pts/0        2026-10-05 10:20 (192.168.1.100)

只显示谁在线、从哪来、什么时候登录的。

last 命令

想知道历史登录记录,用 last:

last

输出最近的登录记录,包括:

  • 谁登录的
  • 从哪个IP登录的
  • 什么时候登录的
  • 登录了多久
last -10

只看最近10条。

实际应用场景

场景1:服务器重启过没有

用 uptime 看运行时间,如果才几天,说明最近重启过。

uptime

场景2:谁在登录我的服务器

用 w 看当前有谁在线,来源IP是哪里。如果有不认识的IP,可能是被入侵了。

w

场景3:系统负载高不高

用 uptime 看 load average,如果负载很高,再用 top 看是哪个进程占的。

uptime
top

场景4:排查登录历史

用 last 看历史登录记录,有没有异常登录。

last

常见坑

坑1:负载高就以为CPU不够

负载高不一定是CPU的问题。负载包括所有等待CPU的进程,也包括等待I/O的进程。可能是磁盘I/O瓶颈,也可能是大量进程在排队。要结合 top 一起看。

坑2:把在线用户数看得很重要

1 user 这个数字只是当前登录的用户数,不代表系统性能。一个用户也可能把系统跑满,100个用户也可能很空闲。

坑3:last 显示的是历史记录,不是实时状态

last 是看历史登录记录的,现在谁在线要用 w 或 who。两者别搞混了。

总结

uptime 和 w 是最基础的系统监控命令:

  1. uptime:看系统运行时间和负载
  2. w:看谁在线、从哪来、在干嘛
  3. who:更简单的在线用户查看
  4. last:看历史登录记录

这几个命令都是秒出结果,排查问题的时候先跑一遍,快速了解系统基本状态。

遇到问题加QQ23979811 协助处理


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

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 

CentOS7 关闭SELinux详细步骤,临时+永久关闭

前言

刚装完 CentOS7,部署网站的时候老是遇到各种权限问题:文件明明权限对了还是访问不了,端口也开了就是连不上。排查半天发现是 SELinux 在捣乱。SELinux 是 CentOS 自带的强制访问控制安全机制,安全性很高,但对新手来说确实不太友好。本文详细讲一下怎么临时和永久关闭 SELinux,以及关闭前需要知道的注意事项。

什么是 SELinux

SELinux(Security-Enhanced Linux)是 Linux 内核的一个安全模块,提供强制访问控制(MAC)机制。它比传统的自主访问控制(DAC)更严格,不仅看文件权限,还看进程和文件的安全上下文(SELinux 标签)。

CentOS7 默认开启 SELinux,这也是为什么很多新手部署完网站各种报错的原因——Nginx、PHP、MySQL 的进程和文件上下文不匹配,SELinux 直接拦截。

查看 SELinux 状态

在关闭之前,先看看 SELinux 当前是什么状态:

getenforce

输出可能是:

  • Enforcing:强制模式,SELinux 正在拦截违规操作
  • Permissive:宽容模式,只记录警告不拦截
  • Disabled:已关闭

也可以用这个命令看更详细的信息:

sestatus

输出示例:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed

临时关闭 SELinux(重启后失效)

如果你只是临时测试一下,不想改配置文件,可以用这个方法:

setenforce 0

setenforce 0 表示切换到 Permissive 宽容模式,SELinux 不会再拦截操作,但会在日志里记录。这个命令立即生效,不需要重启。

验证一下:

getenforce

应该输出 Permissive。

注意: 这种方式重启服务器后 SELinux 会重新开启,所以只是临时生效。

永久关闭 SELinux(重启后依然关闭)

要永久关闭,需要修改配置文件:

1. 编辑 SELinux 配置文件

vi /etc/selinux/config

2. 修改 SELINUX 的值

找到这一行:

SELINUX=enforcing

改成:

SELINUX=disabled

3. 保存退出,重启服务器

reboot

重启后再验证一下:

getenforce

应该输出 Disabled。

三种模式说明

SELinux 有三种模式,大家可以根据需求选择:

模式 说明
enforcing 强制模式,SELinux 强制执行策略,违规操作直接拦截
permissive 宽容模式,只记录警告日志,不拦截操作
disabled 完全关闭 SELinux

建议: 如果只是临时调试,可以用 permissive 模式,既能放行所有操作,又能通过日志看到哪些操作被 SELinux 拦截了。生产环境如果实在搞不懂 SELinux,再考虑完全关闭。

常见坑

坑1:改了配置文件没重启就以为关了

很多朋友改完 /etc/selinux/config 文件,马上用 getenforce 查看,发现还是 Enforcing,就以为没改成功。其实配置文件改了之后必须重启服务器才会生效。临时生效用 setenforce 0,永久生效必须重启。

坑2:改了 SELINUX=disabled 但还有问题

有时候即使把 SELinux 关了,之前设置的安全上下文标签还在,可能会导致一些奇怪的问题。如果遇到这种情况,可以重启服务器彻底解决。

坑3:生产环境直接关闭有安全风险

SELinux 是一道安全防线,生产环境直接完全关闭会降低系统安全性。建议先尝试把模式改成 permissive,看看日志里哪些操作被拦截了,再针对性地调整上下文标签,而不是直接全部关掉。

总结

CentOS7 关闭 SELinux 的两种方式:

临时关闭(立即生效,重启失效):

setenforce 0

永久关闭(重启后生效):

  1. 编辑 /etc/selinux/config
  2. 把 SELINUX=enforcing 改成 SELINUX=disabled
  3. 重启服务器

新手刚部署完服务器,先临时关了跑通业务,后面再慢慢研究 SELinux 的配置,别一上来就跟它死磕。

遇到问题加QQ23979811 协助处理


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

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 

Git 常用命令汇总

Git 常用命令汇总

Git 是现在开发必备工具,整理一份常用命令清单,收藏备用。

1. 初始化和克隆

# 初始化新仓库
git init

# 克隆远程仓库
git clone https://github.com/user/repo.git

# 克隆指定分支
git clone -b dev https://github.com/user/repo.git

2. 查看状态

# 查看工作区状态
git status

# 查看提交历史
git log

# 查看简洁历史
git log --oneline --graph

# 查看文件改动
git diff

3. 添加和提交

# 添加所有文件到暂存区
git add .

# 添加指定文件
git add file.php

# 提交到本地仓库
git commit -m "修复bug"

# 提交并跳过验证
git commit --no-verify -m "修复bug"

4. 分支操作

# 查看本地分支
git branch

# 查看所有分支(包括远程)
git branch -a

# 创建新分支
git branch dev

# 切换分支
git checkout dev

# 创建并切换分支
git checkout -b dev

# 删除分支
git branch -d dev

# 强制删除分支
git branch -D dev

5. 远程操作

# 拉取远程更新
git pull

# 推送本地提交
git push

# 推送本地新分支到远程
git push -u origin dev

# 删除远程分支
git push origin --delete dev

6. 撤销操作

# 撤销工作区修改
git checkout -- file.php

# 撤销暂存区
git reset HEAD file.php

# 回退到上一个版本
git reset --hard HEAD^

# 回退到指定版本
git reset --hard commit_id

# 撤销上次提交(保留修改)
git reset --soft HEAD^

7. 合并和变基

# 合并分支
git merge dev

# 变基
git rebase master

# 取消合并
git merge --abort

8. 标签操作

# 打标签
git tag v1.0.0

# 查看标签
git tag

# 推送标签
git push origin v1.0.0

# 推送所有标签
git push origin --tags

总结

Git 常用命令核心:

  • 查看:status / log / diff
  • 提交:add / commit
  • 分支:branch / checkout / merge
  • 远程:pull / push
  • 撤销:reset / checkout

记住这些,日常 Git 操作基本够用了。


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

PHP Composer 入门指南

PHP Composer 入门指南

Composer 是 PHP 的依赖管理工具,现在做 PHP 开发不用 Composer 几乎不可能。

1. 安装 Composer

# Linux/Mac
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

# Windows 直接下载安装包
# https://getcomposer.org/Composer-Setup.exe

验证安装:

composer -V

2. 换国内镜像(必须)

官方镜像太慢,一定要换国内镜像:

# 阿里云镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

# 腾讯云镜像
composer config -g repo.packagist composer https://mirrors.tencent.com/composer/

3. 初始化项目

# 进入项目目录
cd myproject

# 初始化 composer.json
composer init

或者手动创建 composer.json:

{
    "name": "my/project",
    "require": {
        "monolog/monolog": "^2.0"
    }
}

4. 常用命令

# 安装依赖
composer install

# 更新依赖
composer update

# 安装某个包
composer require monolog/monolog

# 卸载某个包
composer remove monolog/monolog

# 自动加载
composer dump-autoload

5. 自动加载

// 引入自动加载文件
require __DIR__ . '/vendor/autoload.php';

// 然后就可以直接用第三方库了
$log = new Monolog\Logger('name');

6. composer.json 详解

{
    "name": "项目名",
    "description": "项目描述",
    "type": "project",
    "require": {
        "php": ">=7.4",
        "monolog/monolog": "^2.0",
        "guzzlehttp/guzzle": "^7.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

7. 版本号说明

  • ^2.0:兼容 2.0 到 3.0(不包含 3.0)
  • ~2.0:兼容 2.0 到 2.1(不包含 2.1)
  • *:任意版本
  • 2.0.*:2.0.x 版本

总结

Composer 核心:

  • 安装:一行命令
  • 换镜像:必须换国内源
  • 常用:install / update / require / remove
  • 自动加载:require vendor/autoload.php

搞懂这些,Composer 日常开发就够用了。


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

PHP 字符串处理技巧

PHP 字符串处理常用技巧

字符串处理是 PHP 开发最常用的操作,掌握这些函数,写代码效率翻倍。

1. 截取字符串

// 截取前 5 个字符
substr("hello world", 0, 5); // hello

// 截取从第 6 个开始到结尾
substr("hello world", 6); // world

// 中文字符串截取(用 mb_)
mb_substr("你好世界", 0, 2, "UTF-8"); // 你好

注意:中文要用 mb_substr,不能用 substr,否则会乱码。

2. 替换字符串

//  str_replace(替换所有)
str_replace("world", "PHP", "hello world"); // hello PHP

//  str_ireplace(不区分大小写)
str_ireplace("WORLD", "PHP", "hello world");

//  preg_replace(正则替换)
preg_replace("/\d/", "", "abc123def"); // abcdef

3. 查找字符串

// 查找位置(找不到返回 false)
strpos("hello world", "world"); // 6

// 查找最后出现位置
strrpos("hello world hello", "hello"); // 12

// 判断是否包含(PHP 8+)
str_contains("hello world", "world"); // true

// 判断开头
str_starts_with("hello world", "hello"); // true

// 判断结尾
str_ends_with("hello world", "world"); // true

4. 格式化字符串

// 去除首尾空格
trim("  hello  "); // hello

// 只去左边/右边
ltrim("  hello"); // hello
rtrim("hello  "); // hello

// 转小写/大写
strtolower("Hello"); // hello
strtoupper("hello"); // HELLO

// 首字母大写
ucfirst("hello"); // Hello

// 每个单词首字母大写
ucwords("hello world"); // Hello World

5. 字符串和数组转换

// 字符串转数组
explode(",", "a,b,c"); // ["a","b","c"]

// 数组转字符串
implode(",", ["a","b","c"]); // a,b,c

// 重复字符串
str_repeat("ab", 3); // ababab

// 字符串长度
strlen("hello"); // 5
mb_strlen("你好", "UTF-8"); // 2

6. 常用技巧

// 生成随机字符串
substr(md5(time()), 0, 8);

// 脱敏手机号
substr_replace("13812345678", "****", 3, 4); // 138****5678

// 截取摘要(带省略号)
mb_strlen($text) > 10 ? mb_substr($text, 0, 10) . "..." : $text;

// 清除 HTML 标签
strip_tags("<p>hello</p>"); // hello

总结

PHP 字符串处理核心函数:

  • 截取:substr / mb_substr
  • 替换:str_replace / preg_replace
  • 查找:strpos / str_contains
  • 格式化:trim / strtolower / ucwords
  • 转换:explode / implode

记住这些,日常开发基本够用了。


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

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 
'); })();