Loading... <blockquote>博主会将与Nginx有关的知识点总结到”<a title="Nginx由浅入深短篇系列" href="https://www.zsythink.net/archives/tag/nginx/" target="_blank" rel="noopener">nginx短篇系列</a>“文章中,如果你对nginx不是特别了解,请按照顺序阅读”nginx短篇系列”,以便站在前文的基础上理解新的知识点。</blockquote> 当我们访问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文件中,那么只需要进行如下配置即可: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">access_log /opt/access.</span><span class="enlighter-m3">log</span><span class="enlighter-text">;</span></div> </div> </div> </div> access_log指令还有一些别的用法,不过我们暂且先放下不聊,我们先来仔细看看默认的访问日志是什么样子的。 首先,打开你的谷歌浏览器,访问nginx默认的index.html页面,在浏览器的地址栏中输入”http://10.1.1.72/index.html”进行访问,然后,打开logs/access.log,你会发现类似如下的日志: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">10.</span><span class="enlighter-m3">1</span><span class="enlighter-text">.</span><span class="enlighter-m3">1</span><span class="enlighter-text">.</span><span class="enlighter-n1">1</span><span class="enlighter-text"> - - </span><span class="enlighter-g1">[</span><span class="enlighter-n1">09</span><span class="enlighter-text">/Feb/</span><span class="enlighter-n1">2019</span><span class="enlighter-text">:</span><span class="enlighter-n1">22</span><span class="enlighter-text">:</span><span class="enlighter-n1">41</span><span class="enlighter-text">:</span><span class="enlighter-n1">28</span><span class="enlighter-text"> +</span><span class="enlighter-n1">0800</span><span class="enlighter-g1">]</span> <span class="enlighter-s0">"GET /index.html HTTP/1.1"</span> <span class="enlighter-n1">200</span> <span class="enlighter-n1">612</span> <span class="enlighter-s0">"-"</span> <span class="enlighter-s0">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"</span></div> </div> </div> </div> 如果你并没有仔细研究过nginx的访问日志,那么当你第一眼看到上述日志的时候,可能会有些懵逼,这一长串日志到底是什么意思呢?不要着急,我们慢慢聊。上述日志看似杂乱无章,其实是有一定的规律的,我们看到的日志之所以长成这个样子,都是因为一条配置指令决定的,这条配置指令就是”log_format”指令。 通过”log_format”指令可以指定访问日志都记录哪些内容,以怎样的格式记录这些内容,这样说可能不太容易理解,不如我们先来看一个简单的小示例,示例配置如下: <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2019/02/021519_1159_1.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2019/02/021519_1159_1.png" style=""> 上述配置表示,我们通过”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”日志格式的具体配置如下: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">log_format combined </span><span class="enlighter-s0">'$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'</span><span class="enlighter-text">;</span></div> </div> </div> </div> 如你所见,log_format配置指令的默认值就是这个名为”combined”的日志格式,这个日志格式中记录了上述变量,那么这些变量分别代表了什么意思呢?我们来总结一下(此处先大致了解一下,不用纠结细节): <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">$remote_addr变量:记录了客户端的IP地址(普通情况下)。</span></div> </div> <div class=""> <div><span class="enlighter-text">$remote_user变量:当nginx开启了用户认证功能后,此变量记录了客户端使用了哪个用户进行了认证。</span></div> </div> <div class=""> <div><span class="enlighter-text">$time_local变量:记录了当前日志条目的时间。</span></div> </div> <div class=""> <div><span class="enlighter-text">$request变量:记录了当前http请求的方法、url和http协议版本。</span></div> </div> <div class=""> <div><span class="enlighter-text">$status变量:记录了当前http请求的响应状态,即响应的状态码,比如</span><span class="enlighter-n1">200</span><span class="enlighter-text">、</span><span class="enlighter-n1">404</span><span class="enlighter-text">等响应码,都记录在此变量中。</span></div> </div> <div class=""> <div><span class="enlighter-text">$body_bytes_sent变量:记录了nginx响应客户端请求时,发送到客户端的字节数,不包含响应头的大小。</span></div> </div> <div class=""> <div><span class="enlighter-text">$http_referer变量:记录了当前请求是从哪个页面过来的,比如你点了A页面中的超链接才产生了这个请求,那么此变量中就记录了A页面的url。</span></div> </div> <div class=""> <div><span class="enlighter-text">$http_user_agent变量:记录了客户端的软件信息,比如,浏览器的名称和版本号。</span></div> </div> </div> </div> 这些变量并非一定会有对应的值,如果变量没有对应的值,那么日志中会使用 “-” 作为默认值进行占位。 你可能会有疑问,nginx中都有哪些变量能够使用呢?这些变量又都是什么含义呢?你可以从如下官网链接中找到答案: <a href="https://www.zsythink.net/wp-content/themes/zibll/go.php?url=aHR0cDovL25naW54Lm9yZy9lbi9kb2NzL3ZhcmluZGV4Lmh0bWw=" target="_blank" rel="noopener">http://nginx.org/en/docs/varindex.html</a> 上述链接为官网提供的变量列表,我们能够从上述链接中找到能够使用的变量,其实,你需要搞明白一点,”变量”与”配置指令”一样,都是隶属于某个”模块”的,如果你想要使用某个”变量”,则必须先确保你的nginx中包含了对应的”模块”,不是所有”模块”都提供了可用的”变量”,很多模块压根就没有对应的变量可用,在之前的文章中,我们已经总结了怎样通过官方手册找到”模块”的详细信息,以及”模块”都包含了哪些”指令”,事实上你可以使用同样的方法,找到”模块”都包含了哪些可用的”变量”,举一反三的时候到了,如果你找到了具体方法,欢迎在评论区留言,给出你的答案。 聊完这些,再次打开access.log日志文件,是不是觉得那些日志顺眼多了。 其实,”log_format”配置指令只负责定义”日志格式”,如果想要使用对应的”日志格式”,还需要与”access_log”指令结合起来使用,才能真正的实现我们的目的,也就是说,”log_format”负责定义日志格式,”access_log”负责使用定义好的日志格式。这样说不太容易理解,不如来看一个配置示例,如下: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">log_format testformat </span><span class="enlighter-s0">'···一些变量的组合···'</span><span class="enlighter-text">;</span></div> </div> <div class=""> <div><span class="enlighter-text">access_log /opt/access.</span><span class="enlighter-m3">log</span><span class="enlighter-text"> testformat;</span></div> </div> </div> </div> 上例中,我们使用”log_format”指令定义了一个名为”testformat”的日志格式,然后使用”access_log”指令引用了”testformat”日志格式,”access_log /opt/access.log testformat”表示使用”testformat”日志格式记录日志,日志记录在”/opt/access.log”文件中。 在nginx中,log_format指令和access_log指令的默认值如下: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">log_format combined </span><span class="enlighter-s0">'···各变量省略···'</span><span class="enlighter-text">;</span></div> </div> <div class=""> <div><span class="enlighter-text">access_log logs/access.</span><span class="enlighter-m3">log</span><span class="enlighter-text"> combined;</span></div> </div> </div> </div> 正是因为上述默认配置,决定了我们看到的日志的样子,如果你使用了yum源的方式安装了nginx,默认情况下你会在配置文件中找到一个名为”main”的日志格式,默认就是使用这个”main”日志格式记录访问日志的。 不过有一点仍然需要注意,那就是”log_format”指令和”access_log”指令所处的上下文位置。 “log_format”指令只能配置在”http块”中。 “access_log”指令可以配置在如下上下文中: http, server, location, if in location, limit_except “access_log”指令还有一些其他的参数我们没有聊到,不过最基础的参数我们已经总结完了,其他参数等用到的时候再行总结也不迟,关于nginx的访问日志,就先暂时总结到这里,希望能够对你有所帮助。 转载自朱双印日志https://www.zsythink.net/archives/3213 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏