与nginx日志相关的主要有2个指令
1)log_format 用来设置日志的格式
2)access_log 用来指定日志文件的存放路径,格式和缓存大小
两条指令既可以在http{...}之间配置,也可以在server{...}之间配置
语法格式:
log_format name format
name表示定义的格式名称 format表示格式,有一个默认的combined格式,相当于apache的combined格式
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
也可以自定义一份日志的格式,但应该注意,log_format设置的name在nginx的配置文件中不能重复
注意:假设将nginx服务器作为web容器,位于负载均衡设备,squid,nginx反向代理过后就不能
再收到客户端的真实ip地址,因为在客户端和web服务器之间增加了中间层,所以web服务器无法
拿到客户端的真实ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址但是,在反向代
理服务器中可以增加X-Forward-For信息,用于记载源客户端ip和源客户端请求的server地址
此时,就要用到log_format来自定义日志格式,让日志记录X-Forward-For信息中的ip地址,也就是
真实ip;eg:自定义一个mylogformat
log_format mylogformat '$http_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
在日志格式中,变量$remote_addr和http_x_forwarded_for用来记录ip地址
$remote_user用来记录远程客户端用户名
$time_local 用来记录访问时间和时区
$request 用来记录请求url与http协议
$status 用来记录请求状态,例如成功200 未找到404
$body_bytes_sent 用来记录发送给客户端的文件内容的大小
$http_referer 用来记录从哪个页面链接访问过来的
$http_user_agent 用来记录客户端浏览器的相关信息
access_log用来指定日志文件的存放路径,语法:
access_log path [format [ buff=size | off ]]
path表示文件路径 format表示log_format设置的日志格式的name
buff=size表示设置内存缓冲区的大小,eg buff=32k
1)若不想开启access_log日志,可以关闭 access_log off
2)若使用默认combined格式,可以使用 access_log /var/log/access.log
3)若使用自定义格式,可以使用 access_log mylogformat /var/log/access.log
4)在nginx0.7.4之后的版本,可以包含变量,eg 虚拟域名为 nj.com
日志格式可以为 access_log /var/log/nj.com.access.log
但,使用变量后会有一些限制:
a. nginx进程设置的用户和组都必须有该路径的创建文件权限,
假如nginx的用户名和用户组为www ,/var/run/文件夹的用户和组为root,日志文件将不能创建
b. 缓冲将不会起作用
c. 对于每一条日志记录,nginx都必须先打开,然后记录,然后关闭,为了提高包含变量的日志文件
存放路径的性能,必须使用open_log_file_cache来设置日志文件描述符的缓存
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] | off
参数说明如下:
max 设置缓存中的最大文件描述符的数量,如果超过该值,使用LRU策略清除
inactive 设置时间,在该时间内未使用该描述符,自动删除
min_uses 在inactive设置的时间内,某日志文件被使用的次数超过该值就会被计入缓存
valid 设置多久检查一次,看看设置的文件是否存在,默认为60s
off 禁止使用缓存
eg:open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;
nginx日志文件的切割
生产环境中由于访问日志文件增长速度很快,日志太大会严重影响服务器的效率,同时为了方便对日志
进行分割计算,必须随日志文件进行切割,常见的方式为按天切割
nginx不支持像apache一样使用cronolog来设置日志轮转,但是可以使用如下方式来实现日志文件的切割:
mv /var/run/nj.access.log /var/run/20170205.log
kill -USR1 Nginx主进程号
首先重命名日志文件,然后用kill -USR1信号让nginx重新生成一个日志文件
shell脚本内容如下:
#nginx日志切割的脚本
#每天凌晨定时执行
#指定日志文件路径
logs_path="/var/logs/"
#创建文件夹
mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
#重命名文件
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/
$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%y%m%d").log
#发送信号
kill -USR1 `cat /usr/local/var/run/nginx.pid` #自己nginx.pid的真实路径
定时任务的写法如下:
crontab -e 新建一个定时任务
#输入以下内容
00 00 * * * /bin/bash /www/nginx/rotate.sh #上边那个脚本的pathname
nginx的压缩输出配置:
gzip是一种压缩技术,经过压缩的网站访问更快,需要服务器和浏览器同时支持,现在大多数浏览器都已经支持了
nginx的配置(放到http{...}之间):
#开启gzip压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
显示目录的设置:
location / {
autoindex on;
autoindex_exact_size [on|off]; //设定索引时文件大小的单位
autoindex_localtime [on|off]; //开启以本地时间来显示文件时间的功能,默认关闭
}
本地缓存设置:
可以通过expires设置header头来实现
语法:expires [time|epoch|max|off] 默认值off,作用域 http server location
可以控制http应答中的Expires和Cache-Control字段,起到页面缓存的作用
time可以是正数|负数 Expires头标的值将通过当前系统时间+time获得
epoch指定expires的值为:1 January,1970,00:00:01 GMT
max指定expires的值为:31 December 2037 23:59:59 GMT,cache-control的值为10年
-1 指定expires的值永远过期
cache-control的值由time的值决定
time为负数, cache-control:no-cache
time为正数,cache-control:max-age=# ,#为time的值
off表示不修改expires和cache-control的值
一些不经常修改的静态文件可以设置expires
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d; //30天过期
}
location ~ .*\.(js|css)?$
{
expires 1h; //1小时过期
}