Laravelをサブディレクトリで公開する話
Laravelをサブディレクトリで公開する方法ってどうするんだろうか?というメモです。
ターゲット
- Docker version 20.10.14, build a224086
- docker-compose version 1.29.2, build 5becea4c
- nginx : latest(1.17.6)
- php-fpm : 8.1-fpm(8.1.6)
今回の最終着地
docker-composeを実行で以下でLaravelがアクセス可能とする
http://localhost:8000/webhook/gitlab
ドキュメントルートは/var/www/htmlを参照する様に
http://localhost:8000/
最終結果
docker-compose.yaml
version: '3'
services:
nginx:
image: nginx:latest
ports:
- '8000:80'
depends_on:
- php-fpm
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./html:/var/www/html
- ./public:/var/www/html/webhook/gitlab
php-fpm:
image : php:8.1-fpm
volumes:
- ./html:/var/www/html
- ./:/var/www/html/webhook/gitlab
default.conf
server {
listen 80;
root /var/www/html;
index index.html index.htm;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ ^/webhook/gitlab/.+\.(txt|ico|htm|html|js|css)$ {
break;
}
location ~ ^/webhook/gitlab {
alias /var/www/html/webhook/gitlab/public/;
index index.php;
try_files $uri $uri/ /webhook/gitlab/index.php?$query_string;
location ~ ^/webhook/gitlab/(?<script_name>.+\.php)(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
悩んだポイント
1. laravelが動かない
Laravelの場合直下ディレクトリにアクセスされた場合に下のpublic/index.phpが実行される必要があるため微妙にややこしいです。
当該ディレクトリ(^/webhook/gitlab)にアクセスがきた場合にSCRIPT_FILENAMEに引き継ぐまでがはてながまだまだありますが、動くから良いかな
alias /var/www/html/webhook/gitlab/publicパスないんだけれども外したり修正したら落ちますw
まだまだ調査が必要ですね。
2. スタティックファイルが参照できない
ルートでアクセスするには以下の様に設定する
- Laravel直下のpublicディレクトリを/var/www/webhook/gitlabにマッピングする。
- ./public:/var/www/html/webhook/gitlab
- default.confにて例外をとしてphpの処理は行わない
location ~ ^/webhook/gitlab/.+\.(txt|ico|htm|html|js|css)$ {
break;
}
参考) ピンで動かす場合の設定
サブディレクトリではなく以下の用にメインディレクトリ(?)でアクセスする場合にはこの様に設定します
http://localhost:8000
docker-compose.yaml
version: '3'
services:
nginx:
image: nginx:latest
ports:
- '8000:80'
depends_on:
- php-fpm
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- .:/var/www/html
php-fpm:
image : php:8.0-fpm
volumes:
- .:/var/www/html
default.conf
server {
listen 80;
root /var/www/html/public;
index index.php index.html index.htm;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}