MySQL查看数据库列表
MySQL查看数据库列表
引言
刚连上一台MySQL服务器,先要看实例上有哪些库、当前账号能访问哪些库。SHOW DATABASES是最基础的入口,配合information_schema可拿到库名、字符集、容量等完整信息。
列出所有数据库
SHOW DATABASES;
列出当前账号有权限看到的全部库,看不到的库是权限不足,不代表不存在。
查看当前所在库
SELECT DATABASE();
切换库之前先确认当前连接落在哪个库,避免写SQL操作错库。
切换数据库
USE mydb;
切库后后续不加库名的表操作都落在mydb。
查库字符集和排序规则
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA;
拿到每个库的默认字符集,排查乱码时先看这里。
查看库占用空间
SELECT table_schema,
ROUND(SUM(data_length+index_length)/1024/1024,2) AS size_mb
FROM information_schema.tables
GROUP BY table_schema
ORDER BY size_mb DESC;
按库汇总数据和索引大小,快速找出占空间大户。
注意事项
- SHOW DATABASES只显示有权限的库,根账号才看全;
- information_schema是系统库,不要往里写业务数据;
- 新库建库时指定utf8mb4,避免emoji乱码;
- 删库DROP DATABASE不可逆,先备份再操作;
- 多实例用端口区分,别把实例和库混淆;
- 脚本里用SELECT SCHEMA_NAME批量遍历,比SHOW好解析。
总结
SHOW DATABASES列库,SELECT DATABASE()看当前库,USE切库,information_schema.SCHEMATA查字符集,按table_schema聚合查容量。先确认当前库再写SQL,建库统一utf8mb4,删库前务必备份,脚本批量处理优先走information_schema。
Docker清理悬空镜像
Docker清理悬空镜像
引言
反复build镜像后,旧的无标签镜像(
先看占用
docker system df
查看镜像、容器、卷、构建缓存各占多少,先摸清再动手。
什么是悬空镜像
build出新标签后,旧层变成
只清悬空镜像(安全)
docker image prune
只删除无标签无引用的dangling镜像,已打标签和在用镜像不动,最稳妥。
清停止的容器
docker container prune
删掉所有已退出的容器,正在运行的不受影响。
清无用镜像和构建缓存(更彻底)
docker system prune
一次清悬空镜像、停止容器、无用网络和构建缓存,加-a连未被容器使用的镜像也删,加--volumes连未使用卷一起删:
docker system prune -a --volumes
手动删单个镜像
docker image rm 镜像ID
若提示被容器引用,先确认容器用途,别直接强制删。
注意事项
- 生产慎用-a和--volumes,卷里可能存数据库数据,删了不可恢复;
- 先docker system df看占用,再决定清哪一类;
- 清理前确认没有需要保留的停止容器和备份卷;
- 镜像仓库里还能重新拉取的镜像才适合-a全清;
- 定期配合定时任务清理,避免磁盘缓慢耗尽。
总结
日常用docker image prune清悬空镜像最安全,docker system prune清停止容器和缓存,-a和--volumes只在确认无保留价值时用。先df看占用、分级清理,避免误删业务卷和在用镜像。
Docker容器日志查看
Docker容器日志查看
引言
容器启动报错、服务运行异常时,不能进容器盲目找文件,第一时间用docker logs查看标准输出日志。应用把日志打到stdout/stderr,Docker统一收集,是容器排错最常用入口。
基础查看命令
#查看全部日志
docker logs 容器名或ID
#实时跟踪最新日志,类似tail -f
docker logs -f 容器名
#只看最近100行
docker logs --tail 100 容器名
#查看某时间之后日志
docker logs --since 30m 容器名
docker logs --since 2026-10-18T07:00:00 容器名
#带时间戳
docker logs -t 容器名
常用组合
#实时跟踪并显示时间戳、最近50行
docker logs -f -t --tail 50 myapp
排查重启循环、接口报错时,先tail看最后报错,再结合时间过滤。
日志原理
Docker默认把容器标准输出保存到本地json-file驱动,存在宿主机/var/lib/docker/containers目录。应用要把日志输出到控制台,而不是只写容器内文件,才能被docker logs抓到。
日志注意事项
- 默认json-file不限制大小,长时间运行会占满磁盘,生产配置日志轮转:
{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}} - 需要长期分析的日志,接入ELK等集中日志系统;
- 容器删除后默认日志随之丢失;
- 应用内部业务日志建议挂载到宿主机目录持久化。
总结
docker logs是容器排错第一命令,-f跟踪、--tail取尾部、--since按时间过滤。生产配置大小轮转避免磁盘写满,业务重要日志持久化或集中采集。
Docker多阶段镜像构建
Docker多阶段镜像构建
引言
直接打包项目代码、编译工具到镜像,镜像体积巨大,部署传输慢。Docker多阶段构建可以在第一阶段编译代码,第二阶段只复制编译后的成品,剔除编译器、源码,大幅度减小镜像大小。
原理
一个Dockerfile可以写多个FROM,每一个FROM代表一个阶段。阶段之间可以复制文件,最终镜像只保留最后一个阶段内容,前面阶段的编译环境不会打包进最终镜像。
示例Dockerfile(PHP项目)
#阶段1:构建
FROM php:8.2-cli AS builder
WORKDIR /app
COPY . .
RUN composer install --no-dev
#阶段2:运行环境
FROM php:8.2-cli-alpine
WORKDIR /app
COPY --from=builder /app .
CMD ["php","index.php"]
最终镜像只有php运行环境加业务代码,没有composer、源码缓存文件。
优势
- 镜像体积大幅缩小,传输更快;
- 减少攻击面,镜像内没有编译工具,安全性更高;
- 只维护单个Dockerfile,构建流程简单。
注意事项
- 多阶段命名便于阅读;
- 不要复制不需要的文件,
.dockerignore忽略日志、缓存; - 区分开发镜像与生产镜像,生产镜像精简。
总结
多阶段构建是容器化部署最佳实践,适合PHP、Go、前端打包等场景,生产环境镜像尽量使用多阶段构建,减小体积提升部署效率。
Linux查看系统负载
Linux查看系统负载
引言
服务器CPU、内存压力过大,会造成网站接口响应缓慢、502报错。运维排查服务器性能问题第一步就是查看系统负载,了解服务器当前资源压力,及时扩容或者优化程序。
负载概念
uptime输出的三个数字:1分钟、5分钟、15分钟平均负载。代表等待CPU处理的任务数量。
多核CPU参考标准:4核服务器,负载接近4说明CPU打满;超过代表任务排队,系统过载。
常用命令
# 快速查看负载
uptime
# 实时监控
top
# 更轻量化监控
htop
# 查看CPU核心数量
nproc
top命令内可以按1查看每个核心负载;P按CPU使用率排序,快速找到耗资源进程。
排查思路
- 负载高,CPU使用率高:程序代码循环、大量计算,定位进程优化代码;
- 负载高,CPU使用率低:大量IO等待(磁盘读写慢、数据库阻塞),查看磁盘io
iostat。
实操示例
# 安装iostat
yum install -y sysstat
# 持续查看io状态
iostat -x 1
总结
平均负载不只代表CPU,还包含IO等待。看到高负载不能直接判定CPU瓶颈,结合top、iostat综合定位,区分是计算密集还是IO密集导致服务器卡顿。
Linux查看进程占用CPU,top和ps命令
前言
服务器突然卡了?CPU跑满了?想知道哪个进程占CPU最多?本文讲top和ps命令,帮你快速定位问题进程。
一、top命令 — 实时监控
启动top
top
top界面说明
第一行:
- 系统时间、运行时间、登录用户数、负载(1/5/15分钟)
第二行:
- 任务总数、运行中、睡眠中、停止、僵尸进程
第三行(CPU):
- us:用户态占用
- sy:内核态占用
- id:空闲
第四行(内存):
- total:总内存
- used:已用
- free:空闲
进程列表:
- PID:进程ID
- USER:运行用户
- %CPU:CPU占用
- %MEM:内存占用
- COMMAND:进程名
top常用快捷键
| 快捷键 | 作用 |
|---|---|
| P | 按CPU排序 |
| M | 按内存排序 |
| k | 杀掉进程 |
| q | 退出 |
| 1 | 显示每个CPU核心 |
只看某个进程
top -p 进程ID
二、ps命令 — 查看进程快照
查看所有进程
ps aux
按CPU排序
ps aux --sort=-%cpu | head -10
解释:
- aux:显示所有进程
- --sort=-%cpu:按CPU降序
- head -10:只看前10个
按内存排序
ps aux --sort=-%mem | head -10
查找特定进程
ps aux | grep nginx
三、查找占用CPU最高的进程
方法1:用top
top
按P,按CPU排序,第一个就是占用最高的。
方法2:用ps
ps aux --sort=-%cpu | head -5
输出:
USER PID %CPU %MEM COMMAND
root 1234 50.0 10.0 php-fpm
四、查找占用内存最高的进程
ps aux --sort=-%mem | head -5
五、杀掉进程
根据PID杀
kill 进程ID
强制杀
kill -9 进程ID
根据进程名杀
pkill nginx
杀掉所有php-fpm
pkill php-fpm
六、常见场景
场景1:CPU跑满了
排查步骤:
- 用top看哪个进程CPU高
- 如果是php-fpm,看是不是有慢请求
- 如果是mysql,看是不是有慢SQL
- 杀掉异常进程
场景2:内存占满了
排查步骤:
- 用top按M排序
- 看哪个进程内存高
- 杀掉或重启
场景3:某个进程一直跑
ps aux | grep 进程名
找到PID后杀掉。
七、常见坑
坑1:top和ps看到的CPU不一样
原因: top是实时刷新的,ps是快照。
解决: 用top看实时变化。
坑2:杀了进程又起来
原因: 有守护进程自动拉起。
解决: 找到父进程一起杀,或者停掉服务。
systemctl stop php-fpm
坑3:僵尸进程
现象: 进程状态是Z(Zombie)。
原因: 子进程退出了,父进程没回收。
解决: 重启父进程。
八、常用命令汇总
# 实时监控
top
# 按CPU排序
ps aux --sort=-%cpu | head -10
# 按内存排序
ps aux --sort=-%mem | head -10
# 查找进程
ps aux | grep 进程名
# 杀进程
kill PID
kill -9 PID
pkill 进程名
九、负载怎么看
什么是负载
负载就是正在等待CPU运行的进程数。
怎么判断高不高
- 负载 < CPU核心数:正常
- 负载 > CPU核心数:有点忙
- 负载 > 2倍CPU核心数:很卡
查看CPU核心数
nproc
总结
记住:
- 用top实时看CPU和内存
- 按P按CPU排序,按M按内存排序
- 用ps aux --sort=-%cpu找CPU最高的
- 用kill -9 PID杀进程
- 负载超过CPU核心数就有问题
最常用:
top
ps aux --sort=-%cpu | head -10
kill -9 进程ID
遇到问题加QQ23979811 协助处理
Docker常用命令大全,新手必看
前言
Docker现在用得越来越多,但很多新手记不住命令。本文整理了最常用的Docker命令,收藏起来随用随查。
一、镜像相关命令
拉取镜像
docker pull nginx:latest
查看本地镜像
docker images
删除镜像
docker rmi 镜像ID
强制删除镜像
docker rmi -f 镜像ID
搜索镜像
docker search nginx
二、容器相关命令
查看运行中的容器
docker ps
查看所有容器(包括停止的)
docker ps -a
启动容器
docker start 容器名/容器ID
停止容器
docker stop 容器名/容器ID
重启容器
docker restart 容器名/容器ID
删除容器
docker rm 容器名/容器ID
强制删除运行中的容器
docker rm -f 容器名/容器ID
进入容器
docker exec -it 容器名/容器ID /bin/bash
查看容器日志
docker logs 容器名/容器ID
实时查看日志
docker logs -f 容器名/容器ID
查看容器详细信息
docker inspect 容器名/容器ID
查看容器IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名
查看容器资源占用
docker stats
三、运行容器
后台运行
docker run -d --name mynginx -p 80:80 nginx
参数解释:
- -d:后台运行
- --name:容器名
- -p:端口映射(宿主端口:容器端口)
运行并进入容器
docker run -it ubuntu /bin/bash
挂载目录
docker run -d -v /host/path:/container/path nginx
环境变量
docker run -e MYSQL_ROOT_PASSWORD=123456 mysql
自动重启
docker run --restart=always -d nginx
四、清理命令
停止所有容器
docker stop $(docker ps -q)
删除所有停止的容器
docker container prune
删除所有未使用的镜像
docker image prune -a
一键清理
docker system prune -a
五、Docker Compose命令
启动
docker-compose up -d
停止
docker-compose down
查看状态
docker-compose ps
查看日志
docker-compose logs -f
重启
docker-compose restart
六、常用场景
运行MySQL
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/mysql:/var/lib/mysql \
mysql:5.7
运行Nginx
docker run -d \
--name nginx \
-p 80:80 \
-v /www:/usr/share/nginx/html \
nginx
运行Redis
docker run -d \
--name redis \
-p 6379:6379 \
redis:alpine
七、常见坑
坑1:容器启动后马上退出
原因: 容器没有前台进程。
解决: 加-it或者tail -f /dev/null。
坑2:端口映射不对
问题: 容器里跑的是80端口,映射成了8080:80。
解决: 确认容器内端口和宿主机端口。
坑3:数据丢失
问题: 容器删了数据就没了。
解决: 一定要挂载数据卷-v。
坑4:镜像太大
解决: 用alpine版本,比如redis:alpine。
八、命令速查表
| 功能 | 命令 |
|---|---|
| 查看运行中容器 | docker ps |
| 查看所有容器 | docker ps -a |
| 查看镜像 | docker images |
| 拉取镜像 | docker pull 镜像名 |
| 运行容器 | docker run -d --name 名字 -p 端口:端口 镜像 |
| 进入容器 | docker exec -it 名字 /bin/bash |
| 查看日志 | docker logs -f 名字 |
| 停止容器 | docker stop 名字 |
| 删除容器 | docker rm 名字 |
| 删除镜像 | docker rmi 镜像ID |
| 清理 | docker system prune -a |
总结
记住:
docker ps看容器docker images看镜像docker run启动容器docker exec -it进入容器docker logs -f看日志docker system prune清理
最常用:
docker ps
docker images
docker exec -it 容器名 /bin/bash
docker logs -f 容器名
遇到问题加QQ23979811 协助处理
Linux磁盘满了怎么清理,大文件查找命令
前言
网站突然打不开了?SSH连不上了?一查磁盘100%满了!本文讲怎么查找大文件、清理磁盘空间。
一、查看磁盘使用情况
df命令
df -h
输出:
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 38G 2.0G 95% /
看什么:
- Use%:使用率,超过90%就要注意了
- Avail:可用空间
查看当前目录占用
du -sh
二、查找大文件
查找大于100M的文件
find / -type f -size +100M 2>/dev/null
解释:
- /:从根目录开始找
- -type f:只找文件
- -size +100M:大于100M
- 2>/dev/null:忽略错误信息
查找大于1G的文件
find / -type f -size +1G 2>/dev/null
按大小排序
find / -type f -size +100M 2>/dev/null | xargs du -h | sort -rh
三、查找大目录
查看各目录大小
du -sh /*
一级一级往下找
du -sh /var/*
du -sh /var/log/*
du -sh /var/lib/*
查看前10大目录
du -sh /* | sort -rh | head -10
四、常见大文件位置
1. 日志文件
/var/log/
/var/log/messages
/var/log/nginx/
/var/log/mysql/
2. 临时文件
/tmp/
/var/tmp/
3. 邮件
/var/spool/mail/
4. 数据库文件
/var/lib/mysql/
5. Docker镜像
/var/lib/docker/
6. 上传文件
/www/wwwroot/
/var/www/html/
五、清理方法
清理日志文件
方法1:清空文件
> /var/log/messages
方法2:删除旧日志
find /var/log -name "*.log" -mtime +30 -delete
删除30天前的日志。
清理yum缓存
yum clean all
清理Docker
docker system prune -a
清理临时文件
rm -rf /tmp/*
注意: 正在用的文件别删。
清理旧内核
package-cleanup --oldkernels --count=1
六、查看文件被谁占用
问题: 删了文件但磁盘没释放?
原因: 有进程还在写这个文件。
查看被删除但还被占用的文件
lsof | grep deleted
重启相关进程
systemctl restart nginx
七、常见坑
坑1:删了文件但空间没释放
原因: 进程还在写这个文件。
解决: 重启进程,或者用> 文件名清空。
坑2:日志一直涨
解决: 配置logrotate日志切割。
坑3:Docker占了很多空间
docker system df
清理:
docker system prune -a
八、自动清理脚本
写个脚本定期清理:
#!/bin/bash
# 清理30天前的日志
find /var/log -name "*.log" -mtime +30 -delete
# 清理yum缓存
yum clean all
# 清理Docker
docker system prune -f
加到crontab:
0 3 * * * /bin/bash /root/clean.sh
总结
记住:
- 用
df -h看磁盘使用率 - 用
du -sh /*看哪个目录大 - 用
find / -size +100M找大文件 - 先看日志,再看Docker,再看临时文件
- 删文件前确认不用了
- 删了没释放就重启进程
最常用:
df -h
du -sh /*
find / -type f -size +100M 2>/dev/null
遇到问题加QQ23979811 协助处理
Linux查看端口被占用,lsof和netstat命令
前言
启动服务的时候报"Address already in use"?想知道某个端口被哪个进程占了?Linux查看端口占用最常用的就是lsof和netstat命令,本文讲清楚。
一、为什么要查端口
- 启动服务报端口被占
- 看某个服务有没有启动
- 排查安全问题,看有没有可疑端口
二、lsof命令
查看某个端口被哪个进程占用
lsof -i:端口号
例子: 查80端口
lsof -i:80
输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
看什么:
- COMMAND:进程名(nginx)
- PID:进程ID(1234)
- USER:运行用户(root)
查看所有TCP端口
lsof -i tcp
查看所有UDP端口
lsof -i udp
杀掉占用端口的进程
kill -9 $(lsof -ti:80)
三、netstat命令
查看某个端口
netstat -tlnp | grep 端口号
例子: 查80端口
netstat -tlnp | grep :80
输出:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
看什么:
- 最后一列:进程ID/进程名(1234/nginx)
参数解释
| 参数 | 含义 |
|---|---|
| -t | TCP端口 |
| -l | 只看监听中的 |
| -n | 显示数字,不解析域名 |
| -p | 显示进程名和PID |
查看所有监听端口
netstat -tlnp
四、ss命令(推荐)
ss是netstat的升级版,更快。
查看某个端口
ss -tlnp | grep 端口号
例子:
ss -tlnp | grep :80
查看所有监听端口
ss -tlnp
五、三种命令对比
| 命令 | 优点 | 缺点 |
|---|---|---|
| lsof | 信息全,能看文件 | 慢 |
| netstat | 经典,大家都用 | 慢 |
| ss | 最快,推荐 | 新命令 |
推荐: 用ss,最快。
六、常见场景
场景1:启动Nginx报端口被占
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
排查:
lsof -i:80
解决: 杀掉占用的进程
kill -9 进程ID
场景2:看MySQL有没有启动
ss -tlnp | grep 3306
有输出就是启动了。
场景3:看SSH端口
ss -tlnp | grep sshd
七、常见坑
坑1:没加sudo看不到进程
普通用户只能看自己的进程,看不到别人的。
解决: 加sudo
sudo lsof -i:80
sudo netstat -tlnp
坑2:netstat命令找不到
CentOS7最小化安装没有netstat。
安装:
yum install -y net-tools
坑3:lsof命令找不到
安装:
yum install -y lsof
八、常用命令汇总
# 查80端口被谁占了
lsof -i:80
netstat -tlnp | grep :80
ss -tlnp | grep :80
# 看所有监听端口
netstat -tlnp
ss -tlnp
# 杀掉占用80端口的进程
kill -9 $(lsof -ti:80)
总结
记住:
- 查端口用
lsof -i:端口号 - 或者用
ss -tlnp | grep 端口号 - 看最后一列就是进程名和PID
- 杀掉用
kill -9 进程ID - 推荐用ss,最快
最常用:
ss -tlnp | grep :80
遇到问题加QQ23979811 协助处理
服务器SSH安全加固,改端口和密钥登录
前言
服务器刚买,SSH一直被暴力破解?默认22端口全是黑客在扫。本文讲怎么SSH安全加固:改端口、禁用密码登录、用密钥登录。
一、为什么要加固SSH
默认SSH配置太危险:
- 端口22是公开的,黑客都扫
- root密码登录容易被暴力破解
- 密码可能被盗
二、第一步:改SSH端口
编辑SSH配置
vi /etc/ssh/sshd_config
找到:
#Port 22
改成:
Port 22222
(随便选个1024-65535之间的端口)
防火墙开放新端口
firewalld:
firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --reload
iptables:
iptables -I INPUT -p tcp --dport 22222 -j ACCEPT
重启SSH
systemctl restart sshd
注意: 改完端口后,连接SSH要用新端口:
ssh -p 22222 root@服务器IP
三、第二步:生成密钥对
在你自己电脑上生成
ssh-keygen -t rsa -b 4096
一路回车,生成两个文件:
~/.ssh/id_rsa(私钥,自己留着)~/.ssh/id_rsa.pub(公钥,传到服务器)
把公钥传到服务器
ssh-copy-id -p 22222 root@服务器IP
或者手动传:
# 服务器上创建.ssh目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 把公钥内容追加到authorized_keys
vi ~/.ssh/authorized_keys
# 把id_rsa.pub的内容粘进去
chmod 600 ~/.ssh/authorized_keys
测试密钥登录
ssh -p 22222 root@服务器IP
不用输密码就能登录就对了。
四、第三步:禁用密码登录
编辑SSH配置
vi /etc/ssh/sshd_config
找到:
#PasswordAuthentication yes
改成:
PasswordAuthentication no
找到:
#PermitRootLogin yes
改成:
PermitRootLogin prohibit-password
(允许root用密钥登录,但不允许密码登录)
重启SSH
systemctl restart sshd
五、第四步:其他安全设置
限制登录尝试次数
防止暴力破解:
MaxAuthTries 3
登录超时时间
ClientAliveInterval 300
ClientAliveCountMax 2
禁止空密码登录
PermitEmptyPasswords no
只允许特定用户登录
AllowUsers root
六、安装fail2ban
自动封禁暴力破解的IP。
安装
yum install -y epel-release
yum install -y fail2ban
配置
vi /etc/fail2ban/jail.local
加内容:
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 86400
启动
systemctl start fail2ban
systemctl enable fail2ban
七、完整配置文件参考
vi /etc/ssh/sshd_config
Port 22222
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
PermitEmptyPasswords no
改完重启:
systemctl restart sshd
八、常见坑
坑1:改完端口连不上了
原因: 防火墙没开放新端口。
解决:
- 云服务器还要在控制台安全组里开放端口
- 先开新窗口测试,别关旧窗口
坑2:密钥登录失败
原因: 权限不对。
检查:
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
正确权限:
- .ssh目录:700
- authorized_keys:600
坑3:禁用密码后进不去了
原因: 密钥没配好就禁用密码了。
解决: 一定先测试密钥登录成功,再禁用密码。
坑4:云服务器安全组没开
改了端口,防火墙也开了,但还是连不上。
原因: 云服务商的安全组没开。
解决: 去云控制台(阿里云/腾讯云)安全组里开放端口。
总结
记住:
- 改SSH默认端口(22改成别的)
- 生成密钥对,传公钥到服务器
- 测试密钥登录成功
- 禁用密码登录
- 安装fail2ban自动封IP
- 云服务器记得开安全组
安全加固顺序:
改端口 → 配密钥 → 测试登录 → 禁密码 → 装fail2ban
遇到问题加QQ23979811 协助处理
网站被黑了怎么排查,后门查杀方法
前言
网站突然被挂了黑链、被跳转、内容被篡改?别慌,本文讲网站被黑后怎么排查、怎么找后门、怎么清理。
一、怎么判断被黑了
常见现象
- 网站打开变成别的页面(赌博、色情)
- 网站里多了很多不认识的页面
- 百度搜索显示的标题不对
- 网站突然变慢、CPU飙升
- 后台密码被改了
二、第一步:找最近修改的文件
黑客一般会往网站目录里传后门文件。
找最近24小时修改的文件
find /www/wwwroot/你的站/ -mtime -1 -type f
找最近7天修改的文件
find /www/wwwroot/你的站/ -mtime -7 -type f
找最近修改的PHP文件
find /www/wwwroot/你的站/ -name "*.php" -mtime -7
重点看: 你不认识的、突然冒出来的PHP文件。
三、第二步:找可疑代码
找一句话木马
黑客常用的一句话后门:
<?php @eval($_POST['cmd']); ?>
搜索:
grep -r "eval(" /www/wwwroot/你的站/
grep -r "assert(" /www/wwwroot/你的站/
grep -r "base64_decode(" /www/wwwroot/你的站/
grep -r "str_rot13(" /www/wwwroot/你的站/
找加密的后门
很多后门是加密的:
grep -r "gzinflate(" /www/wwwroot/你的站/
grep -r "gzuncompress(" /www/wwwroot/你的站/
grep -r "strrev(" /www/wwwroot/你的站/
找下载文件的后门
grep -r "file_put_contents(" /www/wwwroot/你的站/
grep -r "fwrite(" /www/wwwroot/你的站/
四、第三步:看Web日志
看Nginx访问日志,找可疑的请求。
看最近的访问
tail -100 /var/log/nginx/access.log
找可疑的POST请求
grep "POST" /var/log/nginx/access.log | tail -50
找访问可疑文件的
grep ".php" /var/log/nginx/access.log | grep "cmd"
五、第四步:看进程
看有没有可疑进程在跑。
ps aux
重点看:
- 不认识的进程
- 占CPU很高的进程
- 从/tmp目录跑的进程
杀掉可疑进程:
kill -9 进程ID
六、第五步:看定时任务
黑客会加定时任务,维持后门。
crontab -l
看有没有不认识的定时任务。
还有系统级的:
cat /etc/crontab
ls /etc/cron.d/
七、第六步:看后门文件特征
常见后门文件名
- shell.php
- cmd.php
- 1.php
- x.php
- upload.php
- webshell.php
看文件权限
后门一般是777权限:
find /www/wwwroot/你的站/ -perm 777
八、清理方法
方法1:删除可疑文件
确认是后门的直接删:
rm -f /www/wwwroot/你的站/可疑文件.php
方法2:重新上传程序
最安全的方法: 备份数据库,重新上传干净的程序,再恢复数据库。
方法3:改所有密码
- 后台密码
- 数据库密码
- FTP密码
- SSH密码
九、预防措施
1. 程序及时更新
WordPress、ThinkPHP等程序有漏洞要及时更新。
2. 上传目录禁执行
location ~* /upload/.*\.php$ {
deny all;
}
3. 定期备份
每天自动备份网站文件和数据库。
4. 改后台地址
不要用默认的admin后台地址。
5. 用安全插件
WordPress可以装Wordfence等安全插件。
十、常见坑
坑1:只删文件不改密码
黑客可能已经留了别的后门,删一个没用。
正确: 删文件 + 改所有密码 + 看定时任务。
坑2:备份也被感染了
备份文件里也有后门,恢复后又被黑了。
解决: 备份也要查。
坑3:只查网站目录
黑客可能在系统里留了后门(比如/tmp目录)。
解决: 也要查系统进程、定时任务。
总结
记住:
- 先找最近修改的文件
- 再找可疑代码(eval、base64_decode)
- 看Web日志和进程
- 看定时任务
- 删后门 + 改所有密码
- 最安全是重新上传干净程序
最快排查:
find /www/wwwroot/你的站/ -name "*.php" -mtime -7
grep -r "eval(" /www/wwwroot/你的站/
遇到问题加QQ23979811 协助处理
Docker容器数据备份和迁移方法
前言
Docker容器删了数据就没了?想把容器从一台服务器迁到另一台?本文讲Docker容器数据备份和迁移的几种方法,包括容器快照、数据卷备份、镜像导出。
一、Docker数据存哪里
Docker数据有两种存法:
- 容器内部:数据存在容器的可写层,容器删了数据就没了
- 数据卷(Volume):数据存在宿主机上,容器删了数据还在
重要: 生产环境一定要用数据卷,不然容器一删数据全没。
二、方法1:容器快照(commit)
把容器当前状态打包成一个新镜像。
步骤
第一步:查看容器ID
docker ps
找到要备份的容器ID。
第二步:提交成新镜像
docker commit 容器ID 备份镜像名:标签
例子:
docker commit mynginx nginx-backup:v1
第三步:导出镜像成文件
docker save -o nginx-backup.tar nginx-backup:v1
第四步:传到新服务器
scp nginx-backup.tar root@新服务器IP:/root/
第五步:新服务器导入
docker load -i nginx-backup.tar
第六步:新服务器启动容器
docker run -d --name mynginx -p 80:80 nginx-backup:v1
优缺点
优点: 简单,整个容器都打包了
缺点: 镜像文件大,不适合大数据量
三、方法2:数据卷备份
如果用了数据卷,直接备份数据卷里的文件。
步骤
第一步:看数据卷挂载在哪
docker inspect 容器名 | grep Mounts
输出里找 Source,就是宿主机上的路径。
例子:
"Mounts": [
{
"Source": "/data/mysql",
"Destination": "/var/lib/mysql"
}
]
数据在宿主机的 /data/mysql 目录。
第二步:打包备份
tar -zcvf mysql-backup.tar.gz /data/mysql
第三步:传到新服务器
scp mysql-backup.tar.gz root@新服务器IP:/root/
第四步:新服务器解压
tar -zxvf mysql-backup.tar.gz -C /data/
第五步:新服务器启动容器,挂载数据卷
docker run -d --name mysql -v /data/mysql:/var/lib/mysql -p 3306:3306 mysql:5.7
优缺点
优点: 数据和容器分离,灵活
缺点: 要自己管理数据目录
四、方法3:docker cp拷贝文件
把容器里的文件拷出来。
拷出来
docker cp 容器名:/容器内路径 宿主机路径
例子:
docker cp mynginx:/usr/share/nginx/html /data/backup/html
拷进去
docker cp 宿主机路径 容器名:/容器内路径
例子:
docker cp /data/backup/html/index.html mynginx:/usr/share/nginx/html/
五、MySQL容器备份
备份MySQL数据
docker exec 容器名 mysqldump -uroot -p123456 数据库名 > backup.sql
例子:
docker exec mysql mysqldump -uroot -p123456 test > test.sql
恢复MySQL数据
docker exec -i 容器名 mysql -uroot -p123456 数据库名 < backup.sql
例子:
docker exec -i mysql mysql -uroot -p123456 test < test.sql
六、常见坑
坑1:容器删了数据没了
没用数据卷,容器删了数据全没。
解决: 一定要用 -v 挂载数据卷。
坑2:commit的镜像太大
把整个容器都打包了,包括临时文件。
解决: 尽量用数据卷备份,不要用commit。
坑3:数据权限不对
备份恢复后,容器里读不了数据。
原因: 文件所有者不对。
解决: 改权限:
chown -R 999:999 /data/mysql
(MySQL容器用的是999用户)
坑4:数据库没停就备份
MySQL还在写数据,备份出来不一致。
解决: 用mysqldump逻辑备份,不要直接拷文件。
总结
记住:
- 生产环境一定要用数据卷(-v)
- 小容器用commit快照备份
- 大数据量直接备份数据卷目录
- 数据库用mysqldump逻辑备份
- 备份完要测试能不能恢复
最常用:
# 备份数据卷
tar -zcvf backup.tar.gz /data/容器数据/
# 恢复数据卷
tar -zxvf backup.tar.gz -C /data/
遇到问题加QQ23979811 协助处理
MySQL数据库备份和恢复,mysqldump完整教程
前言
数据库备份是每个站长的基本功。MySQL最常用的备份工具就是mysqldump,简单好用。本文讲怎么用mysqldump备份和恢复数据库,包括完整命令和常见坑。
一、mysqldump是什么
mysqldump是MySQL自带的备份工具,把数据库导出成SQL文件,需要的时候再导入回去。
特点:
- 免费,MySQL自带
- 导出的是SQL文本,方便查看和编辑
- 适合小数据库(几十G以内)
二、备份数据库
备份单个数据库
mysqldump -u用户名 -p密码 数据库名 > 备份文件.sql
例子:
mysqldump -uroot -p123456 test > test.sql
注意: -p和密码之间没有空格。
备份多个数据库
mysqldump -uroot -p123456 --databases db1 db2 db3 > dbs.sql
备份所有数据库
mysqldump -uroot -p123456 --all-databases > all.sql
备份单个表
mysqldump -uroot -p123456 test users > users.sql
备份多个表
mysqldump -uroot -p123456 test users orders > tables.sql
三、常用参数
带删除表语句(--add-drop-table)
导出的SQL里会有 DROP TABLE IF EXISTS,恢复的时候先删表再建表。
mysqldump -uroot -p123456 --add-drop-table test > test.sql
默认就是开的。
不带建表语句(--no-create-info)
只导数据,不导表结构。
mysqldump -uroot -p123456 --no-create-info test > data.sql
只导表结构(--no-data)
只导表结构,不导数据。
mysqldump -uroot -p123456 --no-data test > structure.sql
压缩备份
mysqldump -uroot -p123456 test | gzip > test.sql.gz
解压:
gunzip test.sql.gz
指定端口
mysqldump -uroot -p123456 -P 3307 test > test.sql
指定主机
mysqldump -uroot -p123456 -h 1.2.3.4 test > test.sql
四、恢复数据库
方法1:用mysql命令
mysql -u用户名 -p密码 数据库名 < 备份文件.sql
例子:
mysql -uroot -p123456 test < test.sql
方法2:登录MySQL后source
mysql -uroot -p123456
mysql> use test;
mysql> source /root/test.sql;
恢复压缩备份
gunzip < test.sql.gz | mysql -uroot -p123456 test
五、定时备份脚本
写个备份脚本
#!/bin/bash
# 数据库配置
DB_USER="root"
DB_PASS="123456"
DB_NAME="test"
# 备份目录
BACKUP_DIR="/data/backup"
# 文件名(带日期)
DATE=$(date +%Y%m%d_%H%M%S)
FILE_NAME="${DB_NAME}_${DATE}.sql.gz"
# 备份
mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} | gzip > ${BACKUP_DIR}/${FILE_NAME}
# 删除7天前的备份
find ${BACKUP_DIR} -name "*.sql.gz" -mtime +7 -delete
echo "备份完成:${FILE_NAME}"
加执行权限
chmod +x /root/backup.sh
加到crontab
每天凌晨3点备份:
crontab -e
加一行:
0 3 * * * /root/backup.sh
六、常见坑
坑1:密码写在命令行里不安全
-p123456 会在进程列表里看到密码。
更安全的方法:
mysqldump -uroot -p test > test.sql
然后手动输入密码。
或者用配置文件:
# ~/.my.cnf
[mysqldump]
user=root
password=123456
然后直接:
mysqldump test > test.sql
坑2:大表备份很慢
数据多了以后,mysqldump会锁表,影响业务。
解决: 用 --single-transaction 参数:
mysqldump -uroot -p123456 --single-transaction test > test.sql
这个参数适合InnoDB,不锁表。
坑3:字符集不对
导出的SQL乱码。
加参数:
mysqldump -uroot -p123456 --default-character-set=utf8mb4 test > test.sql
坑4:自增ID不连续
恢复后自增ID变了。
正常现象,不用管。
坑5:备份文件太大
用gzip压缩:
mysqldump -uroot -p123456 test | gzip > test.sql.gz
七、备份验证
备份完了要验证一下能不能恢复。
看文件大小
ls -lh test.sql
不能是0字节。
看文件内容
head -20 test.sql
看开头是不是正常的SQL。
测试恢复
找个测试库恢复一下:
mysql -uroot -p123456 test_restore < test.sql
总结
记住:
- 备份:
mysqldump -uroot -p123456 数据库 > 备份.sql - 恢复:
mysql -uroot -p123456 数据库 < 备份.sql - 大表加
--single-transaction不锁表 - 用gzip压缩备份文件
- 定时备份要自动删旧备份
- 备份完要验证
最常用:
# 备份
mysqldump -uroot -p123456 --single-transaction test | gzip > test.sql.gz
# 恢复
gunzip < test.sql.gz | mysql -uroot -p123456 test
遇到问题加QQ23979811 协助处理
Nginx 502 Bad Gateway常见原因和解决办法
前言
网站突然打不开了,浏览器显示"502 Bad Gateway"?这是Nginx最常见的报错之一。本文讲502是什么意思、常见原因、怎么排查和解决。
一、502是什么意思
502 Bad Gateway = Nginx作为代理,从后端服务器(比如PHP-FPM)拿不到正常的响应。
简单说:Nginx收到了你的请求,然后去问后端"给我数据",后端没理它或者报错了,Nginx就返回502。
二、常见原因
原因1:PHP-FPM没启动
后端PHP服务没跑,Nginx找不到人。
检查:
ps aux | grep php-fpm
没输出就是没启动。
启动:
systemctl start php-fpm
或者:
service php-fpm start
原因2:PHP-FPM端口不对
Nginx配置里写的PHP-FPM地址不对。
比如:
fastcgi_pass 127.0.0.1:9000;
但PHP-FPM实际监听的是 /tmp/php-cgi.sock。
检查PHP-FPM监听:
netstat -tlnp | grep php-fpm
或者:
ss -tlnp | grep php-fpm
原因3:PHP代码报错
PHP代码有致命错误,直接挂了。
看PHP错误日志:
tail -f /var/log/php-fpm/www-error.log
或者:
tail -f /var/log/php/error.log
原因4:PHP超时了
程序跑太慢,超过Nginx或PHP-FPM的超时时间。
改Nginx超时:
fastcgi_read_timeout 300;
改PHP-FPM超时:
request_terminate_timeout = 300
原因5:PHP-FPM进程数不够
请求太多,PHP-FPM忙不过来。
看进程数:
ps aux | grep php-fpm | wc -l
改配置:
pm.max_children = 50
pm.start_servers = 20
原因6:内存不够了
PHP进程占满内存,系统把PHP杀了。
看内存:
free -h
看dmesg:
dmesg | grep oom
三、排查步骤
第一步:看Nginx错误日志
tail -f /var/log/nginx/error.log
常见报错:
| 报错 | 含义 |
|---|---|
| connect() failed (111: Connection refused) | PHP-FPM没启动 |
| Primary script unknown | 文件路径不对 |
| upstream timed out | PHP超时了 |
| recv() failed (104: Connection reset by peer) | PHP-FPM挂了 |
第二步:看PHP-FPM状态
systemctl status php-fpm
看是不是running。
第三步:看PHP错误日志
tail -f /var/log/php-fpm/www-error.log
看PHP代码有没有报错。
第四步:看系统资源
top
free -h
df -h
看CPU、内存、磁盘够不够。
四、常见解决方法
方法1:重启PHP-FPM
systemctl restart php-fpm
方法2:改Nginx配置
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 超时时间
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
}
方法3:改PHP-FPM进程数
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
改完重启:
systemctl restart php-fpm
方法4:开PHP错误显示
display_errors = On
error_reporting = E_ALL
五、常见坑
坑1:只重启Nginx,不重启PHP-FPM
502是后端的问题,重启Nginx没用。
正确: 重启PHP-FPM。
坑2:文件路径不对
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
错! 应该是:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
坑3:PHP-FPM版本不对
装了PHP7但Nginx还找PHP5的sock。
检查:
ls -la /var/run/php/
坑4:权限问题
PHP-FPM没权限读网站目录的文件。
解决:
chown -R www:www /www/wwwroot/
总结
记住:
- 502 = Nginx拿不到后端响应
- 先看Nginx错误日志
- 再看PHP-F启没启动
- 然后看PHP代码有没有报错
- 最后看系统资源够不够
最快排查:
tail -f /var/log/nginx/error.log
systemctl status php-fpm
遇到问题加QQ23979811 协助处理
Docker 常用命令大全
Docker 常用命令大全
Docker 现在开发必备,常用命令一定要熟练。
1. 镜像命令
查看本地镜像:
docker images
搜索镜像:
docker search nginx
拉取镜像:
docker pull nginx:latest
删除镜像:
docker rmi nginx:latest
删除所有镜像:
docker rmi $(docker images -q)
构建镜像:
# 在Dockerfile目录下
docker build -t myapp:1.0 .
2. 容器命令
查看运行中的容器:
docker ps
查看所有容器(包括停止的):
docker ps -a
启动容器:
docker run -d --name mynginx -p 80:80 nginx
参数说明:
- -d:后台运行
- --name:容器名
- -p:端口映射(主机:容器)
- -v:目录挂载
停止容器:
docker stop mynginx
启动已停止的容器:
docker start mynginx
重启容器:
docker restart mynginx
删除容器:
docker rm mynginx
强制删除运行中的容器:
docker rm -f mynginx
删除所有停止的容器:
docker container prune
3. 进入容器
进入容器命令行:
docker exec -it mynginx /bin/bash
退出容器:
exit
4. 日志查看
查看容器日志:
docker logs mynginx
实时查看日志:
docker logs -f mynginx
查看最近100行日志:
docker logs --tail 100 mynginx
5. 文件操作
从主机复制到容器:
docker cp index.html mynginx:/usr/share/nginx/html/
从容器复制到主机:
docker cp mynginx:/etc/nginx/nginx.conf ./
6. 容器信息
查看容器详情:
docker inspect mynginx
查看容器端口映射:
docker port mynginx
查看容器资源使用:
docker stats
7. 数据卷
创建数据卷:
docker volume create mydata
查看数据卷:
docker volume ls
使用数据卷:
docker run -d -v mydata:/data nginx
8. 网络
查看网络:
docker network ls
创建网络:
docker network create mynet
容器加入网络:
docker network connect mynet mynginx
9. 其他常用
查看Docker版本:
docker version
查看Docker信息:
docker info
清理无用资源:
docker system prune
10. 常用组合
启动一个PHP环境:
docker run -d --name php \
-p 8080:80 \
-v /www:/var/www/html \
php:apache
启动MySQL:
docker run -d --name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/mysql:/var/lib/mysql \
mysql:5.7
启动Redis:
docker run -d --name redis \
-p 6379:6379 \
redis:latest
总结
Docker 常用命令要点:
- docker images 看镜像
- docker ps 看容器
- docker run 启动容器
- docker exec 进入容器
- docker logs 看日志
- docker cp 复制文件
- docker stats 看资源
- -d 后台运行
- -p 端口映射
- -v 目录挂载
Docker 命令熟练了,开发部署效率提升很多。
Nginx 反向代理配置
Nginx 反向代理配置
反向代理是 Nginx 最常用的功能之一,配置很简单。
1. 什么是反向代理
反向代理就是:用户访问 Nginx,Nginx 把请求转发给后端服务器,再把结果返回给用户。
作用:
- 隐藏后端服务器
- 负载均衡
- 统一入口
- 缓存静态内容
2. 基本配置
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
说明:
- proxy_pass:后端地址
- proxy_set_header:传递请求头
3. 常用请求头
location / {
proxy_pass http://127.0.0.1:8080;
# 传递域名
proxy_set_header Host $host;
# 传递真实IP
proxy_set_header X-Real-IP $remote_addr;
# 传递完整请求链
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 传递协议
proxy_set_header X-Forwarded-Proto $scheme;
}
4. 超时配置
location / {
proxy_pass http://127.0.0.1:8080;
# 连接超时
proxy_connect_timeout 60s;
# 发送超时
proxy_send_timeout 60s;
# 读取超时
proxy_read_timeout 60s;
}
5. WebSocket 代理
location /ws {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
# WebSocket 升级
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
6. 负载均衡
# 定义后端服务器组
upstream backend {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
7. 静态文件直接返回
server {
listen 80;
server_name example.com;
# 静态文件直接处理
location ~* \.(js|css|png|jpg|gif)$ {
root /var/www/static;
expires 30d;
}
# 其他请求转发后端
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
8. 配置生效
# 检查配置
nginx -t
# 重载配置
nginx -s reload
9. 常见问题
1)502 Bad Gateway
- 后端服务没启动
- 后端端口不对
- 后端超时
2)504 Gateway Timeout
- 后端处理太慢
- 调整超时时间
3)获取不到真实IP
- 没配置 X-Real-IP
- 后端没读取请求头
4)WebSocket 连不上
- 没配置 Upgrade 和 Connection 头
10. 生产建议
1)一定要传请求头
- Host
- X-Real-IP
- X-Forwarded-For
2)合理设置超时
- 根据业务调整
- 不要太长也不要太短
3)静态文件 Nginx 直接处理
- 减轻后端压力
- 提高性能
4)开启 gzip 压缩
gzip on;
gzip_types text/css application/javascript;
总结
Nginx 反向代理配置要点:
- proxy_pass 指定后端地址
- 一定要传请求头
- 常用超时配置
- WebSocket 要升级头
- upstream 做负载均衡
- 静态文件直接返回
- 配置完 nginx -t 检查
- 502 检查后端是否启动
- 生产环境传全请求头
反向代理是 Nginx 基本功,一定要熟练掌握。
Linux 查看内存使用
Linux 查看内存使用
服务器内存不够用的时候,得知道谁在吃内存。
1. free 命令
最常用的查看内存命令:
free -h
输出说明:
- total: 总内存
- used: 已用内存
- free: 空闲内存
- shared: 共享内存
- buff/cache: 缓存
- available: 可用内存
注意: 不要只看 free,要看 available。Linux 会用空闲内存做缓存,这是好事。
2. top 命令
实时查看内存占用:
top
常用操作:
- 按
M按内存排序 - 按
P按CPU排序 - 按
q退出
重点看:
- %MEM:进程内存占用百分比
- RES:进程实际占用物理内存
3. ps 命令
查看进程内存占用:
# 按内存占用排序,前10
ps aux --sort=-%mem | head -10
输出说明:
- USER:进程用户
- %MEM:内存占用
- RSS:实际物理内存(KB)
- COMMAND:进程命令
4. vmstat 命令
查看整体内存和CPU:
# 每秒刷新一次
vmstat 1
重点列:
- swpd:交换分区使用
- free:空闲内存
- buff:缓冲区
- cache:缓存
- si:换入内存
- so:换出内存
注意: si 和 so 大于0说明内存不够,在用swap。
5. /proc/meminfo
查看详细内存信息:
cat /proc/meminfo
重点看:
- MemTotal:总内存
- MemFree:空闲内存
- MemAvailable:可用内存
- Buffers:缓冲区
- Cached:缓存
- SwapTotal:交换分区总量
- SwapFree:交换分区空闲
6. 缓存说明
Linux 内存缓存机制:
- 空闲内存用来做文件缓存
- 程序需要时会自动释放
- cached 高不是坏事
- available 才是真正可用的
7. 内存不够怎么办
1)找出吃内存的进程
ps aux --sort=-%mem | head
2)重启大内存进程
- 确认是哪个进程
- 重启释放内存
3)清理缓存
# 清理页面缓存
echo 1 > /proc/sys/vm/drop_caches
# 清理目录项和inode
echo 2 > /proc/sys/vm/drop_caches
# 全部清理
echo 3 > /proc/sys/vm/drop_caches
4)加交换分区
- 临时方案,治标不治本
- 最好加物理内存
8. 常用组合命令
# 查看内存占用前5的进程
ps aux --sort=-%mem | head -6
# 查看swap使用最多的进程
for i in $(ls /proc | grep -E '^[0-9]+'); do
awk '/VmSwap/{print $2/1024 " MB", $0}' /proc/$i/status 2>/dev/null
done | sort -nr | head
9. 监控建议
1)设置内存告警
- 超过80%告警
- 及时处理
2)定期检查
- 每天看一次内存
- 发现异常及时处理
3)不要盲目清缓存
- 缓存是好事
- 清缓存会降低性能
总结
Linux 查看内存使用要点:
- free -h 看整体内存
- top 按M看内存占用
- ps aux 排序找大进程
- vmstat 看swap使用
- /proc/meminfo 看详细信息
- 不要只看 free,要看 available
- cached 高是好事
- 内存不够先找大进程
- 清缓存要谨慎
- 最好加物理内存
学会看内存,服务器问题就好排查了。
Nginx 访问日志配置
Nginx 访问日志配置
访问日志是排查问题和分析流量的重要依据,配置好很有必要。
1. 默认日志位置
# 访问日志
/var/log/nginx/access.log
# 错误日志
/var/log/nginx/error.log
2. 日志格式
Nginx 默认有两种日志格式:
combined(默认)
log_format combined '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
common
log_format common '$remote_addr [$time_local] "$request" $status $body_bytes_sent';
3. 自定义日志格式
在 nginx.conf 的 http 块添加:
http {
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log main;
}
4. 常用日志变量
- $remote_addr: 客户端IP
- $time_local: 本地时间
- $request: 请求行
- $status: 状态码
- $body_bytes_sent: 发送字节数
- $http_referer: 来源页面
- $http_user_agent: 浏览器信息
- $request_time: 请求总耗时
- $upstream_response_time: 后端响应时间
5. 按站点分开日志
不同站点用不同日志文件:
server {
listen 80;
server_name a.com;
access_log /var/log/nginx/a.access.log;
}
server {
listen 80;
server_name b.com;
access_log /var/log/nginx/b.access.log;
}
6. 关闭日志
静态资源不记日志:
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
access_log off;
}
7. 日志切割
Nginx 自带日志切割:
http {
# 每天切割,保留30天
access_log /var/log/nginx/access.log main;
log_not_found off;
}
也可以用 logrotate:
# 配置文件
/etc/logrotate.d/nginx
8. 分析日志
统计访问量
# 统计总请求数
wc -l /var/log/nginx/access.log
# 统计独立IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
统计状态码
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c
统计访问最多的URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
总结
Nginx 访问日志配置要点:
- 默认日志在 /var/log/nginx/
- combined 是默认格式
- 自定义格式添加 $request_time 等变量
- 不同站点分开日志文件
- 静态资源可以关闭日志
- 日志要定期切割
- 用 awk 分析日志很方便
做好日志配置,排查问题和分析流量都有用。
Linux 查看磁盘空间
Linux 查看磁盘空间
服务器磁盘满了怎么办?这些命令帮你快速排查。
1. df 查看整体磁盘
基本用法
# 查看磁盘使用情况
df
# 人性化显示(带M、G单位)
df -h
常用参数
- -h: 人性化显示大小
- -T: 显示文件系统类型
- -i: 查看 inode 使用情况
# 常用组合
df -hT
输出说明:
- Filesystem: 磁盘分区
- Size: 总大小
- Used: 已用
- Avail: 可用
- Use%: 使用率
- Mounted on: 挂载点
2. du 查看目录大小
查看当前目录大小
# 当前目录总大小
du -sh
# 查看指定目录
du -sh /var/log
查看子目录大小
# 查看当前目录下每个子目录大小
du -sh *
# 按大小排序
du -sh * | sort -rh
常用参数
- -s: 只显示总计
- -h: 人性化显示
- --max-depth=1: 只看一层
# 查看根目录下各目录大小
du -sh /* --max-depth=1
3. 查找大文件
查找大于100M的文件
find / -type f -size +100M -exec ls -lh {} \;
查找最近修改的大文件
find /var -type f -size +50M -mtime -7
4. 常见排查场景
1)磁盘满了
# 先看哪个分区满了
df -h
# 找到大目录
du -sh /* | sort -rh
2)日志占空间
# 查看日志目录大小
du -sh /var/log
# 清空大日志文件
> /var/log/large.log
3)inode满了
# 查看inode使用
df -i
5. 清理磁盘
清理日志文件
# 清空文件(不删除文件)
> /var/log/messages
# 删除旧日志
rm /var/log/*.old
清理缓存
# 清理包缓存
yum clean all
清理 Docker 没用的镜像
docker system prune -a
总结
Linux 查看磁盘空间要点:
- df -h 查看整体磁盘使用
- du -sh 查看目录大小
- find 查找大文件
- 磁盘满了先看分区,再找大目录
- 日志文件要定期清理
- 注意 inode 也可能满
- 用 sort -rh 按大小排序
运维排查磁盘问题,这些命令天天用。
Docker 查看容器日志
Docker 查看容器日志
容器出问题怎么排查?先看日志,这些命令要会。
1. 查看容器日志
基本命令
# 查看全部日志
docker logs 容器名
# 查看容器ID
docker logs 容器ID
2. 常用参数
看最后几行
# 最后10行
docker logs --tail 10 容器名
# 最后20行
docker logs --tail 20 容器名
实时跟踪日志(最常用)
docker logs -f 容器名
带时间戳
docker logs -t 容器名
组合使用
# 实时跟踪 + 时间戳 + 最后10行
docker logs -f -t --tail 10 容器名
3. 按时间查看
# 最近10分钟的日志
docker logs --since 10m 容器名
# 最近1小时的日志
docker logs --since 1h 容器名
# 指定时间开始
docker logs --since "2024-01-01T00:00:00" 容器名
4. 多容器日志
docker-compose 查看日志
# 查看所有服务日志
docker-compose logs
# 实时跟踪
docker-compose logs -f
# 查看指定服务
docker-compose logs nginx
# 看最后50行
docker-compose logs --tail 50 nginx
5. 日志持久化
json-file 日志驱动(默认)
- 日志存在 /var/lib/docker/containers/
- 单个容器日志文件
配置日志大小限制
# docker-compose.yml
services:
app:
image: nginx
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
6. 常见排查场景
1)容器启动失败
docker logs 容器名
看最后几行报错信息。
2)接口报错
docker logs -f --tail 100 容器名
实时看请求日志。
3)查某个时间点的错误
docker logs --since "2024-01-01T10:00:00" 容器名 | grep "error"
7. 日志清理
清理单个容器日志
# 找到日志文件
sudo find /var/lib/docker/containers/ -name "*.log"
# 清空日志
sudo sh -c "echo > /var/lib/docker/containers/容器ID/容器ID-json.log"
重启容器自动清理
docker restart 容器名
总结
Docker 查看容器日志要点:
- docker logs 查看日志
- -f 实时跟踪最常用
- --tail 看最后几行
- -t 带时间戳
- --since 按时间查
- docker-compose logs 多容器
- 配置日志大小防止占满磁盘
- 排查问题先看日志
容器运维,看日志是第一步。