要利用日志优化服务器配置,首先需要确保日志记录的内容足够全面且高效。需重点调整以下配置:
log_format指令添加关键字段(如客户端IP、请求时间、URL、状态码、响应时间、User-Agent等),便于后续分析。例如: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';
access_log /var/log/nginx/access.log main;
其中$request_time(请求处理时间)、$body_bytes_sent(响应体大小)是分析性能的关键指标。logrotate工具定期切割日志(如每天轮转1次,保留7天),避免单个日志文件过大占用磁盘空间。示例配置:/var/log/nginx/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 nginx adm
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
open_log_file_cache指令减少磁盘I/O操作,提升日志记录效率。例如:open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
awk命令找出访问量最高的URL或IP,判断是否存在恶意爬虫或热点资源。例如:# 统计Top 10访问量URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
# 统计Top 10访问IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
awk '$NF > 1' /var/log/nginx/access.log # NF表示最后一个字段($request_time)
awk '$9 >= 400 {print $9, $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
grep命令过滤错误日志(如500内部错误、404未找到),定位具体原因。例如:# 查找500错误及对应URL
grep ' 500 ' /var/log/nginx/error.log | awk -F'"' '{print $6, $7}'
# 查找404错误及对应URL
grep ' 404 ' /var/log/nginx/access.log | awk -F'"' '{print $7}'
worker_processes(通常设为auto,自动匹配CPU核心数);通过worker_connections调整每个Worker的最大连接数(如1024)。例如:worker_processes auto;
events {
worker_connections 1024;
}
gzip指令压缩文本类响应(如HTML、CSS、JS),降低带宽占用。例如: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的文件
expires指令设置静态资源(如图片、CSS、JS)的缓存时间,降低服务器负载。例如:location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
keepalive_timeout(如65秒)和keepalive_requests(如100),减少TCP握手开销。例如:keepalive_timeout 65;
keepalive_requests 100;
slowlog指令记录处理时间超过阈值的请求(如500ms),进一步分析慢请求的原因(如后端响应慢、数据库查询慢)。例如:log_format slow '$remote_addr - $remote_user [$time_local] "$request" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time';
access_log /var/log/nginx/slow.log slow;
slowlog_threshold 500ms;
proxy_cache指令缓存后端响应(如API接口),减少重复请求到后端的次数。例如: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;
}
}
GoAccess生成HTML报告,直观展示访问量、状态码、用户分布等信息。例如:sudo apt install goaccess
goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/html/report.html
ELK Stack(Elasticsearch+Logstash+Kibana)搭建日志管理系统,支持大规模日志存储、搜索和可视化。Prometheus和Grafana,通过Nginx Exporter采集Nginx指标(如请求量、响应时间、错误率),实现实时监控和告警。通过以上步骤,可系统性地利用Nginx日志定位服务器配置问题,并针对性地优化,提升服务器性能、稳定性和安全性。