一、通过Nginx日志识别慢请求,定位性能瓶颈
要提升网站速度,首先需要明确“慢”的根源。Nginx日志中的$request_time(请求总处理时间,从接收第一个字节到发送最后一个字节)、$upstream_response_time(上游服务器响应时间,代理场景下)是关键指标。通过以下步骤分析:
http块中定义包含$request_time的日志格式(如log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $request_time';),并在server或location块中应用该格式(access_log /var/log/nginx/access.log main;),确保记录每个请求的处理时间。awk '$NF > 5 {print $0}' /var/log/nginx/access.log($NF代表最后一列,即$request_time);或按响应时间降序排列:awk '{print $NF, $7}' access.log | sort -rn | head -20(显示前20个最慢请求及对应URL)。$request_time高且关联数据库查询,需优化SQL语句或添加索引;若静态资源加载慢,可启用Gzip压缩或CDN加速。二、优化Nginx配置,提升请求处理效率
Nginx日志中的请求量(单位时间内的请求数)、状态码(如200、404、500)、流量($body_bytes_sent)等数据,可指导配置调整:
worker_processes(通常为CPU核心数的2倍,如worker_processes 4);调整worker_connections(每个worker的最大连接数,默认1024,可根据内存调整至2048或更高),提升并发处理能力。gzip on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript;,压缩文本类响应(如HTML、CSS、JS),减少传输数据量(通常可减少60%-70%),提升页面加载速度。expires 30d;或Cache-Control: max-age=2592000指令,减少重复请求。proxy_cache_path(如proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;)和proxy_cache_valid(如proxy_cache_valid 200 302 10m;),缓存后端响应,降低后端负载。sendfile on;(使用内核空间的sendfile函数传输文件,避免用户态与内核态拷贝);配合tcp_nopush on;(仅在sendfile开启时有效,将多个小包合并为大包发送),提升文件传输效率。三、建立实时监控与预警,快速响应性能问题
通过日志分析工具实现实时监控和自动化预警,及时发现并解决性能下降问题:
$request_time分布、状态码占比、请求量趋势等;GoAccess生成HTML报告,提供慢查询、流量来源等直观统计。$request_time超过5秒的请求数,若超过10次则发送邮件报警;或使用Prometheus+Granafa监控Nginx指标(如请求延迟、错误率),触发阈值时发送告警。四、清理与优化日志,减少I/O开销
日志文件过大或过多会增加磁盘I/O,影响Nginx性能:
logrotate工具定期切割日志(如按天切割),避免单个日志文件过大。配置示例(/etc/logrotate.d/nginx):/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
该配置每天切割日志,保留30天,压缩旧日志,并重新加载Nginx以创建新日志文件。error_log设为warn或error,而非info或debug),避免记录过多无关信息(如正常请求的详细信息),减少磁盘写入次数。