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、状态码等),且界面显示应为中文(前提是环境变量设置正确)

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

相关推荐
tongxh4232 小时前
Nginx搭建负载均衡
运维·nginx·负载均衡
艾莉丝努力练剑2 小时前
【Linux:文件 + 进程】进程间通信进阶(1)
linux·运维·服务器·网络·c++·人工智能·进程
豆浆煮粉2 小时前
Linux驱动开发理解指针与结构体
linux·c语言·驱动开发
IMPYLH2 小时前
Linux 的 cat 命令
linux·运维·服务器
夜阑卧听风吹雨c2 小时前
Linux 基础操作命令笔记(Ubuntu 常用版)
linux
虾..2 小时前
Linux HTTP协议
linux·运维·http
海盗猫鸥2 小时前
「Linux工具」gcc/g++
linux·c语言·c++
波特率1152002 小时前
bash命令进阶学习(Shell 元字符)
linux·bash·shell
不知名。。。。。。。。2 小时前
仿muduo库实现高并发服务器---服务器TcpServer模块
运维·服务器