Nginx+Unicorn:静的ファイルをNginxで配信しようとしてハマった

目的

Nginx + Unicorn でアプリを動かしている状態で、/static 以下の URL に対するリクエストだけ /var/www/html_doc から配信したい。

ダメだった設定

ググっていくつかのページを参照しながら、次のように location ディレクティブを設定した。

location /static {
    root /var/www/html_doc/;
    break;
}

これだとうまくいかない。

原因と解決

error.log を見てみると、/static/path/to/file.html にアクセスした時に /var/www/html_doc/static/path/to/file.html を探しているのが分かった。どうも URL の一部である /static は置き換えてくれるわけじゃないらしい。
というわけで、下のように自前で rewrite したらうまくいった。

location /static {
    root /var/www/html_doc/;
    rewrite '^/static(.*)$' $1;
    break;
}