阶段二:企业级中间件-Nginx进阶
性能优化之三大法宝
动静分离
分类
Web应用中的资源可分为两类:
☆ 动态内容
需后端程序实时生成的数据(如PHP/Java接口返回的JSON、用户登录状态页),通常由应用服务器(如Tomcat、Node.js)处理。
☆ 静态内容
无需后端计算、可直接返回的文件(如图片、CSS/JS、字体文件),由Nginx直接高效处理。
动静分离的本质 将静态资源与动态请求分离到不同的服务或目录,通过Nginx精准路由,避免动态请求阻塞静态资源的高效传输,同时降低后端压力。
经典配置
server {
listen 80;
server_name example.com;
# 动态请求:转发到后端应用服务器(如Tomcat/Node.js)
location /api/ {
proxy_pass http://backend_server:8080/; # 指向后端服务地址
proxy_set_header Host $host; # 传递原始请求头
}
# 静态资源:直接由Nginx从本地目录返回
location ~* \.(jpg|jpeg|png|gif|css|js|woff|woff2|ico)$ {
root /var/www/static; # 静态资源存放目录
expires 30d; # 缓存30天(可选优化)
}
# 默认动态请求(如PHP/HTML模板)
location / {
proxy_pass http://app_server:3000/; # 指向应用服务器
}
}注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- 改完 Nginx 后先执行
nginx -t检查语法,再 reload,避免站点直接不可用。
客户端缓存
告知浏览器获取的信息是在某个区间时间段是有效的,基本格式:
expires 30s; //表示把数据缓存30秒
expires 30m; //表示把数据缓存30分
expires 10h; //表示把数据缓存10小时
expires 3d; //表示把数据缓存3天禁止缓存配置说明
add_header Cache-Control no-store;案例:缓存图片/js/css文件,缓存时间为1天
location ~* \.(jpg|jpeg|gif|png|js|css)$ {
expires 1d;
#add_header Cache-Control no-store;
}开启Gzip压缩
压缩文件大小变小了,传输更快了。目前市场上大部分浏览器是支持GZIP的。
IE6以下支持不好,会出现乱码情况。
http://nginx.org/en/docs/http/ngx_http_gzip_module.html
gzip on; # 第1行:开启Gzip压缩功能
gzip_min_length 1k; # 第2行:仅压缩大于1KB的文件(小于1KB的压缩后可能更大,不处理)
gzip_buffers 4 16k; # 第3行:压缩时使用的缓冲区数量(4个)和大小(每个16KB)
gzip_http_version 1.1; # 第4行:兼容HTTP/1.1协议(主流浏览器均支持)
gzip_comp_level 5; # 第5行:压缩级别(1-10),数字越大压缩率越高但CPU消耗越大(推荐5~6)
gzip_types text/plain
text/css
text/javascript
application/javascript
application/x-javascript
image/jpeg
image/gif
image/png
image/x-ms-bmp; # 第6行:指定要压缩的文件类型(优先压缩文本和图片)
gzip_vary on; # 第7行:在响应头中添加Vary: Accept-Encoding,帮助缓存服务器区分压缩/未压缩版本
gzip_disable "MSIE [1-6]\."; # 第8行:禁用对IE6及以下版本的Gzip(兼容性问题)
vary 是差异,多样化的意思。
gzip_vary 是 Nginx 配置中的一条指令,它用于控制是否在响应头中设置 Vary: Accept-Encoding 头部。具体来说:
gzip_vary on;:启用时,Nginx 会在响应头中加入 Vary: Accept-Encoding,表示不同的客户端可能会根据是否支持 gzip 压缩来收到不同的响应内容。这有助于缓存服务器(如 CDN)缓存压缩和未压缩的内容。
gzip_vary off;:禁用时,Nginx 不会在响应头中加入 Vary: Accept-Encoding,这意味着缓存服务器不会区分压缩与未压缩的内容。这样做通常会减少缓存的复杂性,但可能会导致某些情况缓存不一致。<sheet sheet-id="GD1Jyh" token="UzCBsee6ohkOUTtiOn7cpZRRnz6"></sheet>
常见压缩类型:
文本类(.html/.css/.js)
矢量图(.svg)
部分图片(.png/.jpg,但已压缩的图片效果有限)。
总结
<sheet sheet-id="gTfwS9" token="UzCBsee6ohkOUTtiOn7cpZRRnz6"></sheet>
日志分析
日志分类
<sheet sheet-id="qqRE9D" token="UzCBsee6ohkOUTtiOn7cpZRRnz6"></sheet>
参考地址:http://nginx.org/en/docs/http/ngx_http_log_module.html
access 访问日志
cat /usr/local/nginx/logs/access.log命令作用:
- 读取并输出
/usr/local/nginx/logs/access.log的内容;使用>重定向时,输出会写入目标文件。
执行结果:
- 成功后会输出指定文件内容;文件不存在或权限不足时会报错。
关键参数:
注意事项:
**注意事项:**作用:用于Nginx排错
error.log,默认记录配置启动错误信息和访问请求错误信息。
**关键参数:**
**注意事项:**注意:GoAccess分析的结果往往是一个html网页,如果想直接预览,建议直接把内容放置于Nginx访问目录
-f:指定文件 --log-format:分析的文件格式
...
}
}
}
...注意事项:
参数说明
**注意事项:**
本章聚焦三大典型企业级场景,结合实战命令与结果解读,助你掌握日志分析的“进阶用法”。
说明:
**注意事项:**
或者注意事项:
**注意事项:**
作用:利用Shell脚本对日志进行切割,把大的访问日志切割为一个一个小日志,方便后期存储以及查看分析
------------------华丽的分割线-------------------
#!/bin/bash
------------------华丽的分割线-------------------关键参数:
**注意事项:**
命令说明:
说明:
**注意事项:**
在后端服务器上,执行
...
}
}
}
...
<head>
</head>
<body>
这是后端服务器。
</body>
</html>注意事项:
在前端服务器上执行,
}
}
} } }
**注意事项:**注意事项:
1、正向代理用户可以感知到,比较典型应用(科学上网)
2、反向代理用户无感知,比较典型的应用(请求转发,更多应用在于负载均衡技术)
时间:2018.6.-2020.9
发布产品类型:互联网动态站点商城
随着业务量骤增,之前单点服务器,已经不能够满足业务使用需要,单服务器宕机,服务器提供服务,因为流量太大,备也宕机,需要多台服务器,同时提供服务。
网络层面的负载均衡
用ip+port接收请求,再转发到对应的机器
智能型负载均衡
根据虚拟的url地址,主机接收请求,再转向(反向代理)相应的处理服务器
| 角色 | IP | 主机名 | 功能 | 备注 |
|---|
**注意事项:**
命令说明:
说明:
**注意事项:**
在三台电脑上,都安装上Nginx注意事项:
注意事项:
第一步,备份
第二步,去掉注释,空行
第三步,简单查看配置
...
}
} } } }
**注意事项:**
}
}
}
}
}
}
}注意事项:
回到浏览器,多次访问,会发现
...
}
}
}
} } } }
**注意事项:**
在Web01和Web02服务器上
...
...
...
}
在Web01和Web02服务器上,分别重启注意事项:
**注意事项:**
注意事项:
注意事项:
>
>
>
>
>
>
注意事项:
**命令拆解:**
| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `--now` | 【普通】 | 要管理的 systemd 服务名称 `--now`,例如 `docker`、`nginx` 或 `sshd`。 |
**注意事项:**
请求时,一会正常一会不正常。有一台服务器并没有正常工作
解决办法:一台服务器一台测试,看看具体哪个后端服务宕机
特殊算法解析:
作用:普及一些Nginx发行版本,方便以后进行选择!
**命令拆解:**
| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `./configure` | 【普通】 | `./configure` 是这行命令的主程序,决定这条命令要调用哪个工具。 |
| `--prefix=/usr/local/tengine` | 【普通】 | 长参数 `--prefix` 的值是 `/usr/local/tengine`,用于精确控制命令行为。 |
**注意事项:**
安装步骤: