Nginx学习:日志与镜像流量复制总算到了日志模块,其实这个模块的指令之前我们就用过了,而且也是是非常常见的指令。相信这一块的学习大家应该不会有什么难度。另一个则是镜像功能,这个估计用过的同学就比较少了,不过也并不是特别的复杂,一会讲到的时候咱们再详细说哦。 今天的两个模块都是包含在 Nginx 源码中的,不需要额外单独编译安装。所有的配置指令大分部都可以在 http、server、location 中使用,仅有一个指令是只能配置在 http 中的,我会单独说明。 日志日志模块是非常常用的模块,这里指的是访问日志哦,不是 error_log 。错误日志是属于 HTTP 核心模块的内容,之前我们已经学习过了。大多数情况下,我们只是去为每个 Server 指定一个单独的日志文件,这样便于管理,或者有特殊需要就为某些 Location 指定。另外还有一些情况就是会屏蔽掉一些比如说 favicon.ico 文件或者静态图片等资源文件的访问日志记录。 它的全名是 ngx_http_log_module 模块,用于以指定的格式写入请求日志。请求记录在处理结束位置的上下文中。如果在请求处理期间发生内部重定向,它可能与原始位置不同。 还是先来学习它的配置指令,最后再进行简单地测试。 access_log设置缓冲日志写入的路径、格式和配置。
默认值是 logs/access.log combined 。可以在同一配置级别上指定多个日志。可以通过在第一个参数中指定“syslog:”前缀来配置日志记录到 syslog。特殊值 off 取消当前级别的所有 access_log 指令。如果未指定格式,则使用预定义的“组合”格式。 必须要有的这个 path 参数,是指定日志要记录到哪个文件的,可以相对也可以是绝对路径的文件。后面的 format 则是根据后面要讲的 log_format 配置,确定使用哪个日志格式。这个参数可以不填,不填走默认的 combined 格式,下面会看到。 如果使用了 buffer 或 gzip (1.3.10, 1.2.7) 参数,写入日志将被缓冲。缓冲区大小不得超过对磁盘文件的原子写入大小。对于 FreeBSD,这个大小是无限的。这个一会我们会测试。 启用缓冲后,这些数据将马上写入文件:
如果使用 gzip 参数,则缓冲的数据将在写入文件之前进行压缩。压缩级别可以设置在 1(最快,较少压缩)和 9(最慢,最佳压缩)之间。默认情况下,缓冲区大小等于 64K 字节,压缩级别设置为 1。由于数据是按原子块压缩的,因此日志文件可以随时被“zcat”解压缩或读取。 文件路径可以包含变量(0.7.6+),但是这样的日志有一些限制:
if 参数 (1.7.0) 启用条件日志记录。如果条件评估为“0”或空字符串,则不会记录请求。就是可以有条件的记录到日志,后面我们也会测试这个参数。 另外,如果是新安装好的 Nginx ,没有别的访问日志配置,并且在编译时有 log_format指定日志的格式。
默认值 combined "..." ,它只能配置在 http 模块下。转义参数 (1.11.8) 允许在变量中设置 json 或默认字符转义,默认情况下使用默认转义。none 值 (1.13.10) 禁用转义。对于默认转义,字符“"”、“\”和其他值小于 32 (0.7.0) 或大于 126 (1.1.6) 的字符将转义为“\xXX”。如果找不到变量值,将记录一个连字符(“-”)。对于json转义,JSON字符串中不允许的所有字符都将被转义:字符“”和“\”被转义为“\”和“\\”,值小于32的字符被转义为“\n”, “\r”、“\t”、“\b”、“\f”或“\u00XX”。 必须的 name 参数就是上面 access_log 所需要的那个 format 参数。这样两边配合起来就是一套完整的日志记录功能了。 日志格式可以包含公共变量,以及仅在写入日志时存在的变量:
在现代 nginx 版本中,变量 $status (1.3.2, 1.2.2), $bytes_sent (1.3.8, 1.2.5), $connection (1.3.8, 1.2.5), $connection_requests (1.3.8, 1.2 .5), $msec (1.3.9, 1.2.6), $request_time (1.3.9, 1.2.6), $pipe (1.3.12, 1.2.7), $request_length (1.3.12, 1.2.7 )、$time_iso8601 (1.3.12, 1.2.7) 和 $time_local (1.3.12, 1.2.7) 也可用作公共变量。 发送到客户端的标题行具有前缀“sent_http_”,例如,$sent_http_content_range。 配置始终包含预定义的“组合”格式:
默认安装完成后提供的 nginx.conf 或 nginx.conf.default 中,有两段注释掉的日志配置,其实就是最基本的日志配置信息。你可以打开试试哦。
open_log_file_cache定义一个缓存,用于存储名称包含变量的常用日志的文件描述符。
该指令具有以下参数:
这个确实没用过,不过看样子是缓存打开的日志文件的句柄的。也不知道怎么测出效果,所以咱们就不演示了哈。有兴趣的小伙伴可以自己看一下,有相关的经验的大佬也欢迎留言评论哈。 日志测试好了,日志模块的配置指令就是上面那三个,不是特别复杂吧,接下来我们就简单测试一下。先配置两个 log_format ,名字就叫 log1 和 log2 吧,为了测试方便。真实业务场景下还是要根据自己的需求好好起名字哈。
然后找一个 Server ,建个 lcoation 。
这个配置是啥意思呢?第一条 access_log ,加了一些参数,分别是缓冲区配置、gzip压缩一下,然后还有条件。也就是说,当我们的 GET 参数中有 a 这个参数时,访问日志会记录到 logs/log1_access_con.log.gz 这个文件中。 第二条 access_log ,没有别的参数,就是最简单的使用 log1 的配置。现在直接访问一下吧,先看下不带任何参数。
普通的日志记录文件中,清楚地看到了访问请求的情况。注意最后有两个空的双引号,并且 logs/log1_access_con.log.gz 创建了,但还是空的。然后我们再带一个
看出来不同了吧,最后的一个空引号有值了,因为我们在上面的 log1 的 log_format 中最后加入了
查看解压出来文件内容,应该和上面记录的日志是一样的。不过这边记录的日志都是有最后那个 GET 参数的。 好了,上面还有一个 log2 的格式配置,使用了
访问之后查看日志文件,记录的内容是这样的。
记录 POST 日志在之前学习内嵌变量时,我们就说过,所有的变量都可以用在日志记录中,而且之前还学习过一些变量是只能在日志中体现的。比如说 为了利用 Nginx 的强大性能,并同步收集到 POST 数据埋点信息,我们也可以直接简单地将 POST 数据变量放到日志格式配置中就可以实现这种功能了。
上面的配置中,只是在默认日志最后多加了一个
看到日志记录的结果了吧。不过需要注意的是,POST 还有一种提交格式是 FORM-DATA ,就是需要上传文件时要用的那种格式,这种格式获得的结果是不一样的哦。
大数据提取日志时需要注意这两块的不同哦。 镜像 Mirror这个镜像是啥?在没系统学习文档之前我都不知道还有这么个东西。它的全称是 ngx_http_mirror_module 模块(1.13.4)通过创建后台镜像子请求来实现原始请求的镜像,并且会忽略对镜像子请求的响应。 还是看不懂吧?其实呀,它就是可以将我们的请求再发给另一个镜像地址,它只管发送,不管那边会有什么响应。就相当于是将流量复制了一份。我们先来看它的配置。 mirror设置原始请求将被镜像到的 URI。
默认值是 off ,打开的话就是设置一个 URI 就可以了,这个 URI 就是要发送到的地址。可以在同一配置级别上指定多个镜像。 mirror_request_body指示客户端请求正文是否被镜像。启用后,将在创建镜像子请求之前读取客户端请求正文。
在这种情况下,由 proxy_request_buffering、fastcgi_request_buffering、scgi_request_buffering 和 uwsgi_request_buffering 指令设置的无缓冲客户端请求正文代理将被禁用。 这个配置默认是 on ,如果改成 off 的话,POST 请求中的 Body 部分就不会被发送到镜像地址上了。 镜像流量复制测试好了,直接来测试吧,这个东西要是上面没看懂,那就手动测试一下,不动手,光看概念,不懂的始终还是不懂。我们先准备一个镜像 location 。
设置一个 mirror 指定地址为当前目录的 26.php 这个文件,当然我们也可以设置成静态文件,不过为了记录请求是否真的发过去了,使用动态文件还是方便些。 这个 26.php 里面就是记录一下请求的内容到一个日志文件中。不需要返回什么响应,因为镜像是会忽略响应的嘛,它只是将请求发走,响应还是按正常的响应,不会走镜像中的响应。
上面两个准备好了之后,我们就可以测试了。
可以看到,请求内容被完整记录了下来,但是访问路径返回的响应还是我们的静态首页的内容。不过你会发现一个问题,这个日志被记录了两条,也就是说,这个 26.php 被访问了两次。如果我们直接访问这个 php 页面,是只会正常记录一次的。
这个原因我也没找到,网上也没有相关的资料。 那么这个镜像功能可以有什么实际的应用吗?一是可以做流量放大,比如多次请求;二是灰度发布验证,通过镜像到新版来验证新版本是否会报错;三是忽略响应很重要,可以发送一些回调验证之类的请求。 不过需要注意的是,虽然会忽略响应,但如果镜像的地址无响应或者响应慢的时候,也会拖累主请求的响应速度。另外如果是 POST/PUT/DELETE 这些请求,一定要清楚地知道自己发送的请求会对数据产生的影响,并且镜像端要做好日志记录。 总结日志功能很重要,虽然错误日志可能更有利于我们进行调试,发现问题。但是访问日志同样也很关键,网站的很多统计,流量、热点链接、爬虫分析、黑客防护等也都需要通过分析访问日志来实现。因此,大部分情况下,咱们还是要打开并且配置好相应的访问日志信息的。但是访问日志一般会比较大,因此会有日志需要分割保存的问题,关于这个问题,我们后面再说,但其实非常简单,大家自己先去找找相关的资料也没问题。 另一个镜像模块,真的之前从来不知道,现在虽然了解了,但是要想灵活运用还是需要更多的实践的。所以咱们也不瞎吹牛了,功能用法了解之后就是实践运用尝试一下咯。 参考文档: http:///en/docs/http/ngx_http_log_module.html http:///en/docs/http/ngx_http_mirror_module.html |
|