与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小时过期       }