nginxでサブディレクトリごとに異なるLaravelを動かしてみる
こんにちは、今井です。
今回とある案件でnginxでサブディレクトリごとに異なるLaravelを呼び出したいということがありましたので、その時設定した内容を紹介します。
0.やりたいこと
- サブディレクトリは /hoge /foo /bar を3つ用意
- それぞれのサブディレクトリにlaravel を用意(hoge, foo, barのディレクトリの下にそれぞれapp, bootstrap, ~~~~~, publicというディレクトリがある状態です)
- /hoge のURLにアクセスした時は、/var/www/hoge/public をDocumentRootとする
- /foo のURLにアクセスした時は、/var/www/foo/public をDocumentRootとする
- /bar のURLにアクセスした時は、/var/www/bar/public をDocumentRootとする
- / の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を設定する際の参考になればと思います。