# Nginx性能优化与日志分析
1. 性能优化之三大核心手段
1.1 动静分离
分类
Web应用中的资源可分为两类:
动态内容: 需后端程序实时生成的数据(如PHP/Java接口返回的JSON、用户登录状态页),通常由应用服务器(如Tomcat、Node.js)处理。
静态内容: 无需后端计算、可直接返回的文件(如图片、CSS/JS、字体文件),由Nginx直接高效处理。
动静分离的本质
将静态资源与动态请求分离到不同的服务或目录,通过Nginx精准路由,避免动态请求阻塞静态资源的高效传输,同时降低后端压力。
经典配置(注意,非实验)
server {
listen 80; # 监听80端口
server_name example.com; # 绑定域名
# 动态请求:转发到后端应用服务器(如Tomcat/php/python/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,避免站点直接不可用。
1.2 客户端缓存
告知浏览器获取的信息是在某个区间时间段是有效的。
基本格式:
expires 30s; # 表示把数据缓存30秒
expires 30m; # 表示把数据缓存30分
expires 10h; # 表示把数据缓存10小时
expires 3d; # 表示把数据缓存3天注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
add_header Cache-Control no-store; # 禁止缓存注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
location ~* \.(jpg|jpeg|gif|png|js|css)$ {
expires 1d; # 缓存1天
# add_header Cache-Control no-store; # 禁止缓存(注释状态)
}注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
1.3 开启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 # 第6行:指定要压缩的文件类型
text/css
text/javascript
application/javascript
application/x-javascript
image/jpeg
image/gif
image/png
image/x-ms-bmp;
gzip_vary on; # 第7行:在响应头中添加Vary: Accept-Encoding,帮助缓存服务器区分压缩/未压缩版本
gzip_disable "MSIE [1-6]\."; # 第8行:禁用对IE6及以下版本的Gzip(兼容性问题)注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- 镜像地址、版本号和拉取权限要确认,否则 Pod 会进入
ImagePullBackOff。
gzip_vary 详解
vary 是差异,多样化的意思。
gzip_vary 是 Nginx 配置中的一条指令,它用于控制是否在响应头中设置 Vary: Accept-Encoding 头部。具体来说:
gzip_vary on;:启用时,Nginx 会在响应头中加入Vary: Accept-Encoding,表示不同的客户端可能会根据是否支持 gzip 压缩来收到不同的响应内容。这有助于缓存服务器(如 CDN)缓存压缩和未压缩的内容。
gzip_vary off;:禁用时,Nginx 不会在响应头中加入Vary: Accept-Encoding,这意味着缓存服务器不会区分压缩与未压缩的内容。这样做通常会减少缓存的复杂性,但可能会导致某些情况缓存不一致。
Gzip指令汇总
| 指令 | 作用 | 推荐值/说明 |
|---|---|---|
gzip on; | 开关Gzip功能 | 必须为 on 才生效 |
gzip_min_length 1k; | 最小压缩文件大小 | 避免小文件压缩后体积反而增大(默认20B~1k,建议1k~10k) |
gzip_buffers 4 16k; | 压缩缓冲区配置 | 4个16KB的缓冲区(根据服务器内存调整) |
gzip_http_version 1.1; | 兼容的HTTP协议版本 | 现代浏览器均支持1.1 |
gzip_comp_level 5; | 压缩级别 | 1(最快但压缩率低)~10(最慢但压缩率高),推荐5~6平衡性能与效果 |
gzip_types | 指定压缩的文件MIME类型 | 优先压缩文本(如HTML/CSS/JS)、常用图片(如JPEG/PNG) |
gzip_vary on; | 是否添加Vary头 | 帮助CDN/代理服务器正确缓存压缩与未压缩版本 |
gzip_disable "MSIE [1-6]\."; | 禁用低版本IE的Gzip | IE6对Gzip支持差,可能引发乱码 |
常见压缩类型:
- 文本类(.html/.css/.js)
- 矢量图(.svg)
- 部分图片(.png/.jpg,但已压缩的图片效果有限)
1.4 总结
| 优化方向 | 核心目标 | 关键技术 | 适用场景 |
|---|---|---|---|
| 动静分离 | 提升资源处理效率,降低后端压力 | Nginx路由分离(动态→后端,静态→本地/CDN) | 所有Web应用(尤其是高并发场景) |
| 客户端缓存 | 减少重复传输,加速二次访问 | expires/Cache-Control控制缓存时间 | 图片、CSS/JS等长期不变的静态资源 |
| Gzip压缩 | 减小传输体积,降低带宽消耗 | gzip模块压缩文本/图片 | 文本类资源(HTML/CSS/JS)、未高度压缩的图片 |
---
2. 日志分析
2.1 日志分类
| 日志类型 | 默认文件名 | 核心记录内容 | 默认存储路径(不同安装方式) |
|---|---|---|---|
| 访问日志 | access.log | 1、$remote_addr $upstream_status $request_time等变量组合(格式可自定义)<br>2、查看统计用户的访问信息与流量 | 源码安装:/usr/local/nginx/logs<br>yum/apt 安装:/var/log/nginx |
| 错误日志 | error.log | 1、配置语法错误、进程异常、连接超时等信息,含行号与错误码(如[emerg] bind() failed)<br>2、错误信息以及重写信息 | 同上 |
参考地址:http://nginx.org/en/docs/http/ngx_http_log_module.html
2.2 access 访问日志
# 查看访问日志(源码安装)
cat /usr/local/nginx/logs/access.log
# 查看访问日志(yum/apt安装)
cat /var/log/nginx/access.log命令作用:
- 读取并输出
/usr/local/nginx/logs/access.log的内容;使用>重定向时,输出会写入目标文件。
- 读取并输出
/var/log/nginx/access.log的内容;使用>重定向时,输出会写入目标文件。
执行结果:
- 成功后会输出指定文件内容;文件不存在或权限不足时会报错。
关键参数:
注意事项:
注意:
作用:针对Apache/Nginx访问日志进行分析,优点:轻量级、开源、带图形化界面!
常见组合:
**关键参数:**
**注意事项:**http://10.0.0.31/itheimadevops/report.html
注意:这种方式会大量持续消耗内存,生产环境禁用,适合快速排查问题参数说明:
更多参考:https://www.goaccess.cc/?mod=man
{ }, ] }
输出:
"goaccess"去掉引号:
输出:
100
输出:10.0.0.1
本章聚焦三大典型企业级场景,结合实战命令与结果解读,助你掌握日志分析的"进阶用法"。
--log-format=COMBINED
输出:
[
"browsers",
"general",
"hosts",
"not_found",
"os",
"referring_sites",
"requests",
"static_requests",
"status_codes",
"visit_time",
"visitors"
]统计访问量最高的IP地址
**Shell脚本实现同样功能**
执行结果:
说明:
统计404错误的请求
.status_codes.data[] | select(.data == "4xx Client Errors") | .hits.count
**Shell脚本实现同样功能**进阶实现
或者统计最热门的URL
**Shell脚本实现同样功能**---
反向代理的好处:
准备虚拟机
| 角色 | IP | 主机名 | 功能 |
|---|
修改主机名和hosts
**3台机器全部做解析**注意事项:
关闭防火墙与SELinux(3台机器全部操作)
**注意事项:**
**配置后端服务器**
在后端服务器192.168.88.122上,执行:命令说明:
[nginx-stable] baseurl=https://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
[nginx-mainline] baseurl=https://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
**注意事项:**
<head>
</head>
<body>
这是后端服务器。
</body>
</html>
注意事项:
这是后端服务器。配置代理服务器
在代理服务器上192.168.88.121执行:
**注意事项:**命令说明:
时间:2018.6.-2020.9
发布产品类型:互联网动态站点商城
随着业务量骤增,之前单点服务器,已经不能够满足业务使用需要,单服务器宕机,服务器提供服务,因为流量太大,备也宕机,需要多台服务器,同时提供服务。
网络层面的负载均衡,用ip+port接收请求,再转发到对应的机器
智能型负载均衡,根据虚拟的url地址,主机接收请求,再转向(反向代理)相应的处理服务器
| 对比项 | 四层负载均衡 | 七层负载均衡 |
|---|---|---|
| 底层实现 | 基于网络层与传输层,也就是IP + Port(套接字 socket)实现请求转发 | 基于应用层,通过URL地址请求转发 |
| 性能不同 | 相当于转发器,效率更高 | 需要通过URL判断才能实现转发,需要做额外的处理 |
| 安全性不同 | 不需要对用户URL请求进行判断 | 需要对用户URL请求进行判断,可以屏蔽异常请求,相对而言更加安全 |
| 维度 | Nginx | HAProxy |
|---|---|---|
| 定位 | Web 服务器 / 反向代理 + LB | 专职 L4/L7 负载均衡 |
| 算法 | 轮询、权重、IP hash | 算法更丰富,支持动态权重 |
| 健康检查 | 被动为主,无原生主动 HTTP 探测 | 支持主动 TCP/HTTP 检查 |
| 性能 | 优秀,适合 Web 场景 | 极高,长连接/大并发更优 |
| 其他 | 支持静态资源、缓存 | 专注 LB,无静态资源能力 |
| 角色 | IP | 主机名 | 功能 | 备注 |
|---|
修改IP、主机名和域名解析
**四台机器都做**注意事项:
关闭防火墙与SELinux(4台机器都做)
**注意事项:**
**安装Nginx**
在三台机器上都安装上Nginx注意事项:
注意事项:
注意事项:
**注意事项:**
}注意事项:
**注意事项:**
[connection]
id=ens33
uuid=69814cb5-4f67-3069-860d-c0e8274eedad
type=ethernet
autoconnect-priority=-999
interface-name=ens33
timestamp=1740691392
[ethernet]
[ipv4]
method=manual
dns=8.8.8.8
[ipv6]
addr-gen-mode=eui64
method=auto
[proxy]注意事项:
**注意事项:**
**整体参数分类**注意事项:
注意事项:
**注意事项:**
注意事项:
**注意事项:**
注意事项:
**注意事项:**
命令拆解:
| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
--now | 普通 | 要管理的 systemd 服务名称 --now,例如 docker、nginx 或 sshd。 |
注意事项:
**注意事项:**
作用:普及一些Nginx发行版本,方便以后进行选择!
http://tengine.taobao.org/
命令拆解:
| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
./configure | 普通 | ./configure 是这行命令的主程序,决定这条命令要调用哪个工具。 |
--prefix=/usr/local/tengine | 普通 | 长参数 --prefix 的值是 /usr/local/tengine,用于精确控制命令行为。 |
注意事项:
http://openresty.org/cn/
安装步骤:
**命令拆解:**
| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `./configure` | 【普通】 | `./configure` 是这行命令的主程序,决定这条命令要调用哪个工具。 |
| `--prefix=/usr/local/openresty` | 【普通】 | 长参数 `--prefix` 的值是 `/usr/local/openresty`,用于精确控制命令行为。 |
**注意事项:**
rpm安装的nginx日志文件默认会被系统日志轮转程序自动(不需要配置)切割成小日志文件,一天切割一次,默认最多保留52个旧日志文件