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 协助处理
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 = 7rw-= 4+2+0 = 6r--= 4+0+0 = 4r-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 文件权限核心:
- rwx = 4+2+1
- 目录用 755,文件用 644
- chmod 改权限,chown 改所有者
- 不要随便用 777
记住两个最常用的:目录 755,文件 644。遇到权限问题先 ls -l 看看,再改,别上来就 777。
遇到问题加QQ23979811 协助处理
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 命令编辑,它会检查语法。
总结
用户和组管理的核心命令:
- useradd:创建用户
- passwd:设置密码
- userdel -r:删除用户(连家目录)
- usermod -aG:把用户加入组
- groupadd:创建组
- groups:查看用户属于哪些组
- visudo:编辑 sudo 权限
用户管理是 Linux 安全的基础,每个用户用自己的账号,不要所有人都用 root。
遇到问题加QQ23979811 协助处理
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 自动同步,不要手动设。
总结
查看和修改系统时间的核心命令:
- date:快速看当前时间
- timedatectl:看完整时间信息(时区、NTP同步状态)
- timedatectl set-timezone Asia/Shanghai:设置时区
- chronyd:NTP时间同步服务
服务器时间一定要准,用 NTP 自动同步,不要手动设。国内服务器时区设成 Asia/Shanghai。
遇到问题加QQ23979811 协助处理
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:块大小1Mcount=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:尽量不用 Swap100:积极使用 Swap10:推荐值,内存不够才用 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 的完整流程:
- dd 创建 Swap 文件
- chmod 600 设置权限
- mkswap 格式化
- swapon 启用
- 写 /etc/fstab 开机自动挂载
- 调整 swappiness 优先级
Swap 只是应急方案,真正解决内存不足还是要加物理内存。但应急的时候,Swap 确实能救一命。
遇到问题加QQ23979811 协助处理
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 是唯一的,不会变。
总结
新硬盘挂载的完整流程:
- fdisk -l:确认新硬盘设备名
- fdisk /dev/sdb:分区
- mkfs.xfs /dev/sdb1:格式化
- mkdir /data:创建挂载目录
- mount /dev/sdb1 /data:临时挂载
- blkid 查UUID:获取UUID
- 写 /etc/fstab:配置开机自动挂载
- mount -a:测试配置
整个流程走一遍以后,加硬盘就是熟练活了。
遇到问题加QQ23979811 协助处理
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 7x86_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,大部分操作是一样的。只要大版本对就行,不用纠结小版本号。
总结
查看系统版本和内核信息的核心命令:
- cat /etc/os-release:看系统版本(最通用)
- cat /etc/redhat-release:CentOS/RHEL 专用
- uname -a:看内核版本和系统架构
- uname -r:只看内核版本号
- hostnamectl:同时看系统版本和内核版本
拿到一台新服务器,先跑这几个命令确认系统环境,再开始做其他操作。
遇到问题加QQ23979811 协助处理
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 等。
总结
查看进程信息的核心命令:
- ps aux:看所有进程的基本信息
- ps -p PID -o lstart:看某个进程的启动时间
- lsof -p PID:看某个进程打开了哪些文件
- lsof -i :端口:看某个端口被哪个进程占用
- lsof | grep deleted:看哪些已删除文件还被进程占用
ps 和 lsof 是运维排查问题的基本功,遇到问题先跑一遍这两个命令,大部分问题都能定位到方向。
遇到问题加QQ23979811 协助处理
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,没有正确关闭连接。时间长了会把文件句柄用完,导致新连接建不起来。这是程序问题,要改代码。
总结
查看网络连接数的核心命令:
- ss -s:快速看全局统计
- ss -tlnp:看监听端口和对应进程
- ss -tan | awk '{print $1}' | sort | uniq -c:统计各状态连接数
- netstat:老命令,兼容性好,但慢
推荐用 ss,比 netstat 快很多,尤其是连接数很多的时候。
遇到问题加QQ23979811 协助处理
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队列长度 | 越大说明排队越严重 |
最重要的两个指标:
%util:如果接近100%,说明磁盘已经跑满了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性能的核心命令:
- iostat:快速看磁盘整体读写情况
- iostat -x 2:实时监控,重点看
%util和await - vmstat 1:看
wa列,确认是不是I/O瓶颈
记住两个关键指标:
%util接近100%:磁盘跑满了await超过20ms:磁盘响应慢了
遇到问题加QQ23979811 协助处理
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:空闲CPUwa:等待I/O的CPUst:被虚拟机偷走的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:内存不够就随便扩容
内存不够的原因可能有很多:
- 某个程序内存泄漏
- 数据库缓存配置太大
- 日志缓存没配置
先找出原因,再决定要不要扩容。
总结
查看内存使用情况的核心命令:
- free -h:快速看内存总览,重点看
available列 - vmstat 1:实时监控内存和换页情况,看
si和so - top 按M:看哪个进程占内存最多
记住一个原则:Linux 的 free 少不是问题,available 少才是问题。
遇到问题加QQ23979811 协助处理
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 是最基础的系统监控命令:
- uptime:看系统运行时间和负载
- w:看谁在线、从哪来、在干嘛
- who:更简单的在线用户查看
- last:看历史登录记录
这几个命令都是秒出结果,排查问题的时候先跑一遍,快速了解系统基本状态。
遇到问题加QQ23979811 协助处理
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 配置的核心步骤:
- 在
/etc/logrotate.d/下创建配置文件 - 指定日志路径、切割频率、保留数量
- 加上
postrotate通知服务重新打开日志 - 用
logrotate -d测试配置 - 系统每天自动执行,不用管了
日志切割是服务器运维的基本功,配好了以后磁盘永远不会被日志撑满。
遇到问题加QQ23979811 协助处理
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:进程IDUSER:进程所属用户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 运维最常用的监控工具,记住几个关键点:
- 看负载:
load average,和CPU核心数对比 - 看CPU:
%us高说明用户进程吃CPU,%wa高说明磁盘I/O瓶颈 - 看内存:看
avail Mem,不要只看free - 排序:按
P看CPU占用,按M看内存占用 - 杀进程:按
k输入PID
日常排查服务器问题,先打开 top 看一眼,大部分问题都能定位到方向。
遇到问题加QQ23979811 协助处理
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
永久关闭(重启后生效):
- 编辑
/etc/selinux/config - 把
SELINUX=enforcing改成SELINUX=disabled - 重启服务器
新手刚部署完服务器,先临时关了跑通业务,后面再慢慢研究 SELinux 的配置,别一上来就跟它死磕。
遇到问题加QQ23979811 协助处理
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 协助处理
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 操作基本够用了。
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 日常开发就够用了。
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
记住这些,日常开发基本够用了。
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 访问
配好防火墙,服务器安全提升一大截。