`
QING____
  • 浏览: 2253370 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx + tomcat实现请求链跟踪

 
阅读更多

    我们很多时候需要排查HTTP请求的问题,比如请求的响应延迟的原因、跟踪请求的转发链等,这个时候我们需要nginx和tomcat配合调整日志格式来实现。

    1)在nginx层面,对所有的请求添加一个特殊的header,header的值为一个有意义的(或者无意义)的值,本例则在request转发给upstream server之前,添加一个“X-Request-Track-Seed”,其值为一个随机字符串。我们在nginx日志中打印此值。

    2)在tomcat层面,开启access log功能,并将nginx的此header打印在日志中。

    经过上述配合,我们就可以跟踪一个请求从nginx到tomcat的访问情况。

 

一、nginx调整

    1、开启access log(简单样例)

 

http {
    server_tokens       off;
    include               /etc/nginx/mime.types;
    default_type          application/octet-stream;

   ##我们可以在log_format中使用$request_trace_id
   ##这个变量,我们可以在access_log运行时上下文之前的任何地方定义即可。
    log_format  trace_main  '$remote_addr|$remote_user|$time_local|$request|'
                      '$status|$body_bytes_sent|$http_referer|$request_trace_id|'
                      '$http_user_agent|$http_x_forwarded_for|$request_time|$upstream_response_time|$upstream_addr';

    

    access_log        /var/log/nginx/access.log  main;
    
}

upstream www_main {
    server 10.1.1.100:8080 weight=10 max_fails=3 fail_timeout=3s;
    server 10.1.2.100:8080 weight=10 max_fails=3 fail_timeout=3s;
    keepalive 32;
  }

server {
    listen       80 default_server;
    server_name  www.domain.com domain.com;
    ##定义$request_trace_id的值,在1.11.x之前,我们可以使用类似的方式声明,只要能确保
    ##其值出现重复的可能性尽可能的小即可。
    set      $request_trace_id trace-id-$pid-$connection-$bytes_sent-$msec;
    access_log  /var/log/nginx/www.log  trace_main;

    location / {
          proxy_pass         http://$request_type;
          proxy_set_header   Host             $host;
          proxy_set_header   X-Real-IP        $remote_addr;
          proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
          proxy_http_version 1.1;
          proxy_set_header Connection "";
          ##将此trace_id传递给后端的server,通过header方式,此后我们既可以在
          ##tomcat(servlet)环境中获取此header
          proxy_set_header X-Request-ID $request_trace_id;
 
    }

}

 

    上述配置样例是基于1.8.x版本,因为在1.11.x版本nginx才提供内置的$request_id属性,所以为了获取“唯一”的trace_id,我们只能通过使用nginx现有的内置变量互相拼接才行,主要目的就是尽可能避免$request_trace_id值的重复性。

    1)$pid:nginx worker进程号

    2)$connection:与upstream server链接id数。

    3)$bytes_sent:发送字节数。

    4)$msec:当前时间,即此变量获取的时间,包含秒、毫秒数(中间以.分割)

    

    在nginx 1.10.x之后,对于proxy模块,还增加了如下几个非常重要的参数,应该将它们也打印在access log中,便于我们排查nginx的性能问题:

    1)$upstream_connect_time:nginx与后端upstream server建立链接的耗时,用于评估nginx与upstream server之间的网络链路是否快速,时间为秒和毫秒数。

    2)$upstream_response_time:nginx与后端upstream server建立链接后、请求发送完毕后,在接收response阶段的耗时(即响应开始到结束的耗时)。

 

    此外我们还注意到两个参数$request_time、$time_local,前者表示整个请求处理所消耗的时间(包括与upstream建立链接、请求发送、响应接收),后者表示打印log的时间。

 

    在1.11.x之后,nginx就提供了内置的$request_id参数,此参数用于标记每个请求,全局唯一,为16字节的字符串(随机,16进制),有了此参数,我们就不需要自己再生成,而且能保证唯一性,非常适合作为trace_id,在排查问题时很有效。

##1.11.x版本
##http块
log_format  trace_main  '$remote_addr|$remote_user|$time_local|$request|'
                      '$status|$body_bytes_sent|$http_referer|$request_id|'
                      '$http_user_agent|$http_x_forwarded_for|$request_time|$upstream_response_time|$upstream_addr|$upstream_connect_time';
#####set      $request_trace_id trace-id-$pid-$connection-$bytes_sent-$msec;
##server-location块
proxy_set_header X-Request-ID $request_id;

 

 

二、tomcat访问日志

    我们在nginx层面,我们已经对每个请求增加了一个特殊的header:X-Request-ID,其值为一个“全局唯一”的字符串(不保证绝对唯一,只是冲突的可能性很小);那么我们就可以通过在tomcat access日志中打印此值即可。

    我们只需要在tomcat conf目录下的server.xml文件中增加(调整)如下配置即可:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %m %t %D %F &quot;%r&quot; %s %S %b %{X-Request-ID}i %{Referer}i %{User-Agent} %{begin:msec}t %{end:msec}t" />

 

    pattern属性即为access log答应的格式,基于log4j,别忘了在pattern中增加%{X-Request-ID}字段。

    

%a - Remote IP address(远端IP,上游为nginx,此处为nginx IP)
%A - Local IP address
%b - Bytes sent, excluding HTTP headers, or '-' if zero
%B - Bytes sent, excluding HTTP headers
%h - Remote host name (or IP address if enableLookups for the connector is false)
%H - Request protocol
%l - Remote logical username from identd (always returns '-')
%m - Request method (GET, POST, etc.)(http方法)
%p - Local port on which this request was received. See also %{xxx}p below.
%q - Query string (prepended with a '?' if it exists)
%r - First line of the request (method and request URI)(http请求的首行,通常为HTTP协议、URI等)
%s - HTTP status code of the response(响应的状态码)
%S - User session ID
%t - Date and time, in Common Log Format(access log打印的时刻)
%u - Remote user that was authenticated (if any), else '-'
%U - Requested URL path
%v - Local server name
%D - Time taken to process the request, in millis(很重要,表示请求处理的时间)
%T - Time taken to process the request, in seconds
%F - Time taken to commit the response, in millis(此参数似乎有误)
%I - Current request thread name (can compare later with stacktraces)

 

    此外,tomcat还支持类似于nginx的特殊格式:

%{xxx}i write value of incoming header with name xxx(请求中包括header值,xxx替换为header的名称)
%{xxx}o write value of outgoing header with name xxx(响应中header)
%{xxx}c write value of cookie with name xxx(cookie值)
%{xxx}r write value of ServletRequest attribute with name xxx(此请求中的attribute参数值)
%{xxx}s write value of HttpSession attribute with name xxx
%{xxx}p write local (server) port (xxx==local) or remote (client) port (xxx=remote)
%{xxx}t write timestamp at the end of the request formatted using the enhanced SimpleDateFormat pattern xxx(与时间有关,格式化输出请求结束的时间,xxx值可以为“yyyy-MM-dd HH:mm:ss”)

 

    在%{xxx}t这一个选项中,还有两个比较特殊的可选项,xxx的可替代值,比如“%{sec}t”:

sec - number of seconds since the epoch(时间戳,秒数)
msec - number of milliseconds since the epoch(时间戳,毫秒数)
msec_frac - millisecond fraction

  

    此外,我们可以在上述可选项的前增加如下2个标识:

begin or prefix begin: chooses the request start time(请求开始的时间,比如%{begin:msec}t)
end or prefix end: chooses the response finish time(响应结束的时间,比如%{end:msec}t)

 

    此后,我们即可在tomcat logs目录下查看access log了,文件名为server.xml中Valve中定义。 

分享到:
评论

相关推荐

    redis缓存服务器Nginx+Tomcat+redis+MySQL实现session会话共享

    "redis缓存服务器Nginx+Tomcat+redis+MySQL实现session会话共享"的主题旨在探讨如何利用这些技术组件来实现这一目标。以下是相关知识点的详细说明: **Redis**:Redis是一个高性能的键值数据存储系统,常用于做缓存...

    nginx+tomcat+redis完成session共享

    标题 "nginx+tomcat+redis完成session共享" 涉及到的是在分布式系统中如何实现用户会话(Session)的共享。在Web应用程序中,Session是用于跟踪用户状态的关键技术,尤其在用户登录后,Session存储了用户的登录信息...

    nginx+keepalived+tomcat+redis文档

    **Nginx**: 负责实现反向代理功能,将外部请求分发至内部的Tomcat服务器集群。 - **配置文件解析** ```nginx http { upstream test { server 192.168.159.31:8080 weight=5; server 192.168.159.32:8080 ...

    Nginx+Tomcat+memcached实现集群部署、负载均衡session共享.rar

    在集群部署中,Nginx会根据预设策略(如轮询、最少连接、IP哈希等)将用户请求分发到不同的Tomcat实例,从而实现负载均衡,避免单一服务器过载,提高系统的整体响应速度和可用性。 Tomcat是Apache软件基金会下的一...

    nginx+tomcat6+session共享

    标题中的“nginx+tomcat6+session共享”指的是在Web服务器和应用服务器的集群环境中,如何通过Nginx、Tomcat6以及Session共享技术来实现用户会话在多个服务器之间的同步。这一配置对于高并发、高可用的系统设计至关...

    Nginx+Tomcat+Session-高性能群集搭建.doc

    通过配置Nginx,可以实现负载均衡,将请求分发到多个Tomcat实例,提高系统可用性和响应速度。 2. **Tomcat**: Apache Tomcat是Apache软件基金会的项目,用于运行Java Web应用程序。它是基于Servlet和JavaServer ...

    nginx+tomcat集群的jar包 session共享

    为了实现 `session` 共享,`nginx` 可以设置 `sticky session` 或配置 `proxy_pass` 来指定一个固定的 `tomcat` 实例处理特定用户的请求。 ### 3. Tomcat的session共享策略 #### 3.1. 应用级session复制 在 `...

    tomcat中Nginx+memcached实现session共享

    当用户请求到达时,Nginx会将请求转发到相应的Tomcat实例,该实例会从memcached中读取或写入Session信息,而不是在本地存储Session。 实现步骤如下: 1. 安装和配置memcached:在所有参与Session共享的服务器上...

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    本篇文章将探讨如何利用Redis、Tomcat和Nginx来实现Session共享,以便在分布式环境中保持用户状态的一致性。 首先,让我们了解一下Session的概念。Session是Web服务器用来跟踪用户状态的一种机制。当用户登录后,...

    Web服务器三剑客运维配置实战 Nginx+JVM+Tomcat+HTTP协议 视频教程+笔记+课件+资料

    - **IO多路复用**:Nginx采用事件驱动模型,利用epoll等技术实现高效的IO多路复用。 - **内部技术架构**:模块化设计,支持动态加载模块,灵活高效。 ##### 2.3 虚拟主机 - **虚拟主机概念**:在同一台物理服务器...

    Nginx 集群 tomcat session 共享配置有源码

    为解决这个问题,我们可以利用Redis作为中央session存储,实现Nginx和Tomcat集群间的session共享。 首先,让我们理解Nginx、Tomcat和Redis的角色: 1. Nginx:作为前端反向代理服务器,负责接收用户的请求,并根据...

    nginx实现tomcat动静分离详解

    本文详细介绍了使用Nginx实现Tomcat动静分离的策略,从而优化服务器性能,特别是针对处理静态资源和动态资源请求的不同效率问题进行探讨。 首先,为什么需要实现动静分离?因为Nginx处理静态资源的能力显著高于...

    Nginx配置详情文档

    Nginx反向代理技术(4.2.1):作为反向代理,Nginx接收来自客户端的请求并转发到后端服务器,隐藏了内部网络架构,提高了安全性,并可以实现负载均衡。 Nginx负载均衡技术(4.2.2):Nginx的负载均衡功能可以将...

    Memcache Session Manager + Tomcat8.5.6

    描述中提到的“Nginx+Tomcat8.5.6 + Memcache集群 kryo-serializer方式序列化 实现session共享”,进一步解释了架构的关键组成部分和策略。Nginx作为一个高性能的反向代理服务器,负责将用户请求分发到后端的Tomcat...

    nginx实现多个tomcat7直接session共享所需jar包

    标题中的“nginx实现多个tomcat7直接session共享所需jar包”指的是在分布式系统环境中,使用Nginx作为反向代理服务器,将用户请求分发到多个Tomcat7应用服务器上,同时实现用户会话(Session)在这些服务器之间的...

    手把手教你负载均衡-tomcat1.7+nginx+memcached

    本教程将深入探讨如何结合Tomcat 1.7(一个流行的Java应用服务器)、Nginx(一款高性能的HTTP和反向代理服务器)以及Memcached(一个高性能的分布式内存对象缓存系统)来实现这一目标。 首先,我们来看Tomcat 1.7。...

    linux下搭建jenkins+git+maven+tomcat高可用集成

    - **负载均衡**:使用负载均衡器,如Nginx或HAProxy,分发请求到多个Jenkins实例。 - **数据持久化**:确保Jenkins的数据(如工作空间、配置文件)存储在共享存储上,避免单点故障。 - **冗余部署**:在同一网络...

    tomcat-session共享

    总结来说,实现“tomcat-session共享”涉及到对Nginx负载均衡策略的理解,以及如何利用Redis这样的外部存储来实现跨服务器的Session共享。这个过程涉及多个组件的配置,需要综合考虑性能、安全和可用性等因素。

    tomcat-session-manager环境构建资源

    Nginx的反向代理功能可以将用户的请求分发到后端的Tomcat实例,而Session共享则确保用户在任何一台服务器上登录后,其状态(如购物车、个人信息等)能在整个集群中得到同步。 标签“msn session共享”可能是指使用...

    tomcat8-redis-session共享

    通过这种方式,Tomcat 8和Redis结合,能够实现高效的Session共享,确保用户在分布式环境中的会话一致性。注意,使用Redis存储Session时,需要注意数据的持久化策略以及Redis的内存管理,避免内存溢出。同时,考虑到...

Global site tag (gtag.js) - Google Analytics