nginx性能调优与深度监控

一、nginx性能调优

1. 更改进程数与连接数

nginx是多进程模型,合理配置可提升并发能力

(1) 进程数

在配置文件 nginx.confmain 上下文设置:

nginx 复制代码
worker_processes auto; # 通常设置为 CPU 核心数或 auto 让系统决定

查看 CPU 核心数:grep processor /proc/cpuinfo | wc -l

(2) 连接数

单个进程的最大并发连接数由 worker_connections 决定

events 上下文中设置:

nginx 复制代码
events {
    worker_connections  1024; # 可根据系统文件描述符限制调整
}

系统最大并发连接数 ≈ worker_processes * worker_connections

检查系统文件描述符限制:ulimit -n。如需提高,需修改系统级限制(如 /etc/security/limits.conf

2. 静态缓存功能设置

缓存静态资源可减少后端压力,提升响应速度

(1) 设置静态资源缓存

serverlocation 块中针对静态文件类型设置:

nginx 复制代码
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d; # 设置客户端缓存过期时间为 30 天
    add_header Cache-Control "public, max-age=2592000"; # 兼容性设置
    # 其他可选:access_log off; 关闭日志减少 IO
}

(2) 验证

浏览器访问静态资源,查看响应头 ExpiresCache-Control 是否包含设置的缓存时间。

使用开发者工具(F12)检查网络请求,确认 (memory cache)(disk cache)

3. 设置连接超时

优化连接管理,释放闲置资源

httpserverlocation 块中设置:

nginx 复制代码
keepalive_timeout  65; # 保持连接的超时时间(秒)
client_header_timeout 15; # 读取客户端请求头超时
client_body_timeout   15; # 读取客户端请求体超时
send_timeout          15; # 发送响应超时

根据业务场景调整,避免过长占用连接或过短导致连接频繁重建

4. 日志切割

避免单个日志文件过大

(1) 编写脚本 创建脚本 /opt/fenge.sh

bash 复制代码
#!/bin/bash
# 获取昨天的日期
yesterday=$(date -d "yesterday" +%Y%m%d)
# nginx 日志目录
log_dir="/var/log/nginx"
# 切割日志:将 access.log 重命名为带日期的文件
mv ${log_dir}/access.log ${log_dir}/access_${yesterday}.log
# 发送 USR1 信号给 nginx 主进程,重新打开日志文件(会新建 access.log)
kill -USR1 $(cat /var/run/nginx.pid)

赋予执行权限:chmod +x /opt/fenge.sh

(2) 执行 /opt/fenge.sh,测试日志文件是否被切割

手动执行脚本:/opt/fenge.sh

检查 /var/log/nginx/ 目录下:

应存在 access_YYYYMMDD.log(如 access_20231001.log

应有新的 access.log 文件生成

后续可通过 cron 定时任务(如每天凌晨)自动执行

5. 配置网页压缩

使用 Gzip 压缩传输内容,减少带宽占用

(1) 参数含义

gzip on;: 启用 Gzip 压缩

gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;: 指定压缩的文件类型

gzip_comp_level 6;: 压缩级别 (1-9),越高压缩比越大但消耗 CPU

gzip_min_length 256;: 仅压缩长度大于此值的响应

gzip_vary on;: 添加 Vary: Accept-Encoding 响应头

(2) 配置

http 块中配置:

nginx 复制代码
http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_comp_level 6;
    gzip_min_length 256;
    gzip_vary on;
    # 可选:gzip_proxied any; 对代理请求也压缩
    # 可选:gzip_disable "msie6"; 对旧版 IE 禁用
}

重启 nginx 生效

验证:浏览器开发者工具查看响应头 Content-Encoding: gzip

二、nginx的深度监控

1. goaccess 概述

GoAccess 是一个开源的实时 Web 日志分析工具,支持命令行和 HTML 报告输出,能分析 nginx 的 access log,提供丰富的访问统计信息(如访问量、访客来源、请求路径、状态码、操作系统、浏览器等)

2. 配置

(1) 安装 goaccess

bash 复制代码
dnf -y install goaccess

(2) 配置中文环境

确保系统支持中文语言包(如 zh_CN.UTF-8

设置环境变量(或在 GoAccess 配置文件中指定):

bash 复制代码
export LANG=zh_CN.UTF-8

(3) goaccess 生成中文报告

命令行实时分析:

bash 复制代码
goaccess /var/log/nginx/access.log -o /path/to/report.html --log-format=COMBINED --real-time-html --daemonize

-o report.html: 输出 HTML 报告

--log-format=COMBINED: 使用 nginx 常见的 Combined 日志格式

--real-time-html: 实时更新 HTML 报告

--daemonize: 在后台运行

分析已有日志文件生成报告:

bash 复制代码
goaccess /var/log/nginx/access.log -o /path/to/report.html --log-format=COMBINED

查看报告: 用浏览器打开生成的 report.html 文件

(4) 测试

确保 nginx access log 有访问记录

执行上述命令生成报告

访问 report.html 文件,查看报告内容是否包含预期的访问数据(如 IP、请求 URL、状态码等),且界面显示应为中文(前提是环境变量设置正确)

对于实时报告,持续访问网站,刷新报告页面应能看到数据更新

相关推荐
ltl7 小时前
存储性能建模:IOPS、吞吐与延迟
linux
波波0077 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
刘某的Cloud9 小时前
ceph osd 导入导出 rbd volume 卷
linux·运维·ceph·volume
記億揺晃着的那天9 小时前
NAS 内网域名访问为什么需要浏览器授权
网络·nginx·js·nas
隔窗听雨眠10 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle
酸菜。11 小时前
dw_axi_dmac总结
linux
神奇霸王龙11 小时前
Agent 准入门控屠夫:5 旗舰 4 维度评估
linux·运维·数据库·ai·ai作画·agent·ai编程
鲸采云SRM采购管理系统11 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
那年窗外下的雪.11 小时前
AIDC 学习日志 第 04 天 BGP Underlay 基础与路由选择
服务器·学习·php
0x5312 小时前
Java网络编程(二)
java·服务器·网络