uzullaがブログ

uzullaがブログです。

nginxでfastcgi+aliasな環境のイケてるconfigがわからない

nginxがフロントで、fastcgiをつかってAPサーバーに接続し、「aliasで」特定のディレクトリを特定のURLに繋ぎこみたい場合、以下のようなconfigになっているのだけれど(いらないものは消してる)

    server {
        root /var/www/html;
        index index.php index.html index.htm;

        location ~ ^/getgifboomgif.*/$ {
            rewrite ^(.*)$  $1/index.php last;
        }

        location ~ ^/getgifboomgif/(.*\.php)$ {
            alias /path/to/get_gifboom_gif/public/$1;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            include fastcgi_params;
        }

        location ~ /getgifboomgif/(.*)$ {
            alias /path/to/get_gifboom_gif/public/$1;
        }
}

なんかいかにも変な、冗長っぽい感じであり、本当はどう書くべきなのかという所で悩んでる。
上でいったら、「rewriteのあるディレクティブは消せないのか?」とかそういう所である。


ここでaliasじゃなくてrootをつかうと*1、アプリの公開ディレクトリをかきかえないと、FastCGIが読み込むスクリプトのパスがミスマッチになる。
(ここだと「/path/to/get_gifboom_gif/public/」を「/path/to/get_gifboom_gif/public/get_gifboom_gif/」とか掘って詰め込みしなおさなきゃいけなくて、公開環境に都度ディレクトリ構造を合わせるのはダルい、Symlinkを使う方法は正しい上位のディレクトリにのぼれなくなる)

さらに、aliasだとDirectoryIndexがきかない感じになるので、都合三つもlocation書く事になる。*2


まあ、なんとなく動く上記設定も、「/getgifboomer/」はindex.phpにいってくれるけど、「/getgifboomer」は404になってしまう。まあこれは許せるのでよいが。


この間のHachioji.pmでh_kobaさんと話して、まあこういう感じになるんだなあとおもってるのだが、もっとこうビシー!と美しくできる方法があるんじゃないのか…?とおもいつつまだみつかってない。

まあ、バラバラのディレクトリにあるアプリを一個のドメインに盛っていくのって、ちゃんとしたサイトでは滅多にやらないけど、現実として、個人サイトとかでセコくいくにはこういうのよくやるんだよなー。

まあここらへん全部

APサーバとのやりとりがFastCGIだからめんどくせえって感じはある。
でも、現在のPHPスタンドアロンHTTPDがないんや!しかたないんや!!!
(このあたり、HHVMならhttpdが有る、というのが皮肉っぽい)

*1:勿論、別途「/」から利くphpのディレクティブを追加するとして

*2:try_filesもこのケースだとうまくうごかないっぽい