日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

問題背景和現象

公司任務管理使用的是開源的redmine,以前是單機部署(bitnami_redmine),后來由于項目數量、人員數量和任務數量的增加,卡頓問題比較明顯,于是改造為基于k8s的分布式集群部署(Nginx+puma)。

改造后有個現象是,wiki標題中,如果包含引號特殊字符,在打開頁面時,redmine后臺將返回400。

wiki標題如下:

nginx解碼特殊字符引發400問題處理案例分享

 

400顯示效果如下:

nginx解碼特殊字符引發400問題處理案例分享

 

處理辦法

方案1:替換數據庫中的引號,替換為空

  • 首先查出wiki標題,使用update進行修改。

這里僅為試驗,沒有使用MySQL的replace函數進行全局替換

nginx解碼特殊字符引發400問題處理案例分享

 

  • 之后去掉引用頁wiki_content的引號
nginx解碼特殊字符引發400問題處理案例分享

 

  • 通過瀏覽器測試訪問正常
nginx解碼特殊字符引發400問題處理案例分享

 

小結:

此方案雖然可以通過update … replace … 進行全部替換wikis title字段,但由于redmine wiki頁面可以在項目內進行引用(issue和其他wiki均可引用),引用時內容較多,無法區分引號是否需要被替換,所以無法對wiki_contents以及journal_details表進行全局替換

方案2:找到參數丟失的根源

思路大致是先通過對比縮小范圍,找到400是哪個節點返回的,之后再進一步分析具體原因。

  • 1.首先看下nginx端是否正常接收到了參數,中文及特殊字符會進行urlencode,我們直接用轉碼后的結果在kibana中進行搜索
url.original : *%E4%B8%BB%E6%8E%A7%E6%9C%BA%E6%8A%A5%E9%94%99*
nginx解碼特殊字符引發400問題處理案例分享

 

可以看到參數到達nginx端時,還是對的,這很有可能是nginx再向后端svc傳遞時丟失了參數導致。

我們可以通過curl跳過nginx,直接測試svc地址能否正常返回。

  • 2.先復制可以響應200的請求
nginx解碼特殊字符引發400問題處理案例分享

 

  • 3.在服務器上跳過nginx直接訪問svc地址,url中增加引號字符(%22),同時數據響應狀態碼-w %{http_code}
nginx解碼特殊字符引發400問題處理案例分享

 

從上面的測試可以看出,跳過nginx轉發,可以拿到正常的響應結果。

注:簡單說明下,此前置nginx由于各類轉發問題(比如cdn回源、oss圖片轉發等)沒有使用nginx-ingress-controller暴露k8s集群中的服務,使用的是集群外置nginx。

  • 4.返回400的請求,在rails日志中并沒有看到處理過程
nginx解碼特殊字符引發400問題處理案例分享

 

  • 5.rails使用的是puma發布,查看puma日志,可以看到轉換異常的錯誤
nginx解碼特殊字符引發400問題處理案例分享

 

到這里基本可以定位到問題節點,處于nginx—>puma時,發送的http請求不被puma認可。

而curl發出的請求,是能被puma認可的。

那么區別到底在哪里?nginx發出的請求為何有差異?

查看nginx error日志沒有線索,問題到這里已經陷入了困境,難道只能抓包分析下?

  • 6.服務器上使用tcpdump抓包,期間觸發兩次請求,一次curl svc地址(響應200的),一次curl nginx地址(響應400的)tcpdump -i cnio host 10.10.2.187 -w /tmp/1.pcap
nginx解碼特殊字符引發400問題處理案例分享

 

  • 7.從服務器傳到本地用wireshark分析
nginx解碼特殊字符引發400問題處理案例分享

 


nginx解碼特殊字符引發400問題處理案例分享

 

從上面的對比可知,nginx收到瀏覽器發送的請求后,發現有urlencode后的字符%22,會進行解碼后將引號傳遞到后端。

為何其他中文字符沒有解碼,唯獨解碼引號這一個字符?要弄清楚這個問題,需要結合nginx源碼看一下。

  • 8.如何避免這個問題?

正常情況下,uri的轉義操作在瀏覽器端已經完成,所以nginx側的$request_uri肯定是encode后的正確狀態,這一點在文章開頭中Kibana的access日志中可以看到。我們可以利用這個參數,對location進行特殊處理

修改前的配置如下

location / {
       proxy_set_header Host $http_host;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Real-IP  $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_pass http://10.89.0.8/$1;
}

修改后的配置如下

location / {
       proxy_set_header Host $http_host;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Real-IP  $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       if ($request_uri ~* ^/(.*)$) {
          proxy_pass http://10.89.0.8/$1;
       }
}
nginx解碼特殊字符引發400問題處理案例分享

 

寫在后面

nginx內置變量很多,配合location rewrite正則可以滿足多種轉發場景。

有其他解決思路的朋友可以留言喲~。

分享到:
標簽:特殊字符 nginx
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定