我们很多时候需要排查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 "%r" %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**:Redis是一个高性能的键值数据存储系统,常用于做缓存...
标题 "nginx+tomcat+redis完成session共享" 涉及到的是在分布式系统中如何实现用户会话(Session)的共享。在Web应用程序中,Session是用于跟踪用户状态的关键技术,尤其在用户登录后,Session存储了用户的登录信息...
**Nginx**: 负责实现反向代理功能,将外部请求分发至内部的Tomcat服务器集群。 - **配置文件解析** ```nginx http { upstream test { server 192.168.159.31:8080 weight=5; server 192.168.159.32:8080 ...
在集群部署中,Nginx会根据预设策略(如轮询、最少连接、IP哈希等)将用户请求分发到不同的Tomcat实例,从而实现负载均衡,避免单一服务器过载,提高系统的整体响应速度和可用性。 Tomcat是Apache软件基金会下的一...
标题中的“nginx+tomcat6+session共享”指的是在Web服务器和应用服务器的集群环境中,如何通过Nginx、Tomcat6以及Session共享技术来实现用户会话在多个服务器之间的同步。这一配置对于高并发、高可用的系统设计至关...
通过配置Nginx,可以实现负载均衡,将请求分发到多个Tomcat实例,提高系统可用性和响应速度。 2. **Tomcat**: Apache Tomcat是Apache软件基金会的项目,用于运行Java Web应用程序。它是基于Servlet和JavaServer ...
为了实现 `session` 共享,`nginx` 可以设置 `sticky session` 或配置 `proxy_pass` 来指定一个固定的 `tomcat` 实例处理特定用户的请求。 ### 3. Tomcat的session共享策略 #### 3.1. 应用级session复制 在 `...
当用户请求到达时,Nginx会将请求转发到相应的Tomcat实例,该实例会从memcached中读取或写入Session信息,而不是在本地存储Session。 实现步骤如下: 1. 安装和配置memcached:在所有参与Session共享的服务器上...
本篇文章将探讨如何利用Redis、Tomcat和Nginx来实现Session共享,以便在分布式环境中保持用户状态的一致性。 首先,让我们了解一下Session的概念。Session是Web服务器用来跟踪用户状态的一种机制。当用户登录后,...
- **IO多路复用**:Nginx采用事件驱动模型,利用epoll等技术实现高效的IO多路复用。 - **内部技术架构**:模块化设计,支持动态加载模块,灵活高效。 ##### 2.3 虚拟主机 - **虚拟主机概念**:在同一台物理服务器...
为解决这个问题,我们可以利用Redis作为中央session存储,实现Nginx和Tomcat集群间的session共享。 首先,让我们理解Nginx、Tomcat和Redis的角色: 1. Nginx:作为前端反向代理服务器,负责接收用户的请求,并根据...
本文详细介绍了使用Nginx实现Tomcat动静分离的策略,从而优化服务器性能,特别是针对处理静态资源和动态资源请求的不同效率问题进行探讨。 首先,为什么需要实现动静分离?因为Nginx处理静态资源的能力显著高于...
Nginx反向代理技术(4.2.1):作为反向代理,Nginx接收来自客户端的请求并转发到后端服务器,隐藏了内部网络架构,提高了安全性,并可以实现负载均衡。 Nginx负载均衡技术(4.2.2):Nginx的负载均衡功能可以将...
描述中提到的“Nginx+Tomcat8.5.6 + Memcache集群 kryo-serializer方式序列化 实现session共享”,进一步解释了架构的关键组成部分和策略。Nginx作为一个高性能的反向代理服务器,负责将用户请求分发到后端的Tomcat...
标题中的“nginx实现多个tomcat7直接session共享所需jar包”指的是在分布式系统环境中,使用Nginx作为反向代理服务器,将用户请求分发到多个Tomcat7应用服务器上,同时实现用户会话(Session)在这些服务器之间的...
本教程将深入探讨如何结合Tomcat 1.7(一个流行的Java应用服务器)、Nginx(一款高性能的HTTP和反向代理服务器)以及Memcached(一个高性能的分布式内存对象缓存系统)来实现这一目标。 首先,我们来看Tomcat 1.7。...
- **负载均衡**:使用负载均衡器,如Nginx或HAProxy,分发请求到多个Jenkins实例。 - **数据持久化**:确保Jenkins的数据(如工作空间、配置文件)存储在共享存储上,避免单点故障。 - **冗余部署**:在同一网络...
总结来说,实现“tomcat-session共享”涉及到对Nginx负载均衡策略的理解,以及如何利用Redis这样的外部存储来实现跨服务器的Session共享。这个过程涉及多个组件的配置,需要综合考虑性能、安全和可用性等因素。
Nginx的反向代理功能可以将用户的请求分发到后端的Tomcat实例,而Session共享则确保用户在任何一台服务器上登录后,其状态(如购物车、个人信息等)能在整个集群中得到同步。 标签“msn session共享”可能是指使用...
通过这种方式,Tomcat 8和Redis结合,能够实现高效的Session共享,确保用户在分布式环境中的会话一致性。注意,使用Redis存储Session时,需要注意数据的持久化策略以及Redis的内存管理,避免内存溢出。同时,考虑到...