摘要:前言業務野蠻生長時期,作為一枚,有運營過比較長的一段時間。根據該是否和匹配絕對是否對前端返回。開發人力不足以重構這個接口,為了不影響調用成功率,想都設置為返回成功之類的狀態碼記錄慢日志為提高接口的運營質量,同時也方便定位一些奇怪的問題。
前言
業務野蠻生長時期,作為一枚op,有運營過nginx比較長的一段時間。期間遇到些小問題,這里簡單做個總結記錄,會不定時更新:
開始扯淡 proxy_set_header的作用域限制還記得是個后臺鑒權server需要調用方提供一個QC_REAL_IP的http頭做校驗,我在nginx里配置如下:
proxy_set_header QC_REAL_IP $http_host; location ^~/authorize/ { proxy_set_header Host $http_host; proxy_pass http://authorize_server; proxy_redirect off; }
但是,卻發現鑒權不成功,一直是返回503。掏出tcpdump抓包
tcpdump -i eth1 -nn -Als0p "tcp and host author_server_ip and port author_server_port"
發現nginx發出的包頭里沒有QC_REAL_IP字段,遂翻閱nginx wiki,找到這行
proxy_set_header directives issued at higher levels are only inherited when no proxy_set_header directives have been issued at a given level.
原來proxy_set_header不完全是繼承關系!把QC_REAL_IP的配置copy一份到location里,終于生效了。
剛開始拿nginx做proxy,一般proxy_pass和upstream的名字一致,有多個proxy_pass就加數字.例如:
upstream xxoo.com { server 10.8.8.8:8080; } upstream xxoo.com_2 { server 10.8.8.8:8088; } server { listen 443; server_name xxoo.com ... ... location /api/user/ { proxy_pass http://xxoo.com; proxy_redirect off; } location /api/pay/ { proxy_pass http://xxoo.com_2; proxy_redirect off; } }
重啟nginx后,訪問測試pay接口第一個https訪問是正常的,但由后端server返回的302跳轉全部變成了http請求。在nginx和后端機器tcpdump抓包分析,發現pay接口從nginx過去的請求頭Host是xxoo.com_2,而user接口是xxoo.com則302跳轉https正常!
所以nginx的proxy模塊請求backend的http header中Host字段指就是proxy_pass 指令的值。nginx根據該Host是否和server_name匹配絕對是否對前端返回https。
一般情況我在nginx接入側配置這條足以:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_add_x_forwarded_for的值為: 客戶端穿過來的x_forwarded_for值+ remote_addr。如果客戶端傳來的x-forwarded-for值本事是非法、錯誤的。那么后端應用如果截取左起第一個字段獲取到的ip值也是錯誤。
這個一般有2個辦法,首先,可以在nginx接入對很明顯非法的ip摘掉,強制把remote_addr值添到X-Forwarded-For字段:
set $my_proxy_add_x_forwarded_for $proxy_add_x_forwarded_for; if ($proxy_add_x_forwarded_for ~* "127.0.0.1"){ set $my_proxy_add_x_forwarded_for $remote_addr; } proxy_set_header X-Forwarded-For $my_proxy_add_x_forwarded_for;
另外,如果是做ip頻率限制、校驗的話,還不如直接取X-Forwarded-For值的最后一段。因為偽造x-forword-for值成本太低了。
404返回碼轉換有個很老的接口拉取資料返回給客戶端,不時的出現404,但對業務沒影響。開發人力不足以重構這個接口,為了不影響調用成功率,想都設置為返回成功:200,302之類的狀態碼
location / { error_page 404 =302 /404.html; }記錄慢日志
為提高api接口的運營質量,同時也方便定位一些奇怪的問題。需要記錄nginx的慢日志,有個簡單粗暴的辦法,利用nginx+lua直接打日志。
log_by_lua " if tonumber(ngx.var.upstream_response_time) > 3 then local status_code = ngx.var.upstream_status local time_ts= ngx.localtime() local upstream_res_time= ngx.var.upstream_response_time ngx.log(ngx.ERR, "[SLOW] upstream_responce_time:" .. upstream_res_time .. ", upstream_http_code:" .. status_code ..","); end ";跨域設置CORS
這個沒啥技巧,為方便前端開發,在接入層打開跨域資源共享。但從安全角度考慮,不能完全打開限制,所以對業務的幾個referer域名做了正則匹配。
if ($http_referer ~ http://(.*).(xx1|xx2|xx3).(com|cn)(/*.*)){ add_header Access-Control-Allow-Credentials true; add_header Timing-Allow-Origin http://$1.$2.$3; add_header Access-Control-Allow-Origin http://$1.$2.$3; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39127.html
摘要:線上運營的問題配置更新首先,配置修改問題。腳本每隔分鐘執行一次,檢查配置,生效。那怎么監控這一環呢自己弄了個模塊,抽取內置的變量等等通過抽樣上報給集群,利用根據業務,域名,路徑等分類實時分組計算,按分鐘緯度統計匯總。 背景 標題黨了,現在不寫個海量、高并發、大數據都不好意思發出來。 前面發了一個nginx的tips文章,一些基本的用法。這里主要說下nginx在多業務、大規模場景下的一...
摘要:由于是并行開發,肯定存在好幾個功能同時驗收或者測試的情況,這個時候預發環境到底部署誰的代碼呢切換到的分支,就不能驗收了。所以希望存在一個多人開發環境,每個人的開發流程互不影響。運行原理首先我們來分析下的運行原理,看看的語言特點。 PHP 作為世界上最好的語言,在web里占據著大概80%的份額,中小公司基本都說 lnmp 架構。當一個倉庫開發人員大于1,20人的時候,每個人可能開發不同的...
摘要:由于是并行開發,肯定存在好幾個功能同時驗收或者測試的情況,這個時候預發環境到底部署誰的代碼呢切換到的分支,就不能驗收了。所以希望存在一個多人開發環境,每個人的開發流程互不影響。運行原理首先我們來分析下的運行原理,看看的語言特點。 PHP 作為世界上最好的語言,在web里占據著大概80%的份額,中小公司基本都說 lnmp 架構。當一個倉庫開發人員大于1,20人的時候,每個人可能開發不同的...
閱讀 1311·2021-11-24 10:24
閱讀 4090·2021-11-22 15:29
閱讀 1085·2019-08-30 15:53
閱讀 2788·2019-08-30 10:54
閱讀 1977·2019-08-29 17:26
閱讀 1271·2019-08-29 17:08
閱讀 605·2019-08-28 17:55
閱讀 1576·2019-08-26 14:01