摘要:前言業(yè)務(wù)野蠻生長時(shí)期,作為一枚,有運(yùn)營過比較長的一段時(shí)間。根據(jù)該是否和匹配絕對是否對前端返回。開發(fā)人力不足以重構(gòu)這個(gè)接口,為了不影響調(diào)用成功率,想都設(shè)置為返回成功之類的狀態(tài)碼記錄慢日志為提高接口的運(yùn)營質(zhì)量,同時(shí)也方便定位一些奇怪的問題。
前言
業(yè)務(wù)野蠻生長時(shí)期,作為一枚op,有運(yùn)營過nginx比較長的一段時(shí)間。期間遇到些小問題,這里簡單做個(gè)總結(jié)記錄,會不定時(shí)更新:
開始扯淡 proxy_set_header的作用域限制還記得是個(gè)后臺鑒權(quán)server需要調(diào)用方提供一個(gè)QC_REAL_IP的http頭做校驗(yàn),我在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; }
但是,卻發(fā)現(xiàn)鑒權(quán)不成功,一直是返回503。掏出tcpdump抓包
tcpdump -i eth1 -nn -Als0p "tcp and host author_server_ip and port author_server_port"
發(fā)現(xiàn)nginx發(fā)出的包頭里沒有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不完全是繼承關(guān)系!把QC_REAL_IP的配置copy一份到location里,終于生效了。
剛開始拿nginx做proxy,一般proxy_pass和upstream的名字一致,有多個(gè)proxy_pass就加數(shù)字.例如:
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接口第一個(gè)https訪問是正常的,但由后端server返回的302跳轉(zhuǎn)全部變成了http請求。在nginx和后端機(jī)器tcpdump抓包分析,發(fā)現(xiàn)pay接口從nginx過去的請求頭Host是xxoo.com_2,而user接口是xxoo.com則302跳轉(zhuǎn)https正常!
所以nginx的proxy模塊請求backend的http header中Host字段指就是proxy_pass 指令的值。nginx根據(jù)該Host是否和server_name匹配絕對是否對前端返回https。
一般情況我在nginx接入側(cè)配置這條足以:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_add_x_forwarded_for的值為: 客戶端穿過來的x_forwarded_for值+ remote_addr。如果客戶端傳來的x-forwarded-for值本事是非法、錯(cuò)誤的。那么后端應(yīng)用如果截取左起第一個(gè)字段獲取到的ip值也是錯(cuò)誤。
這個(gè)一般有2個(gè)辦法,首先,可以在nginx接入對很明顯非法的ip摘掉,強(qiáng)制把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頻率限制、校驗(yàn)的話,還不如直接取X-Forwarded-For值的最后一段。因?yàn)閭卧靫-forword-for值成本太低了。
404返回碼轉(zhuǎn)換有個(gè)很老的接口拉取資料返回給客戶端,不時(shí)的出現(xiàn)404,但對業(yè)務(wù)沒影響。開發(fā)人力不足以重構(gòu)這個(gè)接口,為了不影響調(diào)用成功率,想都設(shè)置為返回成功:200,302之類的狀態(tài)碼
location / { error_page 404 =302 /404.html; }記錄慢日志
為提高api接口的運(yùn)營質(zhì)量,同時(shí)也方便定位一些奇怪的問題。需要記錄nginx的慢日志,有個(gè)簡單粗暴的辦法,利用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 ";跨域設(shè)置CORS
這個(gè)沒啥技巧,為方便前端開發(fā),在接入層打開跨域資源共享。但從安全角度考慮,不能完全打開限制,所以對業(yè)務(wù)的幾個(gè)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; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/39127.html
摘要:線上運(yùn)營的問題配置更新首先,配置修改問題。腳本每隔分鐘執(zhí)行一次,檢查配置,生效。那怎么監(jiān)控這一環(huán)呢自己弄了個(gè)模塊,抽取內(nèi)置的變量等等通過抽樣上報(bào)給集群,利用根據(jù)業(yè)務(wù),域名,路徑等分類實(shí)時(shí)分組計(jì)算,按分鐘緯度統(tǒng)計(jì)匯總。 背景 標(biāo)題黨了,現(xiàn)在不寫個(gè)海量、高并發(fā)、大數(shù)據(jù)都不好意思發(fā)出來。 前面發(fā)了一個(gè)nginx的tips文章,一些基本的用法。這里主要說下nginx在多業(yè)務(wù)、大規(guī)模場景下的一...
摘要:前言老項(xiàng)目,項(xiàng)目情況端配置運(yùn)行環(huán)境方面有些人開發(fā)環(huán)境是,有些是。以我的開發(fā)環(huán)境為例老項(xiàng)目的運(yùn)行,開發(fā)時(shí)需要先執(zhí)行一個(gè)腳本經(jīng)歷過一次風(fēng)波之后做的人走光啦,但是老項(xiàng)目要繼續(xù)維護(hù)。老項(xiàng)目改造其實(shí)還有不少坑,等我想起來再慢慢更新。 前言 老項(xiàng)目,React + PHP + nginx 項(xiàng)目情況 PHP端配置 PHP運(yùn)行環(huán)境方面:有些人開發(fā)環(huán)境是wamp(apache + PHP),有些是np...
摘要:由于是并行開發(fā),肯定存在好幾個(gè)功能同時(shí)驗(yàn)收或者測試的情況,這個(gè)時(shí)候預(yù)發(fā)環(huán)境到底部署誰的代碼呢切換到的分支,就不能驗(yàn)收了。所以希望存在一個(gè)多人開發(fā)環(huán)境,每個(gè)人的開發(fā)流程互不影響。運(yùn)行原理首先我們來分析下的運(yùn)行原理,看看的語言特點(diǎn)。 PHP 作為世界上最好的語言,在web里占據(jù)著大概80%的份額,中小公司基本都說 lnmp 架構(gòu)。當(dāng)一個(gè)倉庫開發(fā)人員大于1,20人的時(shí)候,每個(gè)人可能開發(fā)不同的...
摘要:由于是并行開發(fā),肯定存在好幾個(gè)功能同時(shí)驗(yàn)收或者測試的情況,這個(gè)時(shí)候預(yù)發(fā)環(huán)境到底部署誰的代碼呢切換到的分支,就不能驗(yàn)收了。所以希望存在一個(gè)多人開發(fā)環(huán)境,每個(gè)人的開發(fā)流程互不影響。運(yùn)行原理首先我們來分析下的運(yùn)行原理,看看的語言特點(diǎn)。 PHP 作為世界上最好的語言,在web里占據(jù)著大概80%的份額,中小公司基本都說 lnmp 架構(gòu)。當(dāng)一個(gè)倉庫開發(fā)人員大于1,20人的時(shí)候,每個(gè)人可能開發(fā)不同的...
閱讀 1319·2021-11-24 10:24
閱讀 4162·2021-11-22 15:29
閱讀 1091·2019-08-30 15:53
閱讀 2798·2019-08-30 10:54
閱讀 1986·2019-08-29 17:26
閱讀 1290·2019-08-29 17:08
閱讀 610·2019-08-28 17:55
閱讀 1586·2019-08-26 14:01