読者です 読者をやめる 読者になる 読者になる

nginxでMogileFS

nginx MogileFS

このトピックが役に立った。

PerlbalのX_REPROXY_URL的なことをnginxでやる

nginxがリバースプロキシになっていて、背後(127.0.0.1:8000)にアプリケーションがいる場合、次のような設定になる。

upstream django {
	server 127.0.0.1:8000;
}

server {
	listen 80;
	server_name localhost;

	location / {
		proxy_pass http://django;
	}

	location /reproxy {
                internal;
		set $reproxy  $upstream_http_x_reproxy_url;
		proxy_pass $reproxy;
		proxy_hide_header Content-Type;
	}
}

はまったのが、"proxy_pass $reproxy"のような書き方はnginx 0.5ではできないこと。ここの情報によると0.6.27以降でないと駄目みたい。これは、最新の開発版の0.6.29を使って解決した。

【追記4/23】
内部的にしか使わないURLにはinternalディレクティブを設定しておいた方がよいです。今回の場合、/reproxyというURLはアプリケーションがX-Accel-Redirectを返した場合にしか使わず、外から参照できる必要はないので、internalを設定します。


上記のようなリバースプロキシの設定をした上で、アプリケーションが、

Content-Type: image/gif
X-Accel-Redirect: /reproxy
x-reproxy-url: http://127.0.0.1:7500/dev2/0/000/000/0000000024.fid

というレスポンスを返してやると、nginxがx-reproxy-urlで指定されているURLのコンテンツを返してくれる。

$ curl --head http://127.0.0.1/img/image_id/
HTTP/1.1 200 OK
Server: nginx/0.6.29
Date: Fri, 18 Apr 2008 14:33:41 GMT
Content-Type: image/gif
Connection: keep-alive
Keep-Alive: timeout=20
Content-Length: 107962
Last-Modified: Fri, 18 Apr 2008 13:24:59 GMT
Accept-Ranges: bytes

Djangoでやるならば、

def reproxy(req, image_id):
    res = HttpResponse(mimetype="image/gif")
    res["X-Accel-Redirect"] = "/reproxy"
    res["x-reproxy-url"] = "http://127.0.0.1:7500/dev2/0/000/000/0000000024.fid"
    return res

のような感じ。本当は、

  • キャッシュ関連のヘッダーを処理してやらなくてはならない
  • MogileFSのkeyからURLを取得する処理を行わなくてはいけない

のだけれども。

storage nodesにnginxを使う

ここに書いてあるように、nginxのWebDAVの設定を行う。

server {
	listen 7500;
	server_name localhost;
	charset utf-8;
	location / {
		root /var/mogdata/;
		dav_methods put delete mkcol copy move;
		dav_access user:rw group:rw all:r;
	}
	error_page 500 502 503 504 /50x.html;
	location /50x.html {
		root html;
	}
}

nginxでWebDAVを使うには、--with-http_dav_moduleをつけてconfigure && makeしなくてはいけない。

mogstored.confは次のようにする?

server=none
mgmtlisten=0.0.0.0:7501
docroot=/var/mogdata

mogstored.confの方はよく分からない。そもそも、この場合mogstoredを動かしておく必要性があるのかどうかがよく分からない。