1. 使用logrotate工具实现日志自动轮转
logrotate是Debian系统自带的日志管理工具,可自动完成日志切割、压缩、删除等操作,避免日志文件无限增长。需编辑/etc/logrotate.d/nginx配置文件,示例如下:
/var/log/nginx/*.log {
daily # 每天切割一次(可根据需求改为hourly/weekly)
missingok # 若日志文件不存在,不报错
rotate 7 # 保留最近7天的日志(可根据磁盘空间调整)
compress # 使用gzip压缩旧日志(节省存储空间)
delaycompress # 延迟压缩(如rotate 7时,第7个日志不压缩,避免影响性能)
notifempty # 若日志为空,不进行切割
create 0640 www-data adm # 切割后创建新日志文件,权限为0640,属主www-data(Nginx默认用户),属组adm
sharedscripts # 所有日志切割完成后,统一执行后续命令(避免多次重启Nginx)
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid) # 向Nginx主进程发送USR1信号,使其重新打开日志文件
endscript
}
配置完成后,可通过logrotate -d /etc/logrotate.d/nginx测试配置是否正确(不实际执行),或logrotate -f /etc/logrotate.d/nginx强制立即执行。
2. 调整Nginx日志级别,减少不必要的日志记录
Nginx默认日志级别为info,会记录所有访问信息和一般错误。若无需详细调试信息,可将日志级别调整为warn或error,减少日志量:
/etc/nginx/nginx.conf的http块中修改error_log指令:error_log /var/log/nginx/error.log warn; # 将级别从info改为warn,仅记录警告及以上错误
server或location块无需记录访问日志(如静态资源目录),可直接关闭:server {
listen 80;
server_name static.example.com;
access_log off; # 关闭该server块的访问日志
location / {
root /var/www/static;
}
}
或通过if条件限制特定请求的日志记录(如健康检查接口):location /health {
access_log off; # 关闭/health接口的访问日志
return 200 "OK";
}
3. 自定义日志格式,减少冗余字段
默认的Nginx访问日志格式(combined)包含较多字段(如$http_referer、$http_user_agent),会增加日志大小。可根据需求自定义日志格式,仅保留必要字段:
在/etc/nginx/nginx.conf的http块中定义新的日志格式(如main):
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent';
access_log /var/log/nginx/access.log main; # 使用自定义格式
}
上述格式去掉了$http_referer、$http_user_agent等字段,减少了每条日志的大小(约减少30%-50%)。
4. 启用日志缓冲,减少磁盘I/O操作
Nginx默认每写入一条日志就同步到磁盘,高并发场景下会增加磁盘负载。可通过buffer和flush参数启用日志缓冲,批量写入磁盘:
在access_log指令中添加缓冲配置:
access_log /var/log/nginx/access.log main buffer=32k flush=5s;
buffer=32k:设置缓冲区大小为32KB(可根据服务器内存调整,建议16KB-128KB);flush=5s:设置缓冲区满或5秒后自动刷新到磁盘(平衡实时性与性能)。flush时间不宜过长(如超过30s),否则可能导致日志丢失(如Nginx崩溃)。5. 定期清理旧日志,释放磁盘空间
若无法使用logrotate或需要手动清理,可通过以下方式定期删除旧日志:
rm命令删除指定日期前的日志(如7天前):find /var/log/nginx -type f -name "*.log" -mtime +7 -exec rm -f {} \;
crontab -e添加定时任务,每天凌晨2点自动清理:0 2 * * * find /var/log/nginx -type f -name "*.log" -mtime +7 -exec rm -f {} \; >> /var/log/nginx_clean.log 2>&1
该命令会将清理日志记录到/var/log/nginx_clean.log中,便于排查问题。6. 优化Nginx配置,减少资源占用
日志占用过高可能伴随内存、CPU资源紧张,需优化Nginx配置提升整体性能:
/etc/nginx/nginx.conf的events块中设置worker_processes为CPU核心数(可通过lscpu命令查看):events {
worker_processes auto; # 自动匹配CPU核心数(推荐)
}
events块中设置worker_connections(每个worker的最大连接数):events {
worker_connections 1024; # 根据服务器内存调整(建议1024-4096)
}
http块中启用Gzip,减少传输数据量(降低带宽占用):http {
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_comp_level 6; # 压缩级别(1-9,建议6)
}
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
server {
location /static/ {
proxy_cache my_cache;
proxy_pass http://backend;
}
}
}