Laravelでメンテナンスモード(503)

2018/05/22

Laravel ではデフォルトでメンテナンスモードが装備されています。

メンテナンスモードの実行は artisan コマンドで実行します。

 
 php artisan down
 

 
実行結果

メンテナンスモードから通常モードに戻すときは

 
 php artisan up
 

 
実行結果

簡単ですね。このように Laravel では即時にメンテナンス画面に切り替える仕組みが用意されています。

今回はここから一歩先に進んで

・指定したIPアドレスだけメンテナンス画面をスキップ
・メンテナンス画面のカスタマイズ

をやりたいと思います。

 

指定したIPアドレスだけメンテナンス画面をスキップ

メンテナンス画面を表示するときはシステムの改修作業をするときですね。

このときに開発チームだけ普通の画面が閲覧できると便利です。

 

手順

1)ミドルウェアの作成
2)ミドルウェアの編集
3)カーネルの登録
4)動作確認

 

1)ミドルウェアの作成

メンテナンスモードはミドルウェアでやっています。

デフォルトのクラスは

vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php

です。

このクラスをカスタマイズすればいいわけですね。

ただ、 vendor 以下は勝手に編集してはいけないというのが常識なので、このクラスをオリジナルのミドルウェアとして作成します。

artisanコマンドでミドルウェアを作成。

 
 php artisan make:middleware CheckForMaintenanceMode
 

上記のコマンドを実行すると

App/Http/Middleware/CheckForMaintenanceMode.php

が作成されます。

中身は空っぽですがミドルウェアに最低限必要なコードは記述されています。

これを編集していきます。

 

2)ミドルウェアの編集

オリジナルのクラス(vendor/...checkForMaintenanceMode.php)をコピペします。

503 に投げる処理の前にif文を記述。

指定されたIPアドレスはスキップされるように記述します。

 
/*
 * CheckForMaintenanceMode.php
 * オリジナル:\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode
 */
namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Foundation\Application;
use Symfony\Component\HttpKernel\Exception\HttpException;

class CheckForMaintenanceMode
{
/**
* The application implementation.
*
* @var \Illuminate\Contracts\Foundation\Application
*/
protected $app;
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @return void
*/
public function __construct(Application $app)
{
$this->app = $app;
}

/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// ここにアクセス許可したいIPアドレスを書く。複数の場合は['hoge','hoge']のように区切る
$allow = ['xxx.xxx.xxx.xxx']; 

if ($this->app->isDownForMaintenance()) {
if (!in_array($request->getClientIp(), $allow)) {
throw new HttpException(503);
}
}

return $next($request);
}
}
 

 

3)カーネルの登録

オリジナルをコメントアウトして、かわりに今回カスタマイズしたミドルウェアをカーネルに登録。

 
 # app/Http/Kernel.php
:
protected $middleware = [
// \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\CheckForMaintenanceMode::class, // メンテナンスモードで特定アドレスのアクセスを許可
];
:
 

 

4)動作

artisanコマンドでメンテナンスモードを実行してみます。

クロームを開いてアクセス

通常の画面が表示されています。(※アクセス許可したいIPアドレスを設定した為)

次にプロクシを設定してIPアドレスを変えてみます。

もう一度アクセスしてみます。

メンテナンスモードになっているのが確認できました。

 

メンテナンス画面のカスタマイズ

メンテナンス画面をカスタマイズしてみます。

メンテナンス画面を起動すると

resources/view/errors/503.blade.php

このファイルが表示される仕組みになっています。

なのでこのファイルを編集します。

警告せっかくなのでWEBフォントを使用してみました。
Google Fontsの使い方【2018年版】

<!-- resources/view/errors/503.blade.php -->
<!DOCTYPE html>
<html>
<head>
<title>ただいま、メンテナンス中です。</title>
<link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css">

<style>
html, body {
height: 100%;
}

body {
margin: 0;
padding: 0;
width: 100%;
color: #B0BEC5;
display: table;
font-weight: 100;
font-family: 'Lato';
}

.container {
text-align: center;
display: table-cell;
vertical-align: middle;
}

.content {
text-align: center;
display: inline-block;
}

.title {
font-size: 60px;
margin-bottom: 40px;
}
</style>
</head>
<body>
<div class="container">
<div class="content">
<div><img src="{{ \Config::get('app.mediaPATH') }}resource/image/common/logo.png" width="500" height="200"></div>
<div class="title">ただいま<br>メンテナンス中です<br></div>
</div>
</div>
</body>
</html>

 
メンテナンスモードを実行すると以下のように表示されます。

以上です。

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-実践知識