What have you found for these years?

2009-03-10

nginx X-Reproxy-URL

唉,沒什麼思考能力了,只好來寫寫筆記,總比發呆好吧...

perlbal 的 X-Reproxy-URL 滿方便的,
可以自動抓取任意 upstream 的 data 再傳回去。
不過 nginx 沒有支援這個,只有 X-Accel-Redirect,
這只能針對 local 端,並不能針對任意 url.

透過一些靜態設定,可以假裝有這個功能。或許這也利於安全性?
畢竟這樣表示你不能隨便亂丟 url 亂導。當然,更好的狀況是,
有 inclusion 和 exclusion 兩種設定模式。

anyway, 我們會需要一個額外的 header.
假設目標是:

X-Reproxy-URL: http://10.0.0.123/dev2/00/0024.fid

那麼需要再額外加上:

X-Accel-Redirect: /x-reproxy-url

這個 /x-reproxy-url 可以自訂,是一個內部的 nginx location.
location /x-reproxy-url {

internal;
proxy_pass $upstream_http_x_reproxy_url;

}
名字取越長越怪越不容易衝突,自己斟酌吧。
這邊就是把 X-Reproxy-URL 的 value 抓出來,
當作是另一個 upstream 的 name.
所以當然還要列出所有的 upstream server:

upstream 10.0.0.123 { server 10.0.0.123; }

也就是說,http://10.0.0.123/xxx 會丟到 server 10.0.0.123,
然後 path 就是 /xxx. 當然名字和 server ip/name 可以設不同,
不過一般來說應該沒有這個必要。或是這邊要充當一個 dns 也行啦...
那 upstream 就可以用 name 再去對到 ip 上。

如果是用在 mogilefs 上,可以再加上:

proxy_hide_header Content-Type;

這樣就能用原本的 upstream 所傳回的 Content-Tpye.

完整設定:
source-tools 的範例
# used for X-Reproxy-URL, e.g., return these headers from upstream:
# X-Accel-Redirect: /x-reproxy-url
# X-Reproxy-URL: http://10.0.0.123/dev2/00/0024.fid
upstream 10.0.0.123 {
server 10.0.0.123;
}
server {
# used for X-Reproxy-URL
location /x-reproxy-url {
internal;
proxy_pass $upstream_http_x_reproxy_url;

# used for mogilefs
# proxy_hide_header Content-Type;
}
}

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0