# 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/;          # 指向应用服务器
    }
}

注意事项:

1.2 客户端缓存

告知浏览器获取的信息是在某个区间时间段是有效的。

基本格式:

expires 30s;    # 表示把数据缓存30秒
expires 30m;    # 表示把数据缓存30分
expires 10h;    # 表示把数据缓存10小时
expires 3d;     # 表示把数据缓存3天

注意事项:

add_header Cache-Control no-store;                  # 禁止缓存

注意事项:

location ~* \.(jpg|jpeg|gif|png|js|css)$ {
    expires 1d;                                     # 缓存1天
    # add_header Cache-Control no-store;            # 禁止缓存(注释状态)
}

注意事项:

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(兼容性问题)

注意事项:

gzip_vary 详解

vary 是差异,多样化的意思。

gzip_vary 是 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的GzipIE6对Gzip支持差,可能引发乱码

常见压缩类型:

1.4 总结

优化方向核心目标关键技术适用场景
动静分离提升资源处理效率,降低后端压力Nginx路由分离(动态→后端,静态→本地/CDN)所有Web应用(尤其是高并发场景)
客户端缓存减少重复传输,加速二次访问expires/Cache-Control控制缓存时间图片、CSS/JS等长期不变的静态资源
Gzip压缩减小传输体积,降低带宽消耗gzip模块压缩文本/图片文本类资源(HTML/CSS/JS)、未高度压缩的图片

---

2. 日志分析

2.1 日志分类

日志类型默认文件名核心记录内容默认存储路径(不同安装方式)
访问日志access.log1、$remote_addr $upstream_status $request_time等变量组合(格式可自定义)<br>2、查看统计用户的访问信息与流量源码安装:/usr/local/nginx/logs<br>yum/apt 安装:/var/log/nginx
错误日志error.log1、配置语法错误、进程异常、连接超时等信息,含行号与错误码(如[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

命令作用:

执行结果:

关键参数:

注意事项:

注意:

作用:针对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请求进行判断,可以屏蔽异常请求,相对而言更加安全
维度NginxHAProxy
定位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,例如 dockernginxsshd

注意事项:


**注意事项:**



作用:普及一些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个旧日志文件