国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

docker:Java通過nginx獲取客戶端的真實(shí)ip地址

這篇具有很好參考價值的文章主要介紹了docker:Java通過nginx獲取客戶端的真實(shí)ip地址。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

問題現(xiàn)象

  • 我們的平臺使用Spring Cloud微服務(wù)架構(gòu),使用Spring Boot構(gòu)建Java服務(wù),使用google的jib插件打成docker鏡像包
  • 我們使用docker虛擬化部署,使用docker-compose統(tǒng)一管理所有服務(wù),包括Java服務(wù)和nginx等組件
  • 我們前后端分離,前端通過nginx訪問我們的網(wǎng)關(guān)(Spring Cloud Gateway),再轉(zhuǎn)發(fā)到對應(yīng)的Java服務(wù)
  • 我們需要記錄一些基礎(chǔ)業(yè)務(wù)數(shù)據(jù)變動日志,于是在過濾器里攔截對應(yīng)請求記錄日志
  • 在記錄操作的來源ip時,記錄了一個172.18.0.x的地址,這個明顯不是實(shí)際客戶端來源的ip

排查解決

  • 我們使用getRemoteAddres(request)獲取的ip地址,按理說是能獲取到客戶端的真實(shí)ip地址的
  • 地址不對,想著從request的header里直接獲取,參考網(wǎng)上的方法,查看哪個header參數(shù)里有ip地址
    log.info("X-Real-IP={}", request.getHeader("X-Real-IP"));
    log.info("X-Original-Forwarded-For={}", request.getHeader("X-Original-Forwarded-For"));
    log.info("X-Forwarded-For={}", request.getHeader("X-Forwarded-For"));
    log.info("x-forwarded-for={}", request.getHeader("x-forwarded-for"));
    log.info("Proxy-Client-IP={}", request.getHeader("Proxy-Client-IP"));
    log.info("WL-Proxy-Client-IP={}", request.getHeader("WL-Proxy-Client-IP"));
    log.info("HTTP_CLIENT_IP={}", request.getHeader("HTTP_CLIENT_IP"));
    log.info("HTTP_X_FORWARDED_FOR={}", request.getHeader("HTTP_X_FORWARDED_FOR"));
  • 結(jié)果發(fā)現(xiàn),只有X-Forwarded-For能獲取到地址,還是那個錯誤的172.18.0.x的地址
    docker:Java通過nginx獲取客戶端的真實(shí)ip地址,java,異常報(bào)錯,工具使用,docker,java,nginx,真實(shí)ip

  • 地址不對,應(yīng)該是哪里出了問題,可能是docker網(wǎng)絡(luò)、nginx代理或者gateway網(wǎng)關(guān)

  • 進(jìn)一步排查,這個地址之前看到過,172.1x.0.x,是docker網(wǎng)絡(luò)生成的ip地址

  • 使用docker命令docker network ls,查看了docker網(wǎng)絡(luò)后,發(fā)現(xiàn)我們確實(shí)用的是這個
    docker:Java通過nginx獲取客戶端的真實(shí)ip地址,java,異常報(bào)錯,工具使用,docker,java,nginx,真實(shí)ip

  • 繼續(xù)查看各個docker服務(wù)的ip,確定下這個ip是哪個服務(wù)的,具體來說,是nginx的、gateway的,還是具體的這個Java應(yīng)用的

  • 使用docker exec -it 服務(wù)名 /bin/bash進(jìn)入docker容器內(nèi)部,使用cat /etc/hosts查看網(wǎng)絡(luò)配置

  • 對比發(fā)現(xiàn)這個ip是nginx服務(wù)的,說明獲取客戶端遠(yuǎn)程地址時,獲取到了nginx的ip
    docker:Java通過nginx獲取客戶端的真實(shí)ip地址,java,異常報(bào)錯,工具使用,docker,java,nginx,真實(shí)ip

  • nginx是決定能獲取到正確的客戶端請求ip地址的,因?yàn)樗膌og日志輸出里,是有來源ip的
    docker:Java通過nginx獲取客戶端的真實(shí)ip地址,java,異常報(bào)錯,工具使用,docker,java,nginx,真實(shí)ip

修改nginx配置

  • 查看了nginx的配置文件default.conf,發(fā)現(xiàn)里面沒有其他配置,已有的X-Forwarded-For配置為proxy_set_header X-Forwarded-For $proxy_protocol_addr;,這里直接把nginx代理服務(wù)自己的地址賦給了X-Forwarded-For,所以我們獲取到的是nginx的地址
  • 我們現(xiàn)在需要做的,主要是在主配置文件,添加一行proxy_set_header X-Real-IP $remote_addr;,將客戶端的真實(shí)ip地址,賦給X-Real-IP
  • 執(zhí)行命令docker restart nginx,重啟nginx使其生效

Java代碼

  • Java代碼修改也很簡單,對應(yīng)nginx的配置,獲取X-Real-IP即可
    public static String getIpAddress(HttpServletRequest request) {
        String ip = request.getHeader("X-Real-IP");
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
  • 成功獲取,結(jié)束
    docker:Java通過nginx獲取客戶端的真實(shí)ip地址,java,異常報(bào)錯,工具使用,docker,java,nginx,真實(shí)ip

nginx配置proxy_set_header介紹

在Nginx配置中,proxy_set_header 指令是用于定義向代理服務(wù)器傳遞的請求頭字段。該指令專門用于location塊中,并且通常配合 proxy_pass 指令一起工作,proxy_pass 指令定義了代理服務(wù)器的協(xié)議和地址。

基本上,當(dāng)Nginx作為反向代理服務(wù)器時,客戶端的請求首先到達(dá)Nginx,然后Nginx將這些請求轉(zhuǎn)發(fā)到后端的上游服務(wù)器。在轉(zhuǎn)發(fā)請求時,Nginx可以設(shè)置或修改請求頭。proxy_set_header 指令正是用來進(jìn)行這樣的設(shè)置或修改。

下面是幾個proxy_set_header 常見用例:

  • 傳遞主機(jī)名 - 將客戶端請求的原主機(jī)頭信息傳遞到上游服務(wù)器。

    proxy_set_header Host $host;
    
  • 傳遞真實(shí)IP地址 - 將客戶端的真實(shí)IP地址傳遞給后端應(yīng)用,這在后端應(yīng)用需要記錄真實(shí)的客戶端地址時非常有用。

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
  • 傳遞HTTPS相關(guān)信息 - 當(dāng)Nginx用作SSL終結(jié)時,它可以告訴后端應(yīng)用請求是通過HTTPS或HTTP進(jìn)行的。

    proxy_set_header X-Forwarded-Proto $scheme;
    
  • 用戶的Worker處理狀態(tài): 有時,應(yīng)用程序可能需要知道客戶端連接的具體狀態(tài)。

    proxy_set_header Connection $connection_upgrade;
    

標(biāo)準(zhǔn)的 proxy_set_header 指令使用方法如下:

proxy_set_header Header-Name Header-Value;
  • Header-Name 是你希望設(shè)置的HTTP請求頭名稱。
  • Header-Value 是對應(yīng)的值,它可能是一個固定的字符串,也可以是Nginx提供的變量,如 $remote_addr、$http_user_agent$http_cookie 等。

注意,默認(rèn)情況下,Nginx會使用某些標(biāo)準(zhǔn)請求頭,如HostConnection等,如果你沒有明確使用proxy_set_header設(shè)置它們,Nginx會傳遞它的默認(rèn)值。

在調(diào)整Nginx作為反向代理服務(wù)器時,正確配置proxy_set_header指令能確保后端服務(wù)器可以接收到所需的所有重要信息,提供正確和安全的服務(wù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-802169.html

到了這里,關(guān)于docker:Java通過nginx獲取客戶端的真實(shí)ip地址的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Java開發(fā)】之獲取客戶端真實(shí) IP 地址

    在投票系統(tǒng)開發(fā)中,為了防止刷票,我們需要限制每個 IP 地址只能投票一次; 當(dāng)網(wǎng)站受到諸如 DDoS(Distributed Denial of Service,分布式拒絕服務(wù)攻擊)等攻擊時,我們需要快速定位攻擊者 IP; 在滲透測試過程中,經(jīng)常會碰到網(wǎng)站有 CDN(Content Distribution Network,內(nèi)容交付網(wǎng)絡(luò)),

    2024年02月04日
    瀏覽(33)
  • Java-通過IP獲取真實(shí)地址

    Java-通過IP獲取真實(shí)地址

    最近寫了一個日志系統(tǒng),需要通過訪問的 IP 地址來獲取真實(shí)的地址,并且存到數(shù)據(jù)庫中,我也是在網(wǎng)上看了一些文章,遂即整理了一下供大家參考。 這個是獲取正確 IP 地址的方法,可以直接使用的。 通過以上方法你可以獲取到訪問者的 IP 地址,只有獲取到了 IP 地址,才能

    2024年02月15日
    瀏覽(27)
  • Spring Boot獲取客戶端的IP地址

    前言 在Web應(yīng)用程序中,獲取客戶端的IP地址是一項(xiàng)非常常見的需求,例如記錄訪問日志、過濾惡意IP等。在本文中,我們將介紹如何使用Spring Boot框架獲取客戶端的IP地址。 方法一:使用ServletRequest對象獲取IP地址 Spring Boot應(yīng)用程序可以使用HttpServletRequest對象獲取客戶端的IP地址

    2024年02月08日
    瀏覽(31)
  • nginx 獲取客戶端真實(shí)IP

    網(wǎng)站接入Web應(yīng)用防火墻WAF(Web Application Firewall)后,訪問請求在到達(dá)源站服務(wù)器之前,需要經(jīng)過WAF的代理轉(zhuǎn)發(fā)。這種情況下,源站服務(wù)器可以通過解析回源請求中的X-Forwarded-For記錄,獲取客戶端的真實(shí)IP。 WAF在將客戶端的訪問請求轉(zhuǎn)發(fā)到下一環(huán)節(jié)的服務(wù)器時,會在HTTP的請求頭

    2023年04月09日
    瀏覽(34)
  • nginx獲取客戶端真實(shí)ip

    在nginx中獲取客戶端真實(shí)IP的方法有多種,以下是其中兩種常用的方法: 使用nginx的access_log模塊記錄請求日志,并在日志中包含客戶端的真實(shí)IP信息。例如: 在上述配置中,通過使用http_x_forwarded_for字段來獲取客戶端的真實(shí)IP地址。如果該字段不存在或不合法,則使用remote_ad

    2024年02月16日
    瀏覽(47)
  • 獲取客戶端真實(shí) IP 地址的最佳實(shí)踐

    1. 業(yè)務(wù)上云帶來性能收益 公司從去年全面推動業(yè)務(wù)上云,而以往 IDC 架構(gòu)部署上,接入層采用典型的 4 層 LVS 多機(jī)房容災(zāi)架構(gòu),在業(yè)務(wù)高峰時期,擴(kuò)容困難(受限于物理機(jī)資源和 LVS 內(nèi)網(wǎng)網(wǎng)段的網(wǎng)絡(luò)規(guī)劃),且抵擋不住 HTTPS 卸載引發(fā)的高 CPU 占用。 而經(jīng)過壓力測試發(fā)現(xiàn),使用

    2024年02月05日
    瀏覽(27)
  • nginx代理后,nodejs如何獲取用戶真實(shí)ip地址(包括websocket獲取用戶真實(shí)IP地址)

    nginx代理后,nodejs如何獲取用戶真實(shí)ip地址(包括websocket獲取用戶真實(shí)IP地址)

    因?yàn)閚ginx代理的原因,我們在請求頭中獲取到的用戶ip只是nginx代理的ip,并非用戶真實(shí)ip,原因是經(jīng)過反向代理后,由于在客戶端和web服務(wù)器之間增加了中間層,因此web服務(wù)器無法直接拿到客戶端的ip,可以通過$remote_addr變量拿到的將是反向代理服務(wù)器的ip地址。 第一步,修改

    2024年02月13日
    瀏覽(111)
  • Nginx(二十) 獲取真實(shí)客戶端IP

    ????????客戶端在訪問互聯(lián)網(wǎng)應(yīng)用服務(wù)器時,與真實(shí)的應(yīng)用服務(wù)器之間會因?yàn)橛卸鄬臃聪虼?,而?dǎo)致真實(shí)應(yīng)用服務(wù)器獲取的僅是最近一層的反向代理服務(wù)器 IP。為使 Nginx 后端的上游服務(wù)器可以獲得真實(shí)客戶端 IP,Nginx 提供了 ngx_http_realip_module 模塊用以實(shí)現(xiàn)真實(shí)客戶端

    2024年01月16日
    瀏覽(30)
  • nginx如何獲取真實(shí)客戶端ip

    nginx作為反向代理服務(wù)器,即代理我們的服務(wù)端,下面介紹下如何配置nginx獲取真實(shí)的客戶端ip 1、配置nginx.con 2、在java程序中可以通過如下方式獲取: 這樣就可以打印出真實(shí)ip了!即request.getHeader(\\\"X-Real-IP\\\")的值 引用: 查看端口占用及釋放所占用的端口_查詢谷歌瀏覽器的端口

    2024年02月11日
    瀏覽(14)
  • nginx獲取不到真實(shí)ip地址,注意這個細(xì)節(jié)

    1 一定要把proxy_pass語句放在最后面 location / { ????????proxy_set_header Host $host; ????????proxy_set_header X-Real-IP $remote_addr; ????????proxy_set_header REMOTE-HOST $remote_addr; ????????proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ????????client_max_body_size 1024m; ????????# 一

    2024年02月13日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包