简介
Nginx是一款流行的 Web 服务器和反向代理服务器,以其高性能和高效率而闻名。适当的日志记录和日志轮换对于监控和维护 Nginx 服务器的健康状况至关重要。本教程将指导你如何在 Ubuntu 上配置 Nginx 的日志记录并设置日志轮换。
本教程的目标是手把手教你如何在 Linux 服务器上安装和配置 Nginx 日志管理。
安装和配置步骤
第一步:定位 Nginx 配置文件
Nginx 配置文件通常位于 /etc/nginx/
目录中。主配置文件是 /etc/nginx/nginx.conf
,特定站点的配置通常位于 /etc/nginx/sites-available/
目录中。
第二步:配置 Nginx 日志
默认情况下,Nginx 记录两种类型的数据:
- 访问日志:这些日志记录服务器处理的所有请求。
- 错误日志:这些日志捕获处理请求期间遇到的任何错误。
2.1 访问日志
访问日志通常在 Nginx 配置的服务器块中配置。打开主 Nginx 配置文件或特定站点配置文件:
sudo nano /etc/nginx/nginx.conf
或者针对特定站点:
sudo nano /etc/nginx/sites-available/your-site.conf
在 server
块中,添加或修改 access_log
指令:
server {
listen 80;
server_name your_domain.com;
access_log /var/log/nginx/your_site_access.log;
error_log /var/log/nginx/your_site_error.log;
# 其他配置...
}
/var/log/nginx/your_site_access.log
:访问日志文件的路径。/var/log/nginx/your_site_error.log
:错误日志文件的路径。
2.2 错误日志
可以使用 error_log
指令类似地配置错误日志:
error_log /var/log/nginx/your_site_error.log;
你可以为错误日志指定日志级别(例如,error、warn、crit 等):
error_log /var/log/nginx/your_site_error.log warn;
第三步:测试 Nginx 配置
配置日志后,重要的是测试 Nginx 配置以确保没有语法错误:
sudo nginx -t
如果配置测试成功,请重启 Nginx 以应用更改:
sudo systemctl restart nginx
第四步:使用 Logrotate 配置日志轮换
Logrotate 是 Linux 中的一个实用程序,用于管理日志文件,允许自动轮换、压缩和删除旧日志文件。
4.1 为 Nginx 创建 Logrotate 配置文件
创建一个新的 Logrotate 配置文件,专门用于 Nginx:
sudo nano /etc/logrotate.d/nginx
添加以下配置:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
参数解释:
daily
:每天轮换日志。missingok
:如果日志文件丢失,则不发出错误。rotate 14
:保留 14 天的日志。compress
:压缩轮换后的日志以节省空间。delaycompress
:延迟压缩直到下一个轮换周期。notifempty
:不轮换空日志文件。create 0640 www-data adm
:使用指定的权限和所有权创建新日志文件。sharedscripts
:仅运行一次postrotate
脚本,无论轮换多少日志。postrotate
:此脚本将在日志文件轮换后执行。它向 Nginx 发送信号以重新打开日志文件。
4.2 测试 Logrotate 配置
你可以使用以下命令测试 Nginx 的日志轮换:
sudo logrotate -d /etc/logrotate.d/nginx
此命令将模拟日志轮换过程,而不会实际轮换日志。如果一切正常,你可以运行实际的日志轮换:
sudo logrotate -f /etc/logrotate.d/nginx
1. 高级日志格式自定义
Nginx 允许你自定义日志格式,以包含请求时间、上游响应时间等特定详细信息。
自定义日志格式
编辑 Nginx 配置文件以定义自定义日志格式:
sudo nano /etc/nginx/nginx.conf
在 http
块下添加以下 log_format
指令:
http {
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time $pipe';
access_log /var/log/nginx/custom_access.log custom;
# 其他配置...
}
此自定义日志格式包括:
$remote_addr
:客户端的 IP 地址。$remote_user
:客户端提供的用户名。$time_local
:接收请求时的本地时间。$request
:来自客户端的请求行。$status
:发送给客户端的 HTTP 状态码。$body_bytes_sent
:发送给客户端的字节数。$http_referer
:来自客户端的 Referer 标头。$http_user_agent
:来自客户端的 User-Agent 标头。$request_time
:处理请求所花费的总时间。$upstream_response_time
:从上游服务器接收响应所花费的时间。$pipe
:如果请求是流水线化的,则为“p”,否则为“.”。
编辑后,测试配置:
sudo nginx -t
然后,重启 Nginx:
sudo systemctl restart nginx
2. 限制日志文件大小
如果你担心日志文件在轮换之间增长过大,你可以使用 Logrotate 实现基于大小的日志轮换。
基于大小的日志轮换
打开 Nginx Logrotate 配置文件:
sudo nano /etc/logrotate.d/nginx
修改它以在日志达到特定大小时轮换日志:
/var/log/nginx/*.log {
size 100M
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
此配置在日志达到 100MB 大小时轮换日志。
3. 基于状态码过滤日志
你可以配置 Nginx 仅记录特定状态码(例如,错误)到单独的日志文件中。
仅记录 4xx
和 5xx
错误
在你的站点配置中添加条件 access_log
指令:
sudo nano /etc/nginx/sites-available/your-site.conf
在 server
块中,添加:
map $status $loggable {
~^[45] 1;
default 0;
}
access_log /var/log/nginx/error_access.log combined if=$loggable;
此配置使用 map
指令创建一个变量 $loggable
,对于 4xx 和 5xx 状态码,该变量设置为 1,否则为 0。仅当 $loggable
为 1 时,access_log
指令才会记录请求。
4. 实时日志监控
你可以实时监控 Nginx 日志,以观察传入的请求或发生的错误。
使用 tail
进行过滤
要实时监控访问日志:
sudo tail -f /var/log/nginx/access.log
要实时监控错误:
sudo tail -f /var/log/nginx/error.log
要过滤并仅查看某些类型的请求(例如,404 错误):
sudo tail -f /var/log/nginx/access.log | grep "404"
5. 基于请求的条件日志记录
你可以仅记录特定类型的请求,例如具有特定标头或来自特定 IP 地址的请求。
示例:记录来自特定 IP 地址的请求
编辑你的站点配置文件:
sudo nano /etc/nginx/sites-available/your-site.conf
添加条件日志记录规则:
map $remote_addr $loggable_ip {
default 0;
192.168.1.100 1;
}
access_log /var/log/nginx/special_access.log combined if=$loggable_ip;
此配置仅记录来自 IP 地址 192.168.1.100
的请求。
6. 使用 ngrep 进行 HTTP 流量分析
ngrep
是一个网络数据包分析器,你可以使用它来捕获和分析通过 Nginx 服务器的 HTTP 流量。
安装 ngrep
sudo apt-get install ngrep -y
捕获 HTTP 流量
要捕获端口 80 上的 HTTP 流量:
sudo ngrep -d any -W byline port 80
此命令将实时显示通过端口 80 的 HTTP 流量,这对于调试或监控很有帮助。
7. 实现 GeoIP 日志记录
Nginx 可以通过集成 GeoIP 模块来记录客户端的地理位置。
安装 GeoIP 模块
sudo apt-get install libnginx-mod-http-geoip -y
在 Nginx 中配置 GeoIP
编辑 Nginx 配置文件:
sudo nano /etc/nginx/nginx.conf
在 http
块下添加以下内容:
http {
geoip_country /usr/share/GeoIP/GeoIP.dat;
geoip_city /usr/share/GeoIP/GeoLiteCity.dat;
log_format geo '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$geoip_country_name $geoip_city';
access_log /var/log/nginx/geo_access.log geo;
# 其他配置...
}
注意: 我们在使用 GeoLiteCity.dat
文件时遇到了问题。它在安装过程中没有创建。请找到解决此问题的方法。
此设置将根据客户端的 IP 地址记录国家/地区和城市信息。
结尾
你现在已成功配置了 Ubuntu 服务器上 Nginx 的日志记录和日志轮换。 定期日志轮换可确保有效管理服务器的磁盘空间,防止日志随着时间的推移占用过多空间。 通过遵循本教程,你可以维护一个强大的日志记录机制,使你可以有效地监控和排除 Nginx 服务器的故障。
这些高级命令和配置可以帮助你更深入地了解 Nginx 服务器的运行,提高日志记录效率,并更有效地排除故障。 通过实施这些技术,你可以完全控制服务器的日志记录基础架构。