JavaScript 模板字符串应用核心用法解析(附代码示例)
做JavaScript开发这几年,模板字符串应用是被身边同事问得最多的问题之一。今天把答案整理出来,供大家参考。
HTML/CSS object-fit的用法核心用法解析(2026最新整理)
HTML/CSS的生态非常丰富,但object-fit的用法依然是最常用的功能点之一。本文整理了最实用的几种实现方式。
Python 多线程并发下载案例讲解
在日常Python开发中,多线程并发下载是一个出现频率非常高的话题。无论是新手还是有一定经验的开发者,都可能在细节上踩坑。本文将系统地梳理多线程并发下载的相关知识,并给出可以直接运行的示例代码。
HTML/CSS keyframes关键帧动画避坑指南(新手必看)
最近在项目里又遇到了keyframes关键帧动画的典型问题,索性把解决方法整理成这篇文章,希望能帮到遇到同样问题的同学。
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 协助处理
PHP常用数组函数,10个必须掌握
前言
PHP数组函数太多了,记不住?本文整理了10个最常用的数组函数,写代码天天用,必须掌握。
一、array_column — 取数组某一列
用法
$users = [
['id' => 1, 'name' => '张三'],
['id' => 2, 'name' => '李四'],
['id' => 3, 'name' => '王五']
];
$names = array_column($users, 'name');
// 结果:['张三', '李四', '王五']
取列并指定键
$userMap = array_column($users, 'name', 'id');
// 结果:[1 => '张三', 2 => '李四', 3 => '王五']
二、array_map — 遍历处理数组
用法
$numbers = [1, 2, 3, 4, 5];
$squares = array_map(function($n) {
return $n * $n;
}, $numbers);
// 结果:[1, 4, 9, 16, 25]
实际应用
// 把所有名字转成大写
$names = ['zhang', 'li', 'wang'];
$upperNames = array_map('strtoupper', $names);
// 结果:['ZHANG', 'LI', 'WANG']
三、array_filter — 过滤数组
用法
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$even = array_filter($numbers, function($n) {
return $n % 2 == 0;
});
// 结果:[2, 4, 6, 8, 10]
过滤空值
$arr = ['a', '', 0, null, 'b', '0'];
$result = array_filter($arr);
// 结果:['a', 'b']
四、array_merge — 数组合并
用法
$arr1 = ['a', 'b'];
$arr2 = ['c', 'd'];
$merged = array_merge($arr1, $arr2);
// 结果:['a', 'b', 'c', 'd']
关联数组合并
$arr1 = ['name' => '张三', 'age' => 20];
$arr2 = ['age' => 25, 'city' => '北京'];
$merged = array_merge($arr1, $arr2);
// 结果:['name' => '张三', 'age' => 25, 'city' => '北京']
// 注意:age被后面的覆盖了
五、in_array — 判断值是否在数组里
用法
$fruits = ['apple', 'banana', 'orange'];
if (in_array('apple', $fruits)) {
echo '有苹果';
}
注意严格模式
$arr = [1, '2', '3'];
in_array(2, $arr); // true(因为类型转换了)
in_array(2, $arr, true); // false(严格模式)
六、array_keys — 取数组的键
用法
$user = ['name' => '张三', 'age' => 20, 'city' => '北京'];
$keys = array_keys($user);
// 结果:['name', 'age', 'city']
找某个值的键
$ages = [
'张三' => 20,
'李四' => 25,
'王五' => 30
];
$keys = array_keys($ages, 25);
// 结果:['李四']
七、array_values — 取数组的值
用法
$user = ['name' => '张三', 'age' => 20, 'city' => '北京'];
$values = array_values($user);
// 结果:['张三', 20, '北京']
八、array_sum — 数组求和
用法
$numbers = [1, 2, 3, 4, 5];
$sum = array_sum($numbers);
// 结果:15
九、count — 统计数组长度
用法
$fruits = ['apple', 'banana', 'orange'];
$count = count($fruits);
// 结果:3
多维数组
$users = [
['name' => '张三'],
['name' => '李四']
];
count($users); // 2
count($users, COUNT_RECURSIVE); // 4(递归统计)
十、explode / implode — 字符串和数组互转
explode — 字符串转数组
$str = 'apple,banana,orange';
$fruits = explode(',', $str);
// 结果:['apple', 'banana', 'orange']
implode — 数组转字符串
$fruits = ['apple', 'banana', 'orange'];
$str = implode(',', $fruits);
// 结果:'apple,banana,orange'
十一、常用场景
场景1:从数据库取数据,提取某列
$users = Db::name('user')->select();
$names = array_column($users, 'name');
场景2:过滤空值
$list = array_filter($list);
场景3:判断是否存在
if (in_array($userId, $adminIds)) {
// 是管理员
}
场景4:数组去重后转字符串
$tags = array_unique($tags);
$tagStr = implode(',', $tags);
十二、常见坑
坑1:array_merge关联数组键名覆盖
问题: 相同键名会被覆盖。
解决: 用+号或array_replace。
坑2:in_array类型不严格
问题: in_array(0, ['a', 'b'])返回true。
解决: 加第三个参数true,严格模式。
坑3:count返回0
问题: 传了null进去。
解决: 先判断是不是数组。
总结
10个必须掌握的数组函数:
array_column— 取某一列array_map— 遍历处理array_filter— 过滤array_merge— 合并in_array— 判断存在array_keys— 取键array_values— 取值array_sum— 求和count— 统计长度explode/implode— 字符串数组互转
记住:
- 天天用的就是这10个
- 写代码前先想想有没有现成函数
- 别自己写循环,用内置函数更快
遇到问题加QQ23979811 协助处理
Nginx配置静态资源缓存,提升网站速度
前言
每次访问网站都要重新下载图片、CSS、JS?太浪费了!配置Nginx静态资源缓存,让浏览器本地缓存这些文件,下次访问直接从本地读,速度快好几倍。
一、什么是浏览器缓存
浏览器访问网站后,把图片、CSS、JS等静态文件存在本地。下次再访问,直接从本地读,不用再从服务器下载。
好处:
- 加载更快
- 省带宽
- 减轻服务器压力
二、配置静态资源缓存
打开Nginx配置文件,在server段加:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
参数解释
| 参数 | 含义 |
|---|---|
| expires 30d | 缓存30天 |
| expires 1h | 缓存1小时 |
| expires 1M | 缓存1个月 |
| Cache-Control public | 允许所有缓存 |
不同文件缓存时间
# 图片缓存30天
location ~* \.(png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
}
# CSS/JS缓存7天
location ~* \.(css|js)$ {
expires 7d;
}
# HTML不缓存(保证更新及时)
location ~* \.html$ {
expires -1;
}
三、验证配置
nginx -t
重载Nginx:
nginx -s reload
四、验证是否生效
方法1:curl测试
curl -I https://www.0454.wang/static/logo.png
看到响应头有:
Cache-Control: max-age=2592000
Expires: ...
就是生效了。
方法2:浏览器F12
按F12 → Network → 点图片请求 → 看Response Headers:
Cache-Control: max-age=2592000
五、缓存更新策略
问题: 缓存了30天,但我更新了图片怎么办?
方法1:文件名加版本号
<img src="/logo.png?v=20240101">
浏览器看到文件名变了,就会重新下载。
方法2:文件名加hash
<img src="/logo.abc123.png">
构建工具自动加hash,内容变了hash就变。
六、常见坑
坑1:HTML也被缓存了
问题: 更新了网站内容,但用户看到的还是旧的。
解决: HTML不缓存
location ~* \.html$ {
expires -1;
}
坑2:缓存时间太长
问题: 图片更新了,用户30天都看不到新的。
解决: 用版本号或hash。
坑3:CDN缓存了旧文件
问题: Nginx配置了,但CDN没刷新。
解决: 去CDN后台刷新缓存。
坑4:没加expires就没缓存
问题: 配置了但不生效。
检查: 看location有没有匹配到。
七、完整配置示例
server {
listen 80;
server_name www.0454.wang;
root /var/www/html;
# HTML不缓存
location ~* \.html$ {
expires -1;
}
# 图片缓存30天
location ~* \.(png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public";
}
# CSS/JS缓存7天
location ~* \.(css|js)$ {
expires 7d;
add_header Cache-Control "public";
}
}
八、缓存时间怎么设
| 文件类型 | 推荐缓存时间 |
|---|---|
| 图片(png/jpg) | 30天 |
| CSS/JS | 7天 |
| HTML | 不缓存 |
| 字体文件 | 30天 |
九、怎么清除缓存
浏览器端
- 强制刷新:Ctrl + F5
- 清除浏览器缓存
服务器端
- 更新文件名版本号
- 重载Nginx
总结
记住:
- 静态资源加缓存,提升速度
- 图片缓存30天
- CSS/JS缓存7天
- HTML不缓存
- 更新了就改文件名版本号
- 用curl验证是否生效
最常用配置:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public";
}
遇到问题加QQ23979811 协助处理
MySQL索引失效的10种场景,别再踩坑了
前言
明明加了索引,但查询还是慢?explain一看type是ALL,索引根本没生效!本文总结10种索引失效的场景,帮你避坑。
一、对索引字段用函数
失效写法
SELECT * FROM users WHERE LEFT(name, 3) = '张三';
SELECT * FROM users WHERE DATE(create_time) = '2024-01-01';
正确写法
SELECT * FROM users WHERE name LIKE '张三%';
SELECT * FROM users WHERE create_time >= '2024-01-01' AND create_time < '2024-01-02';
原因: 对索引字段用函数,MySQL不知道索引值会变成什么,索引用不上。
二、索引字段用运算
失效写法
SELECT * FROM users WHERE age + 1 = 20;
SELECT * FROM orders WHERE price * 2 > 100;
正确写法
SELECT * FROM users WHERE age = 19;
SELECT * FROM orders WHERE price > 50;
原因: 运算后索引值变了,MySQL没法用索引。
三、最左前缀原则不满足
联合索引
INDEX idx_name_age_city(name, age, city)
失效写法
SELECT * FROM users WHERE age = 20; -- 跳过了name
SELECT * FROM users WHERE city = '北京'; -- 跳过了name和age
正确写法
SELECT * FROM users WHERE name = '张三';
SELECT * FROM users WHERE name = '张三' AND age = 20;
原则: 联合索引要从最左边的字段开始用,不能跳过。
四、like以%开头
失效写法
SELECT * FROM users WHERE name LIKE '%张三%';
SELECT * FROM users WHERE name LIKE '%张三';
正确写法
SELECT * FROM users WHERE name LIKE '张三%';
原因: 以%开头,MySQL不知道从哪开始找,索引用不上。
五、类型不匹配
失效写法
-- phone是varchar类型
SELECT * FROM users WHERE phone = 13800138000; -- 传了数字
正确写法
SELECT * FROM users WHERE phone = '13800138000'; -- 传字符串
原因: 类型不匹配,MySQL会做隐式转换,索引用不上。
六、OR两边有没索引的字段
失效写法
-- name有索引,age没索引
SELECT * FROM users WHERE name = '张三' OR age = 20;
原因: OR只要有一边没索引,MySQL就干脆全表扫描。
解决
-- age也加索引
ALTER TABLE users ADD INDEX idx_age(age);
七、使用NOT、!=、<>
失效写法
SELECT * FROM users WHERE name != '张三';
SELECT * FROM users WHERE age NOT IN (18, 20);
原因: 不等于操作,MySQL觉得要查大部分数据,不如全表扫描。
解决
-- 改成范围查询
SELECT * FROM users WHERE name > '张三';
八、is null / is not null
这个要看情况,有的版本会失效,有的不会。
建议: 尽量让字段不要为null,设默认值。
九、查询条件用了函数或表达式
失效写法
SELECT * FROM users WHERE ABS(age) = 20;
SELECT * FROM users WHERE age / 2 = 10;
正确写法
SELECT * FROM users WHERE age = 20;
十、MySQL自己判断不走索引
有时候SQL写法没问题,但MySQL优化器觉得走索引还不如全表扫描。
比如: 表数据很少,或者要查的数据占表的大部分。
解决: 用FORCE INDEX强制走索引
SELECT * FROM users FORCE INDEX(idx_name) WHERE name = '张三';
十一、怎么检查索引有没有生效
用explain
EXPLAIN SELECT * FROM users WHERE name = '张三';
看key字段:
- key有值:用了索引
- key是NULL:没用到索引
看type字段:
- type=ALL:全表扫描
- type=ref/range:用了索引
十二、常见坑
坑1:加了索引但SQL写法不对
解决: 按上面10种场景检查。
坑2:索引加太多
索引不是越多越好,写的时候要维护索引,会变慢。
建议: 单表索引不超过5个。
坑3:区分度低的字段不加索引
比如gender(男/女),加索引没用。
原则: 区分度高的字段加索引。
坑4:隐式类型转换
例子: varchar字段传了数字。
解决: 传参时类型要匹配。
十三、索引使用原则
- 对WHERE条件的字段加索引
- 对ORDER BY的字段加索引
- 联合索引遵守最左前缀
- 不要对索引字段用函数
- 不要对索引字段做运算
- like不要以%开头
- 类型要匹配
- 区分度高的字段加索引
总结
10种索引失效场景:
- 对索引字段用函数
- 索引字段用运算
- 最左前缀原则不满足
- like以%开头
- 类型不匹配
- OR两边有没索引的字段
- 使用NOT、!=、<>
- is null / is not null
- 查询条件用了表达式
- MySQL自己判断不走索引
记住:
- 用explain检查索引有没有生效
- key=NULL就是没用到索引
- type=ALL就是全表扫描
- 避开上面10种场景
遇到问题加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 协助处理
Nginx配置Gzip压缩,提升网站加载速度
前言
网站打开慢?带宽不够?开启Nginx的Gzip压缩,能把文件体积压缩70%以上,加载速度立马提升好几倍。本文讲怎么配置。
一、什么是Gzip
Gzip是一种压缩算法,Nginx在发给浏览器之前先把文件压缩,浏览器收到后自动解压。
效果:
- HTML/CSS/JS文件压缩70%左右
- 减少带宽
- 加载更快
二、配置Gzip
打开Nginx配置文件:
vi /etc/nginx/nginx.conf
在http段里加:
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
gzip_vary on;
gzip_buffers 16 8k;
gzip_http_version 1.1;
参数解释
| 参数 | 含义 |
|---|---|
| gzip on | 开启gzip |
| gzip_min_length 1k | 小于1k的文件不压缩 |
| gzip_comp_level 6 | 压缩级别1-9,6最合适 |
| gzip_types | 压缩哪些类型的文件 |
| gzip_vary on | 给响应头加Vary: Accept-Encoding |
| gzip_buffers | 压缩缓冲区 |
压缩级别说明
| 级别 | 效果 |
|---|---|
| 1 | 最快,压缩率最低 |
| 6 | 推荐,平衡 |
| 9 | 最慢,压缩率最高 |
推荐用6,不要用9,太吃CPU。
三、验证配置
nginx -t
重载Nginx:
nginx -s reload
四、验证是否生效
方法1:curl测试
curl -I -H "Accept-Encoding: gzip" https://www.0454.wang/
看到响应头有:
Content-Encoding: gzip
就是生效了。
方法2:浏览器F12
按F12打开开发者工具 → Network → 点请求 → 看Response Headers:
Content-Encoding: gzip
五、哪些文件该压缩
该压缩的
- HTML文件
- CSS文件
- JS文件
- JSON数据
- SVG图片
不该压缩的
- 图片(jpg/png):本身已经压缩过了
- 视频:太大,压缩没意义
- 压缩包(zip/rar):已经压缩过了
六、常见坑
坑1:只在http段配了,但server段覆盖了
检查: 看server段有没有gzip off。
坑2:gzip_types没写全
问题: JS文件没压缩。
解决: 加上application/javascript。
坑3:压缩级别太高
问题: 用了9,CPU飙升。
解决: 改成6。
坑4:CDN缓存了旧文件
问题: 配置了gzip但CDN没生效。
解决: 刷新CDN缓存。
七、完整配置示例
http {
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
gzip_vary on;
gzip_buffers 16 8k;
gzip_http_version 1.1;
server {
listen 80;
server_name www.0454.wang;
root /var/www/html;
index index.html;
}
}
八、对比效果
没开Gzip
HTML文件:100KB
开了Gzip
HTML文件:25KB
省了75%!
总结
记住:
- 开启gzip on
- 压缩级别用6
- gzip_types要写全
- 图片不要压缩
- 用curl验证是否生效
最常用配置:
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
gzip_vary on;
遇到问题加QQ23979811 协助处理