内容简介:所属分类:Nginx
- A+
所属分类:Nginx 运维技术
博主会将与Nginx有关的知识点总结到"nginx短篇系列"文章中,如果你对nginx不是特别了解,请 按照顺序 阅读"nginx短篇系列",以便站在前文的基础上理解新的知识点。
当我们访问nginx服务时,nginx会记录日志,nginx日志分两种,一种是访问日志,一种是错误日志,访问日志记录在"access.log"文件中,错误日志记录在"error.log"文件中,这篇文章我们只关注访问日志的使用,也就是"access.log"。
如果你编译安装了nginx,默认情况下,access.log日志会放在nginx安装路径的logs目录中,如果你是通过yum源安装的nginx,那么access.log的默认路径为/var/log/nginx/access.log,当然,无论你通过哪种方式安装nginx,我们都可以自定义日志文件的路径,想要自定义访问日志文件的路径非常简单,我们只需要借助一条配置指令即可,这条配置指令就是access_log指令,比如,我们想要将访问日志写入到/opt/access.log文件中,那么只需要进行如下配置即可:
access_log /opt/access.log;
access_log指令还有一些别的用法,不过我们暂且先放下不聊,我们先来仔细看看默认的访问日志是什么样子的。
首先,打开你的谷歌浏览器,访问nginx默认的index.html页面,在浏览器的地址栏中输入"http://10.1.1.72/index.html"进行访问,然后,打开logs/access.log,你会发现类似如下的日志:
10.1.1.1 - - [09/Feb/2019:22:41:28 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
如果你并没有仔细研究过nginx的访问日志,那么当你第一眼看到上述日志的时候,可能会有些懵逼,这一长串日志到底是什么意思呢?不要着急,我们慢慢聊。上述日志看似杂乱无章,其实是有一定的规律的,我们看到的日志之所以长成这个样子,都是因为一条配置指令决定的,这条配置指令就是"log_format"指令。
通过"log_format"指令可以指定访问日志都记录哪些内容,以怎样的格式记录这些内容,这样说可能不太容易理解,不如我们先来看一个简单的小示例,示例配置如下:
上述配置表示,我们通过"log_format"指令创建了一个"日志格式",这个"日志格式"的名字是"testformat","testformat"日志格式都会记录哪些内容呢?"testformat"日志格式会将"remote_addr"变量和"http_user_agent"变量中的内容记录到日志中,并且使用" - "作为分隔符将两个变量的内容分隔开,同时,使用双引号""将http_user_agent变量的内容引起,nginx中有很多内置变量,"remote_addr"变量和"http_user_agent"变量就是这些内置变量中的一员,使用"$变量名"即可调用变量,这些变量通常与http协议的请求和响应有关系,所以我们可以利用这些变量做很多事情,比如,利用它们记录访问日志。聪明如你,一定想到了,日志中记录什么内容,是由我们决定的,我们在日志格式中设置了A变量、B变量、C变量,那么日志文件中就会记录A变量的值,B变量的值,以及C变量的值。
比如:
如果我们设置的日志格式是"A变量 -- B变量 -- C变量",那么在日志中记录的就是"A值 -- B值 -- C值"。
如果我们设置的日志格式是"C变量 # A变量 - G变量 # B变量",那么在日志中记录的就是"C值 # A值 - G值 # B值"。
也就是说,记录哪些变量,以什么样的顺序记录这些变量,用什么符号将这些变量的值分隔开,都可以通过"log_format"这条配置指令进行控制。
看到此处,我们再回过头来看刚才的问题,为什么默认情况下我们看到的访问日志长成那个样子呢?这是因为,nginx有一个默认的日志格式,当我们没有在配置文件中明确定义自己的日志格式时,nginx会使用这个默认预定义的日志格式记录日志,这个日志格式的名字叫做"combined","combined"日志格式的具体配置如下:
log_format combined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
如你所见,log_format配置指令的默认值就是这个名为"combined"的日志格式,这个日志格式中记录了上述变量,那么这些变量分别代表了什么意思呢?我们来总结一下(此处先大致了解一下,不用纠结细节):
$remote_addr变量:记录了客户端的IP地址(普通情况下)。 $remote_user变量:当nginx开启了用户认证功能后,此变量记录了客户端使用了哪个用户进行了认证。 $time_local变量:记录了当前日志条目的时间。 $request变量:记录了当前http请求的方法、url和http协议版本。 $status变量:记录了当前http请求的响应状态,即响应的状态码,比如200、404等响应码,都记录在此变量中。 $body_bytes_sent变量:记录了nginx响应客户端请求时,发送到客户端的字节数,不包含响应头的大小。 $http_referer变量:记录了当前请求是从哪个页面过来的,比如你点了A页面中的超链接才产生了这个请求,那么此变量中就记录了A页面的url。 $http_user_agent变量:记录了客户端的软件信息,比如,浏览器的名称和版本号。
这些变量并非一定会有对应的值,如果变量没有对应的值,那么日志中会使用 "-" 作为默认值进行占位。
你可能会有疑问,nginx中都有哪些变量能够使用呢?这些变量又都是什么含义呢?你可以从如下官网链接中找到答案:
http://nginx.org/en/docs/varindex.html
上述链接为官网提供的变量列表,我们能够从上述链接中找到能够使用的变量,其实,你需要搞明白一点,"变量"与"配置指令"一样,都是隶属于某个"模块"的,如果你想要使用某个"变量",则必须先确保你的nginx中包含了对应的"模块",不是所有"模块"都提供了可用的"变量",很多模块压根就没有对应的变量可用,在之前的文章中,我们已经总结了怎样通过官方手册找到"模块"的详细信息,以及"模块"都包含了哪些"指令",事实上你可以使用同样的方法,找到"模块"都包含了哪些可用的"变量",举一反三的时候到了,如果你找到了具体方法,欢迎在评论区留言,给出你的答案。
聊完这些,再次打开access.log日志文件,是不是觉得那些日志顺眼多了。
其实,"log_format"配置指令只负责定义"日志格式",如果想要使用对应的"日志格式",还需要与"access_log"指令结合起来使用,才能真正的实现我们的目的,也就是说,"log_format"负责定义日志格式,"access_log"负责使用定义好的日志格式。这样说不太容易理解,不如来看一个配置示例,如下:
log_format testformat '···一些变量的组合···'; access_log /opt/access.log testformat;
上例中,我们使用"log_format"指令定义了一个名为"testformat"的日志格式,然后使用"access_log"指令引用了"testformat"日志格式,"access_log /opt/access.log testformat"表示使用"testformat"日志格式记录日志,日志记录在"/opt/access.log"文件中。
在nginx中,log_format指令和access_log指令的默认值如下:
log_format combined '···各变量省略···'; access_log logs/access.log combined;
正是因为上述默认配置,决定了我们看到的日志的样子,如果你使用了yum源的方式安装了nginx,默认情况下你会在配置文件中找到一个名为"main"的日志格式,默认就是使用这个"main"日志格式记录访问日志的。
不过有一点仍然需要注意,那就是"log_format"指令和"access_log"指令所处的上下文位置。
"log_format"指令只能配置在"http块"中。
"access_log"指令可以配置在如下上下文中:
http, server, location, if in location, limit_except
"access_log"指令还有一些其他的参数我们没有聊到,不过最基础的参数我们已经总结完了,其他参数等用到的时候再行总结也不迟,关于nginx的访问日志,就先暂时总结到这里,希望能够对你有所帮助。
我的微信公众号
关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Goaccess - 访问日志
- 使用Fluentd + Elasticsearch收集访问日志
- nginx tcp stream 访问日志配置的优化
- Spring Boot从入门到实战:集成AOPLog来记录接口访问日志
- 10年大数据架构师:日访问百亿级,如何架构并优化日志系统?
- Go Web编程--给自己写的服务器添加错误和访问日志
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Implementing Responsive Design
Tim Kadlec / New Riders / 2012-7-31 / GBP 27.99
New devices and platforms emerge daily. Browsers iterate at a remarkable pace. Faced with this volatile landscape we can either struggle for control or we can embrace the inherent flexibility of the w......一起来看看 《Implementing Responsive Design》 这本书的介绍吧!