nginxのaliasで設定した仮想ディレクトリでphp-fpmを動かす

今年のゴールデンウィークはひそやかにおわりましたが、皆様体調はいかがでございましょうか。どちら様も引き続きご自愛ください。

さて、今回は小ネタです。同じようなテーマのBlog記事やらQiitaの記事はいろいろみかけますが、なんかどれもうまくいかなったので、ワタシがうまくいった設定を自分のメモ的にご紹介。

Webサーバーの実際のディレクトリ「/var/www/foo」にコンテンツがあるとして、それを公開URL「http://www.example/bar」で公開したい、なんてことがよくあると思います。

Apacheでは別にそれほど悩むことなく、

Alias /bar /var/www/foo

なんてやっておけばよくて、そこでPHP (php-fpm) を動かすのも

<FilesMatch \.php$>
  SetHandler "proxy:unix:/var/run/php/php-fpm.sock|fcgi://localhost/"
</FilesMatch>

みたいなカンジで書いておけば特に問題ありません。

これをnginxでやろうとすると、なんか実にうまくいかない、というのが悩みでした。ええ、ワタシが悩んでいました。

通常、「http://www.example.com/」直下というか、document root以下にPHPプログラムがいる場合はこんなカンジだと思います。

root /var/www/foo;
location ~ \.php(/|$) {
  fastcgi_pass unix:/var/run/php/php-fpm.sock;
  fastcgi_index index.php;
  fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  include fastcgi_params;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param PATH_INFO $fastcgi_path_info;
}

Aliasというか仮想ディレクトリを使う場合は、以下のようにすることでうまく動きました。

location /bar/ {
  alias /var/www/foo/;
  index index.php;

  location ~ ^/bar/(?<script_name>.+\.php)(/|$) {
    fastcgi_pass unix:/var/run/php/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_split_path_info ^/bar/(.+?\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

nginxのバージョンなどにもよるかもしれません。ワタシが試したのはUbuntu-18.04 LTS (Bionic) に収録のngnx-1.14.0でした。

もしお役にたてば。