⓪LaravelをNginxでサブディレクトリに置いて動かす

2022年9月10日

できるだけ、既存の環境は変えずに、ドメインのルート以下にある特定のディレクトリをLaravelのルートとして扱いたい。

前提

Nginxphp-fpmとかは既に入っていて、PHPを動かせる環境は既にできているものとする。

Composerのインストール

公式ページ(https://getcomposer.org/download/)のコマンドを実行

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/bin/composer

Laravelのプロジェクトを作成

作成場所は、/var/www/html/hoge/laravel_appとしておく。

cd /var/www/html/hoge
composer create-project --prefer-dist laravel/laravel laravel_app

Nginxの設定

server {
    listen 80;
    listen       443 ssl;
    server_name  hoge.com;

    #ssl on;
    ssl_certificate      /etc/letsencrypt/live/hoge.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/hoge.com/privkey.pem;

    root   /var/www/html/hoge;
    index  index.html index.htm index.php;

    location ~ ^/laravel_app((/)?(.+))?$ {

        root /var/www/html/hoge/laravel_app/public;

        try_files $1 /laravel_app/index.php?$query_string;

        location ~ ^/laravel_app/index.php$ {
            include fastcgi_params;
            #try_files                $uri = 404;
            include                  fastcgi_params;
            fastcgi_param            SCRIPT_FILENAME $document_root/index.php;
            fastcgi_param            PATHINFO        $fastcgi_path_info;
            fastcgi_param            PATH_TRANSLATED $document_root$fastcgi_path_info;
            fastcgi_split_path_info  ^(.+¥.php)(/.+)$;
            fastcgi_pass            127.0.0.1:9000;
            fastcgi_index index.php;
        }
    }

    location ~ / {
        location ~ \.php$ {
            root           /var/www/html/hoge;
            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   127.0.0.1:9000;
        }
    }

    location /.well-known {
        root  /var/www/ssl-proof/rancher/;
    }
}

その他設定

cd /var/www/html/hoge/laravel_app
php artisan storage:link

権限とか

細かい部分はわからなかったので、とりあえずNginxにlaravel_app以下の権限を適当に付けておく。

sudo chown -R nginx laravel_app
sudo chgrp -R your_group laravel_app

注意

Laravelのlaravel_app/routes/web.phpとかをいじるとややこしくなるので、Laravelのトップページが表示されるまでは触らない。

つまりデフォルトの

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

のままで、Nginxの設定さえできていればhttps://hoge.com/laravel_app/にLravelのトップページが表示される。

間違っても、Route::get('laravel_app', function ()みたいなことはしなくて良い。