【2025年版】Laravelアプリをさくらのレンタルサーバで本番運用する実践手順

はじめに

記事の概要

Laravelで開発したアプリを本番公開するとき、スモールスタートしたい場合やなるべくインフラ管理費を抑えたい場合において、AWSのEC2やGoogleのGCEをつかうのではなく、従来型のレンタルサーバーでの運用がベストであることもあります。

この記事では日本でレンタルサーバーを使ってLaravelアプリを公開する実践的な方法として、さくらインターネットの「さくらのレンタルサーバ」を使って実際にアプリを公開する手順を紹介します。

レンタルサーバーに求められる要件

レンタルサーバーは一般的にWordPressが動作する要件を満たしているので、Laravel動作に必要なPHPやMySQLは使えます。現実的にLaravelで構築したアプリを公開するには、これに加えて以下を満たす必要があります。

  • ドキュメントルートフォルダを指定できること
  • SSH接続できること
  • Composerが使えること
  • node.jsとnpmが使えること(Laravel11デフォルト状態ではnode.js 18, 20, 22をサポート)
  • Gitが使えること(必須ではないものの、実践ではほぼ必須)

さくらのレンタルサーバは上記の要件を満たします。

この記事ではさくらのレンタルサーバのプランのうち、「ビジネスプロ」プランを使っています。

【注意】2025年1月時点、ライトプランではSSH接続ができないためLaravelが使えません。

サーバー環境の構築

レンタルサーバーを契約

まずは「さくらのレンタルサーバ」を契約し、コントロールパネルに入れる状態にします。

SSH接続

「SSHを利用したい」(さくらのサポート情報)を参考に、SSH接続できる状態にします。

この記事ではPuttyを使いますが、もちろんOSのターミナルソフトや他のターミナルソフトを使っても問題ありません。

ここから先はbashを使う

さくらのレンタルサーバの初期状態では、Laravelに必要なComposerやnpmが使えません。ここから先の作業でそれらを準備するのですが、ログイン直後のcshではそれができない部分があるので、bashを使います。

% bash

nodenvのインストール

Laravelで必要なnpmを使うためnode.jsをインストールするのですが、node.jsのバージョン管理ができるようにするためnodenvをインストールし、nodenvでnode.jsをインストールするアプローチを取ることにします。(バージョン番号は最新にするといいでしょう)

ユーザーごとにインストールし、シェルごとに呼び出すので、サーバーグローバルのインストールとならずレンタルサーバーでの利用にあった形態です。

$ curl -fsSL https://github.com/nodenv/nodenv-installer/raw/HEAD/bin/nodenv-installer | bash

これでnodenv自体は.nodenvフォルダ内にインストールされました。ただし(インストール完了メッセージにも出ている通り)bashのプロファイルに追記が必要なので、.bashrc.profileからコピーして作成し、viなどで.bashrcに以下を追記します。

$ cp .profile .bashrc

追記内容は以下です。

export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init - bash)"

bashを再起動して、nodenvが使える状態にします。nodenv -vのあとにバージョン表示が出たらOKです。

$ exit
% bash
$ nodenv -v

node.jsのインストール

続いてnode.jsのインストールです。今回はv20のLTSを入れます。

nodenvはデフォルトで/tmpフォルダを作業に使いますが、これはシステムのフォルダなのでレンタルサーバーユーザーは使えません。そこでユーザーフォルダ内にtmpフォルダを作ってそれを利用するように指定するため、環境変数TMPDIR~/tmpを設定します。

またこの処理はとても重いため、レンタルサーバーの他のテナントに迷惑をかけないようにnice -n 20をつけてプロセス優先度を低くします。この処理は20分くらいかかります。

$ export TMPDIR=~/tmp
$ nice -n 20 nodenv install 20.9.0

ローカルでnode.jsの上記インストールバージョンを使うように指定します。

$ nodenv local 20.9.0

バージョン確認コマンドでnpmが使えることを確認します。

$ npm -v

Composerのインストール

Composerもユーザーフォルダにインストールします。Download Composerページにインストールスクリプトがあるので、これを~/内で実行します。

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

最終的に、~/composer.pharファイルが配置されます。これがComposer本体です。

このユーザーのみbashで使えるようにするため、~/.composerフォルダに入れてパスを通します。同時に拡張子をなくします。

mv composer.phar ~/.composer/composer

.bashrcへの追記内容は以下です。

export PATH="$HOME/.composer:$PATH"

bashを再起動して、Composerが使えるか確認します。

$ exit
% bash
$ composer -V

gitの確認

さくらのレンタルサーバではgitが最初から使えますが、念の為確認しておきます。

$ git --version

Laravelアプリのインストール

ドメインとドキュメントルートの設定

公開用に使うドメイン名を決定したら、サーバーコントロールパネルで登録します。ここでは「sakura-laravel.mirai-it.com」とします。

登録するドメイン名がさくらインターネットで管理されているものかどうかにより登録方法が違いますが、画面の説明に従って登録を完了します。

他社で管理しているドメイン名を使う場合、他社の管理画面等のDNS設定で、Aレコードを追加し、サーバーのIPアドレスを設定するのが良いでしょう。

追加したドメイン名の基本設定を開き、Web公開フォルダを「(~/www)/[ドメイン名]/public/」とします。最後につける/publicフォルダは、Laravelの公開フォルダ名に合わせています。

MySQLデータベースの作成

Webサイト/データ → データベースの画面で、データベースを新規作成します。

データベースサーバー名(ホスト名)は、作成後に表示されます。

Laravelアプリの設置

この記事では実践時に多いパターンとして、LaravelアプリをGitHubに登録している状態からそれをCloneして設置する方法を取りますが、FTPで同様の操作を行っても問題ありません。

この記事ではLaravelアプリのサンプルとして、私がGitHubに公開したLaravel11サンプルリポジトリを使います。

まずはbashで、プロジェクトフォルダを作ります。プロジェクトフォルダは、ドキュメントルートを「~/www/[ドメイン名]/public/」としたので「「~/www/[ドメイン名]」となります。

$ cd ~/www
$ mkdir sakura-laravel.mirai-it.com

このフォルダにアプリをCloneします。リポジトリのアドレスはGitHubで取得します。

$ git clone "https://github.com/hitotch/laravel11-sample-ja.git" "sakura-laravel.mirai-it.com"

Cloneが終わると、~/www/sakura-laravel.mirai-it.comフォルダ内に以下のようにアプリが設置されます。

Laravelアプリの初期設定

まずはアプリが依存するライブラリをインストールします。bashでプロジェクトフォルダに移動し、以下のようにcomposerとnpmで実施します。

$ composer install
$ npm install

引き続きLaravelアプリの動作に必要な設定を行います。ここでは、Laravel11サンプルリポジトリのREADME.mdに記載されている中でDocker関連以外の設定を続けます。

$ cp .env.example .env
$ vi .env

.envに追記する内容は以下です。

SESSION_SECURE_COOKIE=true

DB_CONNECTION=mysql
DB_HOST=[DB作成時に取得したホスト名]
DB_PORT=3306
DB_DATABASE=[DB作成時に指定したDB名=ユーザー名]
DB_USERNAME=[DB作成時に指定したユーザー名=DB名]
DB_PASSWORD=[DB作成時に指定したパスワード]

※SSL証明書を設定していない場合は、SESSION_SECURE_COOKIEをfalseにしないとLaravelが正常動作しません。

$ php artisan key:generate
$ php artisan storage:link
$ php artisan migrate
$ php artisan db:seed

フロントのコンパイル

フロントをコンパイルする場合、viteならnpm run build、laravel-mixならnpm run prodを実行しますが、コマンドのCPU使用率が高くなるのでレンタルサーバー本体からプロセスがKillされます。

これを回避するため、レンタルサーバーの他のテナントに迷惑をかけないようにnice -n 20をつけてプロセス優先度を低くします。

$ nice -n 20 npm run build

動作確認

ブラウザでドメイン名にアクセスすると、アプリの動作を確認できます。

初期ドメインでアクセスできなくする

動作設定は完了しましたが、このままだとさくらのレンタルサーバが最初に提供する初期ドメイン名で設定ファイル「.env」等にアクセスできてしまいます。DBのパスワード等が丸見えの状態なので、このままでは重大なセキュリティ事故を起こしてしまいます。

これを回避するため、初期ドメインにアクセスがあった場合は404 Not foundを表示するようにします。~/wwwフォルダ直下に以下の内容で.htaccessファイルを作成します。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^.*\.sakura\.ne\.jp
RewriteRule ^.*$ - [R=404,L]

.envにアクセスして、ファイルの内容が表示されないことを確認します。

おわりに

Webアプリの本番環境は、AWSなどのクラウド環境が安易に選択されがちですが、さくらのレンタルサーバのようなWebアプリに特化したマネージドサーバーを使うことでサービスの品質を落とさずに運用コストやリソースを大幅に削減できる場合もあります。

この記事が読者のみなさんの選択肢を増やして、より効率的で楽な管理となるサービス運用が実現すればとても嬉しく思います。