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'とか叩いていると失敗しちゃうからどうするのがいいかなー。