您好,登錄后才能下訂單哦!
這篇文章主要介紹“Tomcat怎么獲取Nginx代理后的真實客戶端IP地址”,在日常操作中,相信很多人在Tomcat怎么獲取Nginx代理后的真實客戶端IP地址問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Tomcat怎么獲取Nginx代理后的真實客戶端IP地址”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在傳統的架構中,中小型企業采用Nginx+Tomcat這種架構時,客戶端請求將由Nginx轉發至后端Tomcat,當有需求在Tomcat日志中也能看到客戶端真實IP地址的情況下,我們就需要使用到Nginx的 proxy_set_header指令來進行協助,而且還需要修改Tomcat對于 localhost_access 的日志格式,要不然tomcat記錄的訪客IP全都是Nginx的, 這是因為所有的請求都是由Nginx前端服務器轉發而來的。
Nginx需要先獲取到客戶端的真實IP地址后才能將客戶端真實IP地址發送到后端Tomcat,所以也需要配置Nginx的日志格式,在Nginx代理Tomcat的日志格式中最為重要的配置為 $remote_addr
來獲取到真實客戶端IP地址,我這里的Nginx日志格式如下:
log_format main '$remote_addr" "$remote_user" "[$time_local]" "$request"' ' "$status" "$body_bytes_sent" "$http_referer"' ' "$http_user_agent" "$http_x_forwarded_for" "$gzip_ratio"' ' "$upstream_addr" "$request_time" "$upstream_response_time" "$http_host"';
有關更多Nginx日志格式請見:https://k8sops.cn/nginx_log_module/
proxy_set_header指令可以配置到 http, server, location 三個配置段當中,我這里配置到 location 字段中。
location ^~ /crm-newm { proxy_pass http://172.26.3.55:8086; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header Port $proxy_port; proxy_set_header X-Real-IP $remote_addr; }
proxy_http_version指令解析: proxy_http_version指令用于設置代理的HTTP協議版本。默認情況下,使用的是1.0版。建議將版本1.1用于keepalive連接和NTLM身份驗證
Syntax: proxy_http_version 1.0 | 1.1; Default: proxy_http_version 1.0; Context: http, server, location
proxy_set_header proxy_set_header指令用于重新定義header或將字段附加到代理服務器的請求頭中。該值可以包含文本、變量、或者文本變量的組合。
proxy_set_header Host $host; Host為自定義文本,$host
變量為Nginx中的內置變量,用于獲取當前主機名
proxy_set_header Port $proxy_port; Port為自定義文本,$proxy_port
變量也是為Nginx中的內置變量,用于獲取nginx代理的主機端口
proxy_set_header X-Real-IP $remote_addr; X-Real-IP為自定義文本,$remote_addr
變量也是Nginx中的內置變量,用于獲取真實客戶端IP地址,與Nginx中的$remote_addr
一致
以上配置對于HTTP頭部內容,這些變量是不區分大小寫的
在tomcat家目錄下的 conf/server.xml 文件中,定位到 logs 字段來修改tomcat日志格式
vim conf/server.xml <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
prefix prefix用于指定tomcat 訪問日志的前綴
suffix suffix用于指定tomcat 訪問日志的后綴
pattern pattern用于指定tomcat 訪問日志的輸出格式
訪問日志支持的格式如下:
%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) - 當前請求的線程名稱
另外,還可以將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中的屬性名
此配置需要修改Tomcat的日志格式來支持記錄客戶端的真實IP地址,默認是不可以的。 在Nginx+Tomcat架構中使用日志格式中的 %a 是獲取不到真實客戶端IP地址的,如果直接訪問Tomcat那么 %a 可以獲取到真實客戶端IP地址。 如果要在Nginx+Tomcat架構中記錄真實客戶端IP地址需要在日志格式中添加 %{X-Real-IP}i
配置來獲取, %{X-Real-IP}i
是我們在Nginx location 配置段中指定的文本來獲取 $remote_addr
變量值的,在這里將此值傳送給 Tomcat。 %{Port}i
也是我們在Nginx中定義的文本來獲取后端的轉發端口,這里也將值轉發至Tomcat。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%t %{X-Real-IP}i %h:%p %A:%{Port}i %m %s %S %u %H %v %U %b %T %I" />
以上日志輸出格式默認以空格做為分割的,以上格式我已經做了排版,tomcat輸出訪問日志如下:
1. %t 日期和時間 2. %{X-Real-IP}i 客戶端真實IP地址 3. %h:%p 遠程IP(Nginx代理IP),遠程端口(客戶端訪問Nginx的端口) 4. %A:%{Port}i 本地IP地址及訪問的本地端口 5. %m HTTP請求方法 6. %s 請求狀態碼 7. %S 用戶會話ID 8. %u 遠程用戶身份驗證 9. %H HTTP請求協議 10. %v 訪問的域名 11. %U 訪問的URL 12. %b 發送的字節數,不包括HTTP頭,或“ - ”如果沒有發送字節 13. %T Tomcat處理請求的時間(以秒為單位) 14. %I (大寫的i)當前請求的線程名稱
到此,關于“Tomcat怎么獲取Nginx代理后的真實客戶端IP地址”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。