亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

使用OpenResty控制CDN回源主機

2024-06-28 16:00:32
字體:
來源:轉載
供稿:網友

http://scyuan.info/2016/03/07/openresty-cdn-original.html

年前粗略看了一下《OpenResty最佳實踐》,感覺OpenResty是個好東西呀,但是一下子又找不到使用場景,所以就放到一邊了。最近遇到一個需求,感覺用OpenResty正合適,所以終于在生產環境實踐了一把。

需求

一個javaScript腳本分發服務:

        key瀏覽器 --------------> 分發服務GET /js?key=xxxx        302 CDN地址瀏覽器 <-------------- 分發服務Location: cdn.x.com/digest/xxxx.js//分發服務根據key獲取用戶的配置(用戶可以通過web界面修改,需要盡快生效)//以及配置對應的靜態js文件(分布在分發服務的本地硬盤),//計算配置和靜態內容的摘要,拼接到CDN的URL中,//當配置或靜態內容更新后,重定向新的URL,CDN將觸發回源流程。        CDN地址              回源瀏覽器 --------------> CDN --------------> 分發服務

由于該服務的請求量還是挺大的(每天的重定向請求量在七百六十萬左右,回源請求量在八萬左右),所以部署了兩個分發服務,前面擋了一個Nginx做負載均衡。

本來做Nginx是為了容錯,結果就因為這個還帶來了一個小問題:

由于兩臺分發服務的配置更新存在時間差,特別是靜態文件,所以設想一下,服務A配置已經更新,而服務B沒有更新,一個請求來到服務A,重定向到新的URL,而回源的請求來到服務B,B返回舊的JS腳本,被CDN緩存,那么新配置的生效時間將會推遲到CDN緩存失效。。。

解決方案

首先想到的是將回源服務獨立出來,如果有配置更新,首先等待回源服務生效,然后再更新重定向服務。這個方案的缺點就是麻煩,得多部署一套服務,前端人員更新JS靜態文件得等挺久,所以否掉了。

然后想到的一個方案是,重定向的時候在URL中標示出回源主機,舉例來說,A返回重定向地址,回源請求來到Nginx,Nginx根據URL判斷需要轉發到A,而不是B,如此就不會出現上面提到的問題,另外即使某臺服務宕機,另外一臺也可以正常提供服務。

這塊邏輯不應該耦合到原有的分發服務,所以就是想到了使用OpenResty解決:

http {...    upstream js_backend {        server 10.1.1.20:8080;        server 10.1.1.21:8080;        keepalive 64;    }...    server {        listen       80;...        location ^~ /20/ {            PRoxy_pass http://10.1.1.20:8080/;            proxy_http_version 1.1;            proxy_set_header Connection "";        }        location ^~ /21/ {            proxy_pass http://10.1.1.21:8080/;            proxy_http_version 1.1;            proxy_set_header Connection "";        }        location = /js {            proxy_pass http://js_backend;            proxy_http_version 1.1;            proxy_set_header Connection "";            header_filter_by_lua_block {                if ngx.status == 302 then                    local regex = "^([0-9]+).([0-9]+).([0-9]+).([0-9]+):([0-9]+)$"                    local m, err = ngx.re.match(ngx.var.upstream_addr, regex)                    if m then                        local loc = ngx.header["Location"]                        local s = loc:find("/", 9)                        ngx.header["Location"] = table.concat({loc:sub(1, s), m[4], "/", loc:sub(s+1, -1)})                    else                        ngx.log(ngx.ERR, err)                    end                end            }        }                ...            }}    

這里沒有把upstream_addr完全拼進去,然后根據該段轉發,主要是考慮到安全上的問題。

服務切了過來,一切正常,性能也沒受到影響。(剛切過來時,回源請求比較多,受了點兒影響)

總的來說,對于OpenResty印象相當好,如果場景合適,以后會多多使用。

更新 0603

最近有一個后端tomcat掛掉了,然后看到error.log中大量的

2016/06/02 15:00:25 [error] 5128#0: *412855176 connect() failed (111: Connection refused) while connecting to upstream, client: 49.117.113.178, server: *.touclick.com, request: "GET /xxx HTTP/1.1", upstream: "http://10.47.64.40:8099/xxx", host: "js.touclick.com", referrer: "http://x"2016/06/02 15:00:25 [warn] 5128#0: *412855176 upstream server temporarily disabled while connecting to upstream, client: 49.117.113.178, server: *.touclick.com, request: "GET /xxx HTTP/1.1", upstream: "http://10.47.64.40:8099/xxx", host: "js.touclick.com", referrer: "http://x"2016/06/02 15:00:25 [error] 5128#0: *412855176 [lua] xxx_url_rewrite.lua:15: nil while reading response header from upstream, client: 49.117.113.178, server: *.touclick.com, request: "GET /xxx HTTP/1.1", upstream: "http://10.168.234.54:8099/xxx", host: "js.touclick.com", referrer: "http://x"

前兩行容易理解,是由于后端tomcat掛掉了,但是第三行有點兒奇怪,意思是正則表達式無法匹配ngx.var.upstream_addr,然后回想起平時偶爾也會看到一兩條,但是因為太偶然所以沒繼續關注。

ngx.var.upstream_addr打印出來發現是10.47.64.40:8099, 10.168.234.54:8099這個,查了一下文檔:

$upstream_addr

keeps the IP address and port, or the path to the UNIX-domain socket of the upstream server. If several servers were contacted during request processing, their addresses are separated by commas, e.g. “192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”. If an internal redirect from one server group to another happens, initiated by “X-Accel-Redirect” or error_page, then the server addresses from different groups are separated by colons, e.g. “192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”.

啊…… 發現了一個bug……

修復如下:

if ngx.status == ngx.HTTP_MOVED_TEMPORARILY then    local regex = "^([0-9]+).([0-9]+).([0-9]+).([0-9]+):([0-9]+)$"    local upstream_addr = ngx.var.upstream_addr    local i, j = upstream_addr:find(", ")    while i do        upstream_addr = upstream_addr:sub(j+1, -1)        i, j = upstream_addr:find(", ")    end    local m, err = ngx.re.match(upstream_addr, regex, "o")    if m then        local loc = ngx.header["Location"]        local i, j = loc:find("://")        local s = loc:find("/", j+1)        ngx.header["Location"] = table.concat({ngx.var.scheme, loc:sub(i, s), m[4], "/", loc:sub(s+1, -1)})    else        ngx.log(ngx.WARN, "upstream_addr: ", ngx.var.upstream_addr)        ngx.log(ngx.ERR, err)    endend
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人欧美一区二区三区在线| 欧美一区二区.| 性欧美长视频免费观看不卡| 精品国产区一区二区三区在线观看| 久久久久亚洲精品国产| 亚洲日本中文字幕免费在线不卡| 国产精品久久在线观看| 亚洲va欧美va国产综合剧情| 国产精品一区二区三| 亚洲精品久久在线| 日韩欧美一区二区三区久久| 大荫蒂欧美视频另类xxxx| 日韩欧美综合在线视频| 国内精品久久久久| 欧美电影免费观看电视剧大全| 91精品免费看| 亚洲精品视频二区| 91久久夜色精品国产网站| 亚洲国产精品热久久| 日本高清视频精品| 在线观看欧美www| 成人精品视频久久久久| 中文字幕最新精品| 欧美激情精品久久久久久久变态| 久久成人精品一区二区三区| 97精品国产91久久久久久| 精品国产区一区二区三区在线观看| 欧美性开放视频| 欧美成人黑人xx视频免费观看| 国产美女扒开尿口久久久| 国产精品福利在线观看| 亚洲欧美在线看| 国产在线98福利播放视频| 欧美在线观看一区二区三区| 97在线视频精品| 第一福利永久视频精品| 国产mv免费观看入口亚洲| 国产女人18毛片水18精品| 97在线精品国自产拍中文| 欧美日韩午夜激情| 97在线看免费观看视频在线观看| 欧美激情在线观看| 欧美日韩国产中字| 在线精品视频视频中文字幕| 国产精品精品视频一区二区三区| 国产日韩中文字幕在线| 日韩精品久久久久久福利| 久久99精品久久久久久青青91| www.国产一区| 黄网动漫久久久| 亚洲男人天堂2019| 亚洲免费精彩视频| 亚洲无线码在线一区观看| 国产精品偷伦免费视频观看的| 91影视免费在线观看| 日本最新高清不卡中文字幕| 亚洲成人久久久久| 色综久久综合桃花网| 久久久影视精品| 国产亚洲视频中文字幕视频| 国产精品91一区| 青青草99啪国产免费| 久久精品2019中文字幕| 黑人巨大精品欧美一区二区免费| 在线观看日韩欧美| 欧美精品久久久久久久| 日韩欧美在线第一页| 久久久久久久久久国产精品| 欧美区在线播放| 久久久人成影片一区二区三区观看| 国产香蕉97碰碰久久人人| 国产精品黄色影片导航在线观看| 日韩在线欧美在线国产在线| 精品福利在线视频| 久久亚洲精品一区| 日韩久久免费视频| 国产成人综合av| 久久久久久久久久久亚洲| 亚洲欧美成人精品| 亚洲精品不卡在线| 国产成人av网址| 日本精品视频网站| 美女精品久久久| 久久理论片午夜琪琪电影网| 色爱精品视频一区| 亚洲色图校园春色| 欧美一级成年大片在线观看| 亚洲高清福利视频| 亚洲高清久久久久久| 91免费人成网站在线观看18| 亚洲日本成人女熟在线观看| 日韩在线视频播放| 亚洲美女自拍视频| 久久精品视频导航| 亚洲自拍偷拍福利| 成人欧美一区二区三区在线湿哒哒| 4438全国成人免费| 91九色综合久久| 国产在线精品成人一区二区三区| 亚洲欧美日本伦理| 久久久成人的性感天堂| 日韩在线观看免费高清完整版| 国产亚洲精品美女久久久| 97香蕉超级碰碰久久免费的优势| 日韩av免费网站| 欧美成年人视频| 日韩欧美在线第一页| 国产成人精品a视频一区www| 91久久嫩草影院一区二区| 国产精品视频播放| 日韩性xxxx爱| 国产区精品视频| 中文字幕v亚洲ⅴv天堂| 欧美激情中文字幕乱码免费| 法国裸体一区二区| 日韩av免费一区| 亚洲国产毛片完整版| 久久这里只有精品视频首页| 国产精品久久久久久五月尺| 国产精品第3页| 国产亚洲欧洲高清| 色噜噜狠狠狠综合曰曰曰88av| 日本免费一区二区三区视频观看| 黑人巨大精品欧美一区二区一视频| 亚洲а∨天堂久久精品喷水| 正在播放亚洲1区| 亚洲国产精品成人av| 亚洲精品国产精品国自产观看浪潮| 国产日韩欧美日韩大片| 亚洲人午夜色婷婷| 亚洲国产精品va在线| 97成人精品视频在线观看| 国产99视频在线观看| 欧美日韩另类视频| 亚洲精品黄网在线观看| 国产精品女主播| 久久在线免费观看视频| 国模叶桐国产精品一区| 亚洲大胆人体在线| 97在线视频国产| 欧美激情videos| 国产成人91久久精品| 国产不卡一区二区在线播放| 欧美亚洲免费电影| 日韩欧美国产视频| 国产精品稀缺呦系列在线| 精品国产视频在线| 亚洲曰本av电影| 国产91精品高潮白浆喷水| 中文字幕亚洲一区二区三区| yellow中文字幕久久| 2023亚洲男人天堂| 亚洲视频axxx| 欧美激情在线观看视频| 上原亚衣av一区二区三区| 久久天天躁狠狠躁夜夜躁2014| 日韩电影中文 亚洲精品乱码| 色综合久久中文字幕综合网小说| 91久久在线视频| 色偷偷9999www| 国产精品偷伦视频免费观看国产| 亚洲xxxx做受欧美| 成人444kkkk在线观看| 91久久精品国产91久久性色|