要优化网站加载速度,首先需要通过日志定位问题根源。关键日志配置是基础:在nginx.conf中定义包含request_time(请求处理时间)、upstream_response_time(上游服务器响应时间)、body_bytes_sent(响应体大小)的日志格式,例如:
log_format performance '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" request_time=$request_time upstream_response_time=$upstream_response_time';
access_log /var/log/nginx/performance.log performance;
通过此配置,可记录每个请求的详细性能数据。分析工具与方法:
awk筛选慢请求(如处理时间超过2秒的请求),并按URL排序:awk '$6 > 2 {print $7, $6}' /var/log/nginx/performance.log | sort -k2 -rn | head -20
该命令可找出最耗时的URL,优先优化高频慢请求。根据日志分析结果,调整Nginx配置以提升并发处理能力和资源利用率:
worker_processes设置为服务器CPU核心数(如worker_processes auto;),充分利用多核CPU;在events块中增加worker_connections(如worker_connections 1024;),提升单进程并发连接数。keepalive_timeout设置长连接超时时间(如keepalive_timeout 65s;),减少TCP频繁建立/关闭的开销;配合keepalive_requests(如keepalive_requests 100;)限制单连接请求数,避免连接资源耗尽。client_body_buffer_size(如client_body_buffer_size 16k;)、client_header_buffer_size(如client_header_buffer_size 1k;)等参数,匹配客户端请求大小,避免频繁内存分配。缓存是提升加载速度的关键手段,通过日志识别高频访问且变化少的资源(如静态文件、API响应),配置对应缓存策略:
expires或Cache-Control头,例如:location ~* \.(jpg|jpeg|png|gif|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
此配置可使浏览器缓存资源30天,减少重复下载。proxy_cache模块缓存,例如:proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
location /api/ {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟
proxy_pass http://backend;
}
通过缓存动态内容,降低后端服务器负载,提升响应速度。通过Gzip压缩HTML、CSS、JavaScript等文本资源,减少传输数据量(通常可压缩至原大小的30%-70%)。在Nginx配置中启用Gzip:
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024; # 只压缩大于1KB的文件
gzip_comp_level 6; # 压缩级别(1-9,越高压缩率越高,但CPU消耗越大)
gzip_vary on; # 添加Vary头,避免缓存问题
日志分析中,可通过body_bytes_sent字段对比压缩前后的传输量,验证压缩效果。
若日志中upstream_response_time(上游响应时间)较长,需优化后端服务器或负载均衡策略:
upstream模块将流量分发到多台后端服务器,例如:upstream backend {
server 192.168.1.101;
server 192.168.1.102;
keepalive 32; # 长连接复用,减少连接建立开销
}
location / {
proxy_pass http://backend;
}
通过负载均衡,避免单台服务器过载,提升整体处理能力。proxy_connect_timeout(连接上游超时时间,如60s)、proxy_send_timeout(发送请求到上游超时时间,如60s)、proxy_read_timeout(读取上游响应超时时间,如60s),避免因上游响应慢导致请求堆积。通过实时日志分析,及时发现性能异常并预警: