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;
    }
}

参考サイト