nginxを勉強する日記
前回「Rackhubを試してみた日記」でPython製の自前サーバを起動した際に、Rackhubは8000番のポートとかを塞いであるので自前サーバを80番で動くようにするために色々苦労してたら「それnginxでリバースプロキシすればいいよ」と教えてもらった。
「Rackhub: あなたのための、クラウド上のlocalhost」ということで、普段自分がlocalhostをどう使っているかなーと考えると、80番ポートってあんまり使わない。コマンドラインでpython -mSimpleHTTPServerって叩いて8000番でディレクトリの中身を一時的に晒したり、Flaskの開発サーバでプロトタイプを作って5000番で社内公開したり。だからそういうのが簡単にできるようにしたい。
まずはnginxを起動する。よくわかってないのだけども、sudo nginxで起動した。
ブラウザでアクセスしてみる。こんなデフォルトページが出た。親切だな。
Welcome to rackhub!
This is a nginx default page at /usr/local/nginx/html/index.html .
Config files are at nginx.conf and conf.d/* in /usr/local/nginx/ .
というわけでまずはnginx.confをいじってみる。
Rackhub上の設定ファイルをいじるのは手元のCarbonEmacsでtramp-modeを使って、直接リモートのファイルを編集している。ローカルのファイルを開くのと同じようにC-x C-fして /rackhuber@foobarbaz.rackbox.net#50000:/usr/local/nginx/nginx.conf とかを開けばよい。50000のところは自分のRackのポート番号を指定。foobarbazにはもちろん自分のRackの名前を指定。あと、rackbox.netを間違えてrachhub.netにしてて少し悩んだがここは割とすんなり。
nginx.confは/usr/local/nginx/conf.d/defaultをインクルードしている。具体的にはその中で色々書いてある。色々複雑なことをする人はこうやって分割したくなるのかもしれないけども、分割は慣れてからすることにして、まずは1つにまとめて見通しをよくしてみよう。
今回の目的は、8000番で走っているpython -mSimpleHTTPServerに手軽にアクセスできること。
worker_processes 1; events { worker_connections 128; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /usr/local/nginx/html; index index.html index.htm; } # (1) このlocationを書き足した location /test { rewrite ^/test(.*)$ $1 break; # (2) この行は後で書き足した proxy_pass http://localhost:8000; proxy_set_header X-Real-IP $remote_addr; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
(1)を書き足したがRackhubでの再起動の仕方がよくわからない。
sudo /etc/init.d/nginx restart sudo: /etc/init.d/nginx: コマンドが見つかりません
しかたがないので普通にkillして起動しなおした。ブラウザでアクセスすると:
The page you are looking for is temporarily unavailable.
Please try again later.
おや、エラーだ。コンソールを見ると:
$ python -mSimpleHTTPServer Serving HTTP on 0.0.0.0 port 8000 ... localhost - - [22/Aug/2012 02:25:47] code 404, message File not found localhost - - [22/Aug/2012 02:25:47] "GET /test/ HTTP/1.0" 404 - localhost - - [22/Aug/2012 02:25:55] code 404, message File not found localhost - - [22/Aug/2012 02:25:55] "GET /test HTTP/1.0" 404 -
試しにln -s . testしてみる。無事ファイルの一覧が出た。ということはGETパラメータの/testも含めてSimpleHTTPServerに渡されているのか。mod_rewrite的なものが必要だな。
http://wiki.nginx.org/HttpProxyModule をよく見たらproxy_passのところにrewriteのサンプルもたくさんある。/testの部分を削るために下のように書き足す。
rewrite ^/test(.*)$ $1 break;
無事期待通りの出力が得られた。
ここまでで30分くらいかかった。次は手元でFlaskを使って開発したものを手軽にRackhubで公開する方法を調べよう。ウェブアプリの中から絶対パスで'/api'とか叩いていると失敗しちゃうからどうするのがいいかなー。