nginx性能调优与深度监控

一、nginx性能调优

1. 更改进程数与连接数

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

(1) 进程数

在配置文件 nginx.conf 的 main 上下文设置:

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) 设置静态资源缓存

在 server 或 location 块中针对静态文件类型设置:

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) 验证

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

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

3. 设置连接超时

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

在 http、server 或 location 块中设置:

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

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

相关推荐
cccccc语言我来了2 分钟前
Linux (11) 进程控制
linux·运维·数据库
菜菜的院子8 分钟前
WSL2 运行 Ubuntu 26.04 完整 GNOME 桌面(WSLg Wayland)
linux·运维·ubuntu·wsl
暖核16 分钟前
从 CentOS 到 Ubuntu24.04 运维迁移手册:命令对照表 + 实操 + 避坑
linux·运维·centos
pride.li19 分钟前
第12章 Python 教程-流程控制:循环结构
linux·服务器·python·算法
迷途之人不知返24 分钟前
【基础IO】-5-简单理解三个标准流——stdin、stdout、stderr
linux
牛马鸡niumasi25 分钟前
【Linux】进程退出
linux
北京中科新远科技26 分钟前
高速光链路故障排查实战:从DOM光功率到FEC与BER
运维·服务器·网络
ggaofeng1 小时前
如何配置snat(让内网访问外网)和dnat(将外网请求转发到内网服务器)
运维·服务器·snat·dnat·局域网访问外网·外网访问局域网
yyuuuzz2 小时前
云服务器搭建个人博客记录:一次访问超时的复盘
运维·服务器·数据库