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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...