一、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、状态码等),且界面显示应为中文(前提是环境变量设置正确)
对于实时报告,持续访问网站,刷新报告页面应能看到数据更新