NEWS ABOUT Solution WORKS TEAM BLOG お問い合わせ JP EN

nginxでサブディレクトリごとに異なるLaravelを動かしてみる

ogp (1)

こんにちは、今井です。

今回とある案件でnginxでサブディレクトリごとに異なるLaravelを呼び出したいということがありましたので、その時設定した内容を紹介します。

0.やりたいこと

  1. サブディレクトリは /hoge /foo /bar を3つ用意
  2. それぞれのサブディレクトリにlaravel を用意(hoge, foo, barのディレクトリの下にそれぞれapp, bootstrap, ~~~~~, publicというディレクトリがある状態です)
  3. /hoge のURLにアクセスした時は、/var/www/hoge/public をDocumentRootとする
  4. /foo のURLにアクセスした時は、/var/www/foo/public をDocumentRootとする
  5. /bar のURLにアクセスした時は、/var/www/bar/public をDocumentRootとする
  6. / のURLにアクセスした時は、/var/www/html をDocumentRootとする(/var/www/htmlにはLaravelは設置しません)

1.環境情報

OS、CentOS7
PHP-fpm、7.4
nginx、1.20
IPアドレスは192.168.10.10と設定されているものとします。
※上記のインストールについては割愛します

2.Laravelディレクトリの設定

①、まずcomposerをインストールします

$ cd /tmp
$ wget https://getcomposer.org/installer -O composer-installer.php
$ sudo php composer-installer.php --filename=composer --install-dir=/usr/local/bin
$ sudo chmod +x /usr/local/bin/composer
$ rm composer-installer.php

②、/var/www/hoge にLaravelを設置します

$ cd /tmp
$ composer create-project --prefer-dist laravel/laravel hoge
$ cd hoge
$ find ./storage -type d|xargs chmod 777
$ sudo mv hoge /var/www

③、/var/www/foo にLaravelを設置します

$ cd /tmp
$ composer create-project --prefer-dist laravel/laravel foo
$ cd foo
$ find ./storage -type d|xargs chmod 777
$ sudo mv foo /var/www

④、/var/www/bar にLaravelを設置します

$ cd /tmp
$ composer create-project --prefer-dist laravel/laravel bar
$ cd bar
$ find ./storage -type d|xargs chmod 777
$ sudo mv bar /var/www

3./で始まるURLの時、/var/www/html をDocumentRootとする

①、php-fpmの設定をします。/etc/nginx/conf.d/php-fpm.confの中身を以下にします
※php-fpmを9000番ポートで設定されているものとします。

upstream php-fpm {
    server 127.0.0.1:9000;
}

②、/etc/nginx/nginx.confの http 部分の中身を以下にします。

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/html;
        client_max_body_size 10m;

        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
            location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }

        location ~ / {
            index index.php index.html index.htm;

            location ~ \.(php)(/.*)?$ {
                fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;
                fastcgi_intercept_errors on;
                fastcgi_index  index.php;
                include        fastcgi_params;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO $fastcgi_path_info;
                fastcgi_pass   php-fpm;
            }
        }
    }
}

③、/var/www/html/i.php を以下の内容で設置します

<?php
phpinfo();

④、nginxを起動します

$ sudo systemctl reload nginx

⑤、ブラウザで http://192.168.10.10/i.php と叩くとphpinfoが表示されればOKです。

4./hoge で始まるURLの時、/var/www/hoge/public をDocumentRootとする

①、/etc/nginx/default.d/hoge.conf を以下の内容で設置します

location ~ ^/hoge/ {
    alias /var/www/hoge/public/;
    index index.php;

    try_files $uri $uri/ /hoge/index.php?$query_string;

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

②、/var/www/hoge/resources/views/welcome.blade.phpの中身を以下に編集します

これはhogeのLaravelです

②、nginxを起動します

$ sudo systemctl reload nginx

③、ブラウザで http://192.168.10.10/hoge を叩くと「これはhogeのLaravelです」が表示されればOKです。

5./foo で始まるURLの時、/var/www/foo/public をDocumentRootをする

①、/etc/nginx/default.d/foo.conf を以下の内容で設置します

location ~ ^/foo/ {
    alias /var/www/foo/public/;
    index index.php;

    try_files $uri $uri/ /foo/index.php?$query_string;

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

②、/var/www/foo/resources/views/welcome.blade.phpの中身を以下に編集します

これはfooのLaravelです

②、nginxを起動します

$ sudo systemctl reload nginx

③、ブラウザで http://192.168.10.10/foo を叩くと「これはfooのLaravelです」が表示されればOKです。

6./bar で始まるURLの時、/var/www/bar/public をDocumentRootとする

①、/etc/nginx/default.d/bar.conf を以下の内容で設置します

location ~ ^/bar/ {
    alias /var/www/bar/public/;
    index index.php;

    try_files $uri $uri/ /bar/index.php?$query_string;

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

②、/var/www/bar/resources/views/welcome.blade.phpの中身を以下に編集します

これはbarのLaravelです

②、nginxを起動します

$ sudo systemctl reload nginx

③、ブラウザで http://192.168.10.10/bar を叩くと「これはbarのLaravelです」が表示されればOKです。

7.まとめ

今回の設定で一番困ったのが、PHPファイルが /etc/nginx/nginx.conf に設定された php-fpm のパスで呼び出されてしまうところでした。
/foo とアクセスしても、/var/www/foo/public を見に行かず /var/www/html/ 配下のPHPファイルを探しに行ってしまいました。

解決となったポイントは、それぞれのサブディレクトリ内のPHPの設定のlocation部分に location ~ ^/bar/(?.+\.php)(/|$) を設定したところでした。

こちらの設定を行うことで、/bar から始まりさらにPHPを呼び出しているという条件が設定でき、また(?<script_name>.+\.php) という正規表現を使うことで、呼び出したPHPファイル名をNginxの$script_nameという変数に格納でき、fastcgi_param SCRIPT_FILENAME $document_root$script_name として呼び出せるようにできました。

以上、nginxでサブディレクトリごとに異なるLaravelを設定する際の参考になればと思います。