前端nginx時,讓後端tomcat記錄真實IP

對於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中的屬性名


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章