Nginxの静的ファイル配信でハマった

静的ファイルに限った話ではないけれど、Nginxのlocationに応じたrootの設定でつまずいたのでメモ。概説Tornadoの中に「静的リソースはアプリケーションにリクエストをプロキシするのではなくNginxに捌かせるほうがアプリケーションの不要な負担を取り除けて有用」という説明があったので、staticディレクトリへのルーティング設定を書いた。

location /static/ {
    root /path/to/app/static;
}

上記のように書きたいところだがこれは間違いで

location /static/ {
    root /path/to/app;
}

正しくはこちら。

rootはstaticディレクトリのrootを指すのではなく、アプリケーションのroot。/static/はURLとして生きているので/static/を含むパスでファイルへ届くように書く必要がある。

(備考)アプリケーション全体のnginx設定ファイルはこんな感じ。各アプリケーションごとに設定ファイルを分けてconf.d/以下に保存しておき、nginx.confでそれらをインポートしている。

upstream paletta{
    server 127.0.0.1:8011;
    server 127.0.0.1:8012;
    server 127.0.0.1:8013;
    server 127.0.0.1:8014;
}

server {
    listen 80;
    server_name paletta.mrk1869.com;

    access_log  /home/web/log/nginx/paletta.mrk1869.com/access.log ltsv;
    location /static/ {
        root /home/web/paletta/app;
    }
    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://paletta;
    }
}