nginx配置反向代理或跳轉出現400問題處理記錄

来源:http://www.cnblogs.com/EmptyFS/archive/2017/01/05/6253545.html
-Advertisement-
Play Games

午休完上班後,同事說測試站點訪問介面出現400 Bad Request Request Header Or Cookie Too Large提示,心想還好是測試伺服器出現問題,影響不大,不過也趕緊上伺服器進行測試查看,打開nginx與ugwsi日誌與配置,發現後端服務日誌記錄正常,而測試站點的訪問日 ...


  午休完上班後,同事說測試站點訪問介面出現400 Bad Request  Request Header Or Cookie Too Large提示,心想還好是測試伺服器出現問題,影響不大,不過也趕緊上伺服器進行測試查看,打開nginx與ugwsi日誌與配置,發現後端服務日誌記錄正常,而測試站點的訪問日誌有7百多M(才運行兩三天沒幾個訪問,幾M的話才是正常現象),在瀏覽器里直接訪問後端服務介面也正常沒有問題(我們的伺服器軟體架構是微服務架構,將很多模塊分拆後分別部署,前端是一個純HTML站點,通過AJAX訪問後端各個服務,由於訪問量不大,所以前端站點的nginx配置時,做了反向代理訪問後端其他服務,這樣就不會出現跨域和需要處理多子功能變數名稱事情——即訪問不同的服務時,只需要使用當前功能變數名稱就可以了,這樣前端開發人員不必要知道後端掛載了多少服務需要使用什麼對應的功能變數名稱訪問)。訪問這台伺服器上的其他站點都能正常訪問,而問題站點的html頁面也能正常打開......在測試過程中發現,每訪問一下問題介面,訪問日誌就增加30多M,刷了幾次,nginx日誌大小直線上升......

  由於日誌比較大,只能使用tail -n 5000 xxx_access.log >> xxx.log截取一下最新的日誌記錄下載下來,打開一看發現同一時間一個訪問,生產了2000多條重覆迴圈的訪問記錄,而日誌尾部$http_x_forwarded_for部分,有規律的存儲了相同的由多到少的IP字串,即:最後一條有一個IP字串(真實IP),倒數第二條有兩個IP字串(真實IP + 伺服器本地IP),倒數第三條有三個IP字串(真實IP + 兩個伺服器本地IP),以至類推

  百度了一下“400 Bad Request  Request Header Or Cookie Too Large”,查找出來的幾乎都是說“nginx 400 Bad request是request header過大所引起,request過大,通常是由於cookie中寫入了較大的值所引起。在nginx.conf中,將client_header_buffer_size和large_client_header_buffers都調大後可解決”,一看就知道這肯定不是我這種情況的解決辦法,這是由於不知道什麼原因引起的死迴圈將IP地址串寫入請求頭,直到緩存爆了才返回400,如果將緩存設置更大,只會造成日誌增加速度變大而已。從分析來看應該是nginx出現的問題。

  沒有辦法只能在打開nginx配置文件分析,問題站點的配置文件,如下圖,並沒有發現什麼問題

  打開nginx.conf進行慢慢研究,發現多了幾行代碼

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  這是用來將當前訪問用戶的IP傳給後端伺服器用的,將它們刪除重新啟動一下伺服器nginx後測試了一下,發現能正常訪問了...o my god,再將它放回去,重啟,訪問,掛了,去掉,重啟,訪問,正常......重試了好幾次,終於確定就是突然多出來的幾行代碼引起的。(後來問了一下同事才知道是他進伺服器添加的)

  難道真的是不能使用嗎?記得以前用過還是正常的。嘗試訪問預生產環境介面,正常。打開預生產環境的nginx配置,包函有這三行代碼,如下圖

  全面對比後發現,生產環境用的nginx配置是功能變數名稱,而預生產環境用的是IP+埠,除此之外沒有任何區別,使用跳轉方式與反向代碼方式測試,結果都是一樣,添加port_in_redirect、server_name_in_redirect配置也沒能解決

  綜合分析,應該是nginx在使用proxy_pass做跳轉時,如果直接使用功能變數名稱,且需要向後端提交當前訪問的IP地址時,引發nginx的bug造成死迴圈,不知道大家有沒有遇到過這種情況。

# 使用反向代理方式
# 正常的配置 upstream xxx{ server
127.0.0.1:23456; } upstream yyy { server 127.0.0.1:123455; } # 異常配置 upstream xxx1{ server xx.xxx.com; } upstream yyy2 { server yyy.xxx.com; }
# 使用跳轉方式
# 正常配置
proxy_pass   http://127.0.0.1:23456;

# 異常配置
proxy_pass   http://xx.xxx.com;

 

 

 版權聲明:

  本文由AllEmpty原創併發布於博客園,版權與博客園共同所有,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。如有問題,可以通過[email protected] 聯繫我,非常感謝。

   發表本編內容,是為了和大家共同學習共同進步,有興趣的朋友可以加加Q群:327360708 ,大家一起探討。

    更多內容,敬請觀註博客:http://www.cnblogs.com/EmptyFS/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、進程標識 進程ID 0是調度進程,常常被稱為交換進程(swapper)。該進程並不執行任何磁碟上的程式--它是內核的一部分,因此也被稱為系統進程。進程ID 1是init進程,在自舉(bootstrapping)過程結束時由內核調用。該進程的程式文件在UNIX的早期版本中是/etc/init,在較 ...
  • 1、什麼是虛擬機? 虛擬機指通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整電腦系統 2、安裝Linux虛擬機前要做的準備 2.1:一臺windows環境的pc 2.2:下載VMware軟體 2.3:下載Centos6.3的iso鏡像 3.VMware軟體的下載與安裝 3.1: ...
  • 最近多次配置 Mac 的開發環境,稍微記錄一下 1 創建無付費信息的 "Apple ID" 2 Xcode ​ "gem 源更改" 3 "Alfred" 4 "微信" 5 "SourceTree" 6 "Sublime Text" "Package Control" PrettyJSON 7 "Ev ...
  • 1 php -v查看php版本 2 brew search php|grep redis 搜索對應的redis ps:如果沒有brew 就根據http://brew.sh安裝 3 brew install 安裝對應的redis 4 找到php.ini添加extension_dir=路徑(redis. ...
  • 因為修改過管理員賬號的密碼後重啟伺服器導致IIS無法啟動,出現已下異常 1、解決:“啟動Windows Process Activation Service時,出現錯誤13:數據無效” 將c:\inetpub\history文件夾中的這個applicationHost.config文件,替換掉c:\ ...
  • Linux磁碟管理好壞管理直接關係到整個系統的性能問題。 Linux磁碟管理常用三個命令為df、du和fdisk。 df:列出文件系統的整體磁碟使用量 du:檢查磁碟空間使用量 fdisk:用於磁碟分區 今天我們來說一下如何使用fdisk和parted分區工具來進行硬碟分區,、下麵我來說一下在Lin ...
  • Linux網路基礎 網線 568A 568B 線序:橙白橙 綠白藍 藍白綠 棕白棕 交換機、路由器 交換機:DLINK、H3C、CISCO 交換機(Switch)是一種用於電信號轉發的網路設備。它可以為接入交換機的任意兩個網路節點提供獨享的電信號通路。最常見的交換機是乙太網交換機。其他常見的還有電話... ...
  • 提單購買伺服器,伺服器購買之後就開機櫃布好網線,機器上架,安裝鏡像,根據mac地址分配ip,使用同機房機器ping,保證內網能通即伺服器上架完成。 新增內網路由,保證跳板機/堡壘機和發佈機等機器能連過去,然後開始初始化流程,最後交付使用,結束流程。 重裝系統主要有根據鏡像安裝,使用pxe等軟體安裝, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...