一:nginx日志详解
一.日志模块
日志模块的名称是:ngx_http_log_module;官方文档:http://nginx.org/en/docs/http/ngx_http_log_module.html
1.相关指令
log_format 日志格式 access_log 访问日志
error_log 错误日志 open_log_file_cache 日志缓存
日志缓存命令默认没有配置,默认禁止。 open_log_file_cache指令的各项参数说明如下:
open_log_file_cache max=N [inactive=time] [mim_uses=N] [valid=time] | off
max:设置缓存中的最大文件描述符数量。
inactive:设置一个时间,如果在设置的时间内没有使用此文件描述符,则自动删除次文件描述符。默认时间为10秒。是可选参数。
min_uses:在参数inactive指定的使用时间范围内,如果日志文件超过被使用的次数,则将该日志文件的描述符记入缓存。默认次数为1.
valid: 设置多长时间检查一次,看一看变量指定的日志文件路径与文件名是否仍然存在。默 认时间为 60秒。
off: 禁止使用缓存。
open_log_file_cache 指令的设置示例如下:
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;
2.日志的格式和命令
语法:Syntax: log_format name [escape=default|json] string ...; name 表示格式名称 string 表示定义的格式
默认值:Default: log_format combined "..."; log_format 有默认的无需设置的combined日志格式,相当于apache的combined日志格式
环境:Context: http context网站代理LB
定义设置位置:vim /etc/nginx/nginx.conf 下述内容均可以在该命令中找到
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
$remote_addr, 远程地址: 记录客户端IP地址 $remote_user:远程用户:记录客户端用户名称[$time_local] 本地时间:服务器自身实践 $request: 请求:记录请求的URL和HTTP协议
$status 状态:记录请求状态 $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小
$http_referer 记录从哪个页面链接访问过来的 (超链接) $http_user_agent 记录客户端浏览器相关信息
$http_x_forwarded_for 代理IP
3.访问日志和错误日志
access_log案例
192.168.100.254 - - [17/Dec/2017:14:45:59 +0800] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://192.168.100.10/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0" "-"
192.168.100.254:远程主机IP
- - 用户
[17/Dec/2017:14:45:59 +0800] 时间
get:获得,下载,还有post提交。
/nginx-logo.png:下载图片
HTTP/1.1 :http版本
200:状态码 什么结果。对,还是错
368 大小 :下载的文件大小
http://192.168.100.10/ :引用自哪个连接,主页http://192.168.100.10/
Mozilla/5.0 :浏览器的版本
(Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0:Windows NT 客户端系统类型
-远程客户端主机地址 (请看注释)
error_log,个性化404错误反馈页面
1 修改主配置文件
server{
error_page 404 /404.html;
location = /404.html {
root /xuleilinux;
}}
2 创建错误反馈页面,在里面写入个性化页面 vim /xuleilinux/404.html
3,访问不存在的页面,查看404日志
二:日志轮转/切割
1.观察nginx日志轮转文件:vim /etc/logrotate.d/nginx
vim /etc/logrotate.d/nginx 待切割的日志
create 0644 nginx nginx 创建新的日志文件,属主nginx,属组nginx
daily 每天进行一次日志分割
rotate 10 保留十分日志
missingok 丢失不提示
notifempty 空文件的话,不转储
compress 压缩
sharedscripts 轮转后执行脚本
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。
endscript 结束脚本
}
手动立即轮转语句:/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
二:web模块
1.连接状态:stub_status_module
展示用户和nginx连接状态数量信息
使用nginx -V 2>&1 | grep stub_status 查找模块是否安装,如果已安装那么就可以配置状态模块了
2 配置状态模块,启用该模块 vim /etc/nginx/conf.d/default.conf
server {
location /nginx_status {
stub_status;
allow all;
}}
3 重启服务再次访问,观察连接数 和请求数。
Active connections: 1 当前活动的连接数 server accepts handled requests 服务器接受处理请求
17 总连接数connection(TCP)
17 成功的连接数connection (TCP)
24 总共处理的请求数requests(HTTP)
Reading: 2 读取客户端Header的信息数 请求头
Writing: 1 返回给客户端的header的信息数 响应头
Waiting: 19 等待的请求数,开启了keepalive
2.随机主页:random_index_module,将主页设置成随机页面,是一种微调更新机制
1 创建主页目录 mkdir /app
2 创建多个主页 touch /app/{blue.html,green.html,red.html,.yellow.html} 在不同的页面书写不同的内容
3 启动随机主页
server{
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
root /app;
random_index on;
}
}
3.替换模块
vim /etc/nginx/conf.d/default.conf #启动nginx默认页面
server { #在server{下面插入
sub_filter nginx 'dabai';
sub_filter_once on; #替换模块 将nginx 替换成 大白,单次替换 开启只替换一次,关闭off,全部都替换
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
重启服务,测试页面
4:文件读取
原理介绍:sendfile:
未使用sendfile() 的传统网络传输过程:硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈
使用 sendfile() 来进行网络传输的过程:硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈 sendfile() 不但能减少切换次数而且还能减少拷贝次数。
tcp_nopush:未使用tcp_nopush()网络资源浪费;应用程序每产生一次操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据以及40个字节长的包头,于是产生4000%的过载,很轻易地就能令网络发生拥塞。同时也浪费资源。
使用tcp_nopush()网络传输效率提升 :当包累计到一定大小后再发送。
tcp_nodelay 开启或关闭nginx使用TCP_NODELAY选项的功能。 这个选项仅在将连接转变为长连接的时候才被启用。
TCP_NODELAY是禁用Nagle算法,即数据包立即发送出去。由于Nagle和DelayedACK的原因,数据包的确认信息需要积攒到两个时才发送,长连接情况下,奇数包会造成延时40ms,所以tcp_nodelay会将ack立刻发出去。 如果不在长连接时,可以关闭此模块,因为ack会被立刻发出去。启用模块:默认是启动的,无需验证
location /video/ {
sendfile on;
tcp_nopush on;
}
5.文件压缩
原理介绍:启动该模块,使文件传输前进行压缩,提升传输效率。
启用模块:
http { gzip on; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_static on; #gzip_static on; nginx对于静态文件的处理模块
观察压缩传输 压缩包和图片类对象本身已经自带压缩功能。所以压缩比例较小低。文本类对象在压缩试验中,压缩比例体现优越。
6.页面缓存
原理介绍:expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求要配置expires,可以在http段中或者server段中或者location段中加入。Nginx(expires 缓存减轻服务端压力),无缓存,每次访问服务器,均是全文传输。开启缓存可以加速浏览网站。
启用缓存:
vim /etc/nginx/nginx.conf location / { root /usr/share/nginx/html index index.html index.htm; expires 24h; #缓存保存时间,24小时 }
再次浏览页面,观察响应头中出现服务器回复的缓存时间,理解nginx服务器启动缓存时间,加速浏览。
7.防盗链
防盗链原理介绍:日志格式中的http_referer是记录,访问点引用的URL。也就是超链接的上一级地址。
通过这段地址,可以发现一种网络行为——盗链。非法盗链会影响站点的正常访问。
通过http_referer模块可以控制这一点。防止非法盗链现象。搭建一个a.com网站,在主页中插入图片
vim index.html <img src='1.jpg' /> #注意要将1.jpg图片拷贝至网站主目录。
搭建一个b.com网站,在主页中盗链A网站的图片
vim index.html <img src='http://A网站的域名或者地址/1.jpg' /> #盗用链接。注意网站主目录中,根本没有图片。
启动防盗链,如下所述设置完毕进行重启nginx服务
location / { root /a.com; index index.html index.htm; valid_referers none blocked *.a.com; if ($invalid_referer) { return 403; } }
再次访问b.com网站,盗链失败,防盗链完成
如果希望某些网站能够使用(盗链)资源:
location / { root /a.com; index index.html index.htm; valid_referers none blocked *.a.com server_name 192.168.100.* ~tianyun ~\.google\. ~\.baidu\. b.com; if ($invalid_referer) { return 403; } }
访问b.com,再次盗链,合法盗链成功。