1. 日志輪轉:定期分割與清理日志文件
使用Linux系統自帶的logrotate
工具實現日志的定期輪轉、壓縮和清理,避免單個日志文件過大占用磁盤空間。典型配置示例如下(保存為/etc/logrotate.d/nginx
):
/var/log/nginx/*.log {
daily # 每天輪轉(可根據流量調整為hourly/weekly)
rotate 7 # 保留最近7天的日志
compress # 壓縮舊日志(節省空間)
delaycompress # 延遲壓縮前一日日志(避免壓縮當天日志影響性能)
missingok # 若日志文件不存在也不報錯
notifempty # 若日志為空則不輪轉
create 0640 www-data adm # 創建新日志文件并設置權限
sharedscripts # 所有日志輪轉完成后統一執行postrotate腳本
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` # 通知Nginx重新打開日志文件
endscript
}
該配置可實現日志的自動管理,無需手動干預。
2. 精簡日志格式:減少不必要的信息記錄
通過自定義log_format
指令,僅保留對故障排查、性能分析有用的字段(如客戶端IP、請求時間、狀態碼、請求方法/路徑、響應大小等),移除冗余信息(如User-Agent、Referer等)。示例:
log_format minimal '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log minimal;
若無需記錄訪問日志,可直接禁用特定location
或全局的訪問日志:
location /static/ {
access_log off; # 靜態資源請求不記錄訪問日志
}
自定義格式能有效減少日志文件大小,降低磁盤I/O壓力。
3. 異步日志記錄:降低I/O對業務性能的影響
通過buffer
和flush
參數配置異步日志,Nginx先將日志寫入內存緩沖區,待緩沖區滿或達到指定時間后再寫入磁盤,減少頻繁的磁盤寫入操作。示例:
access_log /var/log/nginx/access.log buffer=32k flush=1m; # 緩沖區32KB,每分鐘刷新一次
error_log /var/log/nginx/error.log buffer=16k flush=30s; # 錯誤日志緩沖區16KB,每30秒刷新一次
異步日志能顯著提升Nginx的高并發處理能力,避免日志寫入成為性能瓶頸。
4. 日志壓縮:節省存儲空間
結合logrotate
的compress
參數(使用Gzip算法)或lz4
算法(更高壓縮率、更快壓縮速度),對舊日志進行壓縮。logrotate
配置示例:
/var/log/nginx/*.log {
...
compress # 啟用Gzip壓縮(默認)
compresscmd /usr/bin/lz4 # 使用lz4壓縮(需安裝lz4工具)
compressext .lz4 # 壓縮文件擴展名
delaycompress # 延遲壓縮
}
壓縮后的日志文件大小可減少至原文件的10%~20%(Gzip)或5%~10%(LZ4),大幅節省存儲空間。
5. 優化存儲位置與介質:提升I/O性能
將Nginx日志目錄(如/var/log/nginx
)掛載到SSD分區(而非機械硬盤),利用SSD的高速讀寫性能提升日志寫入速度??赏ㄟ^df -h
命令確認掛載介質類型,若未使用SSD,可修改/etc/fstab
文件將日志目錄掛載到SSD。
6. 禁用不必要日志:減少冗余記錄
根據業務需求,禁用無需記錄的模塊或location
日志。例如:
location /health {
access_log off;
return 200 'OK';
}
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
access_log off;
expires 30d; # 設置緩存時間
}
禁用不必要日志能有效降低日志文件大小和I/O負載。
7. 日志監控與報警:及時發現異常
通過監控工具(如Prometheus+Grafana、Zabbix、ELK Stack)實時監控Nginx日志的大小、增長速率、寫入延遲等指標,設置報警閾值(如日志文件超過10GB、增長速率超過1GB/hour),及時處理日志異常(如日志暴增導致磁盤空間耗盡)。監控能幫助提前預警,避免因日志問題影響服務可用性。