对于nginx+tomcat这种架构,如果后端tomcat配置保持默认,那么tomcat的访问日志里,记录的就是前端nginx的IP地址,而不是真实的访问IP。因此,需要对nginx、tomcat做如下配置:

1)nginx配置

......

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

......

2)tomcat配置

......

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs/tomcat"

prefix="search_access" suffix=".log"

pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %{User-Agent}i" resolveHosts="false"/>

......

3)日志效果

10.0.11.162 - - [12/Nov/2015:11:22:11 +0800] GET /elesearch-search-api/search/restaurant.json?start=0&end=1&lbs=POINT%28120.285468902%2031.5033700783%29&rt=id&tq=id:328864 HTTP/1.0 200 102 2 python-requests/2.4.3 CPython/2.7.5 Linux/3.10.0-229.11.1.el7.x86_64

10.0.50.54 - - [12/Nov/2015:11:22:11 +0800] GET /elesearch-search-api/search/restaurantv5home.json?rt=id%2Cdelivery_price&lbs=POINT%28120.387601+36.273438%29&end=500&uid=22454922&start=0&from=webapi HTTP/1.0 200 6404 11 python-requests/2.7.0 CPython/2.7.5 Linux/3.10.0-229.el7.x86_64

10.0.40.91 - - [12/Nov/2015:11:22:11 +0800] GET /elesearch-search-api/search/restaurant.json?start=0&end=1&lbs=POINT%28116.316306833%2039.9776800442%29&rt=id&tq=id:376608 HTTP/1.0 200 119 3 python-requests/2.4.3 CPython/2.7.5 Linux/3.10.0-229.11.1.el7.x86_64

现在我们主要来看一下pattern配置段,它用于指定日志的输出格式。有效的日志格式模式可以参见下面内容,如下字符串,其对应的信息由指定的响应内容取代:

%a - 远程IP地址

%A - 本地IP地址

%b - 发送的字节数,不包括HTTP头,或“ - ”如果没有发送字节

%B - 发送的字节数,不包括HTTP头

%h - 远程主机名

%H - 请求协议

%l (小写的L)- 远程逻辑从identd的用户名(总是返回' - ')

%m - 请求方法

%p - 本地端口

%q - 查询字符串(在前面加上一个“?”如果它存在,否则是一个空字符串

%r - 第一行的要求

%s - 响应的HTTP状态代码

%S - 用户会话ID

%t - 日期和时间,在通用日志格式

%u - 远程用户身份验证

%U - 请求的URL路径

%v - 本地服务器名

%D - 处理请求的时间(以毫秒为单位)

%T - 处理请求的时间(以秒为单位)

%I (大写的i) - 当前请求的线程名称

此外,您可以指定以下别名来设置为普遍使用的模式之一:

common - %h %l %u %t "%r" %s %b

combined - %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"

另外,还可以将request请求的查询参数、session会话变量值、cookie值或HTTP请求/响应头内容的变量值等内容写入到日志文件。

它仿照了apache的语法:

%{XXX}i xxx代表传入的头(HTTP Request)

%{XXX}o xxx代表传出的响应头(Http Resonse)

%{XXX}c  xxx代表特定的Cookie名

%{XXX}r  xxx代表ServletRequest属性名

%{XXX}s xxx代表HttpSession中的属性名

转自

前端nginx时,让后端tomcat记录真实IP - 人生理想在于坚持不懈 - 51CTO技术博客
http://sofar.blog.51cto.com/353572/1712069

前端nginx时,让后端tomcat记录真实IP【转】的更多相关文章

  1. 前端nginx后端tomcat记录真实ip

    修改nginx主配置文件:/usr/local/nginx/conf/nginx.conf proxy_set_header Host $host; proxy_set_header X-Real-I ...

  2. 【 Tomcat 】后端tomcat获取真实IP

    环境: nginx + tomcat nginx.conf 配置: proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_ad ...

  3. Haproxy 让后端RS记录真实IP

    一.修改haproxy.cfg配置文件,在defaults中加入如下两行,并重启haproxy. vim /etc/haproxy/haproxy.cfg defaults option http-s ...

  4. nginx前端负载,后端apache获取真实IP设置

    原文链接: nginx前端负载,后端apache获取真实IP设置 参考文献: 前端Nginx,后端Apache获取用户真实IP地址  按照第二种方法设置不成功! 网站最前端是nginx,做的PROXY ...

  5. 获取用户真实IP:(模拟:客户端--F5--nginx--tomcat 后端获取用户真实IP)

    模拟:客户端--F5--nginx--tomcat 后端获取用户真实IP 192.168.109.137 :nginx01(充当第一层代理==F5)192.168.109.138 :nginx02(二 ...

  6. nginx多层反向代理获取客户端真实ip

    访问路径: 用户 --> www.chinasoft.cn(nginx反向代理) --> www.chinasoft.com(nginx反向代理) --> python服务端程序 经 ...

  7. NGINX反向代理,后端服务器获取真实IP

    一般使用中间件做一个反向代理后,后端的web服务器是无法获取到真实的IP地址. 但是生产上,这又是不允许的,那么怎么解决? 1.在NGINX反向代理服务器上进行修改 2.修改后端web服务器配置文件 ...

  8. 阿里云SLB后Nginx、Tomcat获取真实IP

    一.SLB后Nginx如何获取真实IP 前提:nginx作为slb获取真实ip是使用 http_realip_module,默认一键安装包安装的nginx没有安装这个模块需要重新重新编译nginx并加 ...

  9. 使用gunicorn将django项目部署到生产环境的子目录下,在nginx后端获取客户真实IP地址

    生产环境有时,并不是为了一个项目而存在的.毕竟,域名是比较稀有的. 今天遇到这个问题,解决了.作个记录. 并且,如果将django项目部署在Nginx后面,那如何获取用户真实的IP地址呢? 下面就来解 ...

随机推荐

  1. Spring AOP基础

    目录 AOP基本术语 Advice-通知 Before After After-returning After-throwing Around Pointcut-切点 Aspect-切面 Join P ...

  2. wp开发(三)--赚取收益篇

    App开发完毕了,是否有赚取收益的想法呢?下面很浅显地介绍两种常用赚取收益的方法. 一. 收费 在发布应用时,可以对应用进行定价,发布到商城之后,用户付费才可以下载,当然也可以提供试用版.收益状况可以 ...

  3. (转)maven下载jar包速度慢(解决办法)

    本文转载至http://blog.csdn.net/ko289830707/article/details/53559052 现在maven项目非常流行,因为它对jar实行了一个非常方便的管理,我们可 ...

  4. CPP 替代 PIL 图片处理(缩略图生成)

    python中使用PIL(Pyhton Image Library)进行图片处理,好处就是编写简单方便,但是不能很好利用机器多核的特点,于是在项目中决定使用cpp来实现图片处理. 项目中的图片处理主要 ...

  5. 修改gcc/g++默认include路径

    修改gcc/g++默认include路径 转自:http://www.network-theory.co.uk/docs/gccintro/gccintro_23.htmlhttp://ilewen. ...

  6. 洛谷P1273 有线电视网 【树上分组背包】

    题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...

  7. 20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程

    回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录 ...

  8. Python之旅:数字、字符串

    一 数字 整型与浮点型 #整型int 作用:年纪,等级,身份证号,qq号等整型数字相关 定义: age=10 #本质age=int(10) #浮点型float 作用:薪资,身高,体重,体质参数等浮点数 ...

  9. python基础--文件操作实现全文或单行替换

    python修改文件时,使用w模式会将原本的文件清空/覆盖.可以先用读(r)的方式打开,写到内存中,然后再用写(w)的方式打开. 替换文本中的taste 为 tasting Yesterday whe ...

  10. 新式类 VS 经典类

    一.概述 Python中支持多继承,也就是一个子类可以继承多个父类/基类.当一个调用一个自身没有定义的属性时,它是按照何种顺序去父类中寻找的呢?尤其是当众多父类中都包含有同名的属性,这就涉及到新式类 ...