对于程序员、运维来说,日志非常得重要。通过日志可以查看到很多请求访问信息,及异常信息。Nginx 也提供了对日志的强大支持。
    1、日志管理范围
    首先,下面要讲的这些日志相关属性可以配置在任意模块。在不同的模块,记录的是不同请求的日志信息。即,日志记录的请求范围是不同的。Nginx 日志一般可以指定三个范围:

    • http{}模块:若请求是通过http协议访问的nginx,则请求会被记录到日志文件中。
    • server{}模块:若请求当前的server模块,则请求会被记录到日志文件中。
    • location{}模块:若请求当前的location模块,则请求会被记录到日志文件中。

    1)http模块范围
    只要有请求通过 http 协议访问该 Nginx,就会有日志信息写入到这里的日志文件。
    image.png
    修改下响应的格式,查看logs目录下的access.log:
    image.png
    image.png
    2)server模块范围
    只要有请求访问当前 Server,就会有日志信息写入到这里的日志文件。
    image.png
    3)location模块范围
    只要有请求访问当前 location,就会有日志信息写入到这里的日志文件。
    image.png

    2、日志管理指令
    1)log_format
    image.png
    用于设置访问日志的格式,其后的 main 是为该格式所起的名称,可以任意,而其后面的内容则为具体格式,通过 Nginx 内置变量定义。

    • $remote_addr:获取访问者的 IP 地址。若当前 Nginx 是反代服务器,则此变量获取到的就是客户端的 IP 地址;若当前 Nginx 是静态代理服务器,则此变量获取到的是反代服务器的 IP 地址。如下图:

    image.png

    • $http_x_forwarded_for:获取客户端浏览器的 IP。若当前 Nginx 是反代服务器,则此变量获取到的值为杠(-)。若当前 Nginx 是静态代理服务器,则此变量获取到的是客户端的 IP 地址。
    • $remote_user:获取访问者的用户名。
    • $time_local:获取请求访问的时间与时区。
    • $request:获取请求的相关信息,包含请求方式、请求的 URI,及访问协议。
    • $status:后端服务器向其返回的状态码,例如 200。
    • $body_bytes_sent:后端服务器向客户端发送的响应体内容字节数。
    • $http_referer:获取当前请求是从哪个页面过来的。其值在这里显示为杠(-)。
    • $http_user_agent:用户所使用的代理,一般为浏览器。

    2)access_log
    image.png
    该指令用于设置访问日志。上面的格式包含三个参数:

    • 第一个参数是日志的存放路径与日志文件名;
    • 第二个参数是日志格式名;
    • 第三个参数是日志文件所使用的缓存。不过,即使不指定 buffer,其也会存在默认日志缓存的。
    • access_log 还可以跟一个参数 off,用于关闭访问日志,即直接写 access_log off 即可关闭访问日志。

    3) error_log
    image.png
    该指令用于指定错误日志的路径与文件名。需要注意以下几点:

    • 其不能指定格式,因为其有默认格式。
    • 可以使用自己指定的错误日志文件,不过,将来的访问异常日志就不会再写入到默认的logs/error.log 文件中了。所以关于错误日志,一般使用默认的即可。
    • 错误日志级别由低到高有:[debug | info | notice | warn | error | crit | alert | emerg],默认为 error,级别越高记录的信息越少。
    • 错误日志默认是开启的。关闭错误日志的写法为 error_log /dev/null;

    4) open_file_log_cache
    image.png
    该指令用于打开日志文件读缓存,将日志信息读取到缓存中,以加快对日志的访问。该功能默认为 off,即 open_log_file_cache off;
    max:最大可以打开的日志文件的个数。
    inactive与min_uses要联合使用,表示在日志进入缓存的inactive时间内,至少要有min_uses次的访问,否则该日志会被移出缓存。
    valid:缓存日志刷新时间。

    3、默认的/favicon.ico请求
    image.png 客户端对于服务端页面会自动提交一个/favicon.ico 请求,若没有 favicon.ico 文件则会在日志文件中报出 404。
    从网上任意下载一个 ico 图标,将其重命名为 favicon.ico,然后放到 Linux 中的任意目录。然后再修改 nginx.conf 文件,在其中添加如下的 location{}模块。注意,若将其添加到的位置与页面在同一个目录,下面的 location{}模块不用设置。
    image.png
    这样就出现了响应的图标了:
    image.png
    此时的/favicon.ico请求就变成了200
    image.png

    4、日志的自动切割
    这里仅仅简单介绍一下日志切割的实现步骤,具体实现,网上非常多,用时再查即可。
    1)创建切割的shell脚本文件
    Linux 下创建一个实现日志切割的 shell 脚本文件,脚本文件的具体内容可以从网上查找,资源很多。例如,将该 shell 文件创建在 Nginx 安装目录下的 logs 目录中,并命名为cut_nginx_log.sh。
    2)为该文件添加可执行的权限
    该文件是要作为定时任务被执行的,所以该文件需要具有可执行权限。
    3)向crontab中添加一个定时任务
    crontab 是 Linux 中的一个定义任务文件,每一行都代表一项定义任务。每行由 6 个字段组成,前 5 段是时间设定段,第 6 段是任务段。具体格式如下:
    minute(0-59) hour(0-23) day(1-31) month(1-12) week(0-6) command
    本例执行如下命令后会打开文本编辑器,然后再输入如下文本内容即可。
    image.png