一、优化Nginx日志配置(基础准备)
要利用日志提升性能,首先需确保日志记录高效且聚焦关键信息,避免冗余数据占用资源。具体操作包括:
$request_time请求总耗时、$status状态码、$body_bytes_sent响应大小、$upstream_response_time后端响应时间),移除低价值字段(如$http_cookie)。例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time';
access_log /var/log/nginx/access.log main;
location ~* \.(jpg|css|js|ico)$ { access_log off; } # 忽略静态资源日志
map $status $loggable { ~^[23] 0; default 1; } # 仅记录非2xx/3xx状态码
access_log /var/log/nginx/errors.log main if=$loggable;
logrotate工具按日期分割日志(如每天1个文件),并启用压缩(compress),防止日志文件过大占用磁盘空间。例如:/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
sharedscripts
postrotate
systemctl reload nginx
endscript
}
buffer和flush参数开启异步日志写入,减少磁盘I/O对主线程的影响,提升Nginx处理请求的效率。例如:access_log /var/log/nginx/access.log main buffer=64k flush=5m;
二、通过日志分析定位性能瓶颈
日志是发现性能问题的“显微镜”,需重点分析以下指标:
awk等工具找出响应时间超过阈值的请求(如超过1秒),定位耗时较长的URL或接口。例如:awk '$NF > 1' /var/log/nginx/access.log | sort -nr | head -20 # 统计耗时TOP20请求
若$request_time长但$upstream_response_time为“-”,说明问题出在Nginx自身(如静态资源处理慢);若两者均长,则可能是后端服务(如PHP-FPM、数据库)性能不足。grep统计错误状态码(如500内部服务器错误、404未找到),分析错误根源。例如:grep ' 500 ' /var/log/nginx/error.log | tail -20 # 查看最近的500错误
grep ' 404 ' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr # 统计404错误的URL分布
频繁的404错误可能意味着网站链接失效或资源缺失,需修复;500错误可能与后端代码bug或资源不足有关。awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 # 统计访问量TOP10 IP
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 # 统计访问量TOP10 URL
高频访问的热门资源(如首页、商品详情页)可作为缓存优化的重点。三、基于日志分析结果的性能优化
根据日志分析发现的问题,采取针对性优化措施:
worker_connections(单个worker进程的最大连接数)、worker_processes(worker进程数,通常设为CPU核心数)等参数,提升Nginx的并发处理能力。例如:worker_processes auto; # 自动匹配CPU核心数
events {
worker_connections 1024; # 单个进程最大连接数
}
同时,启用gzip压缩(减少传输数据量)、调整keepalive_timeout(长连接超时时间,如设为65秒),优化传输效率。expires 30d;)或CDN加速,减少服务器负载。例如:location ~* \.(jpg|css|js|ico)$ {
expires 30d; # 缓存30天
gzip on; # 开启Gzip
gzip_types text/plain text/css application/json;
}
proxy_cache模块,设置合理的缓存时间(如inactive=60m),减少后端服务的请求压力。例如:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
location /api/ {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟
}
}
upstream模块配置负载均衡(如轮询、权重分配),将请求分发到多台后端服务器,提升整体处理能力。例如:upstream backend {
server 192.168.1.1 weight=3; # 权重3,处理更多请求
server 192.168.1.2;
}
server {
location / {
proxy_pass http://backend;
}
}
四、建立实时监控与预警机制
日志的价值在于持续跟踪,需搭建实时监控系统,及时发现性能异常:
GoAccess(轻量级实时分析工具)或ELK Stack(大规模日志分析平台)对日志进行可视化。例如:
goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED;