どーも!
たかぽんです!
今回はLaravelにあるという...
メンテナンスモードと言われるモードについて調べてみようと思います!
目次
メンテナンスモードって?
メンテナンスモードはLaravelで作ったページを一時的にメンテナンスしたい場合などに使うことを想定された機能です。
例えば、
新規機能を追加する際、大きなリスクが見込めるので、本番でも動作確認したい!
けど、やっぱり顧客がアクセスしている間に本番で動作確認するのは怖いよなぁ...
だったり...
サービスに重大な障害が生じてしまった...!
このまま動かしてしまうとたくさんのユーザーに影響がでてしまう!
といった場合などに一時的にサービスを停止させ、アクセスしてきたユーザーにメンテナンス中です!
ってお伝えできると嬉しいですよね。
そんな局面に対応できるのがこのメンテナンスモードです。
本来なら、リダイレクトという、あるURLにアクセスしようとした場合、別のURLへアクセスさせるという処理を追加し、メンテナンス用の表示画面を用意してそのURLへアクセスするように誘導させることによって、上記のような対応を行います。
Laravelではそれらを一から作らずとも楽にやることができるようになっているんです!
便利ですね!
それでは早速みていきましょう!
メンテナンスモードにしてみる
さて、本記事ではLaravelの環境構築を終えた状態を想定しています。
もしもまだ終えていない方は以下をご参考にLaravelが使えるようにしてから確認をしてみてください。
より理解しやすくなると思います。
それではまずはメンテナンスモードにしてみます。
メンテナンスモードにする前にlaravelを動かしておかないとけませんので、動かします。
"php artisan serve"コマンドで起動しておきましょう!
Takapon:MyProject taka$ php artisan serve
Laravel development server started: http://127.0.0.1:8000
[Fri Mar 27 00:26:21 2020] 127.0.0.1:60601 [200]: /favicon.ico
[Fri Mar 27 00:30:50 2020] 127.0.0.1:61569 [200]: /favicon.ico
[Fri Mar 27 00:31:10 2020] 127.0.0.1:61654 [200]: /favicon.ico
プロジェクトフォルダ(筆者の場合はMyProject)で行わないとうまく起動できないのでお気をつけください。
起動ができたら、一度画面をみてみます。
以下のURLへアクセスしてみてください。
上記のような画面が出てくれば動いています。(筆者は初期状態から一部入力やボタンが増えてます)
自身でページを作っているかたは自分のページが表示されていれば大丈夫です。
では、アクセスできる状態からメンテモードへ移行させてみます。
では、php artisan down
コマンドを入力してみます。
Takapon:MyProject taka$ php artisan down
Application is now in maintenance mode.
メンテナンスモードになったよ〜って出てますね!
では、このまま先ほどと同じ画面へアクセスしてみます。
サービスは使用不可能ですというメッセージと共にHTTPステータス"503"が返ってきてますね!
このステータスは"一時的にサーバーにアクセスできないこと"を表しています。
このステータスが帰ってきたらサービスのサーバーが何かおかしいorメンテしてるんだな?っていうのがわかるわけです。
この状態で改修を行ったり、障害発生時のさらなるユーザーへの影響を阻止できるわけです!
では戻しましょう。
以下のコマンドでメンテナンスモードから復帰することができます。
Takapon:MyProject taka$ php artisan up
Application is now live.
いま生きてるよ〜って出てますね!
これで再度先ほどの画面へアクセスすれば元の画面が表示がされます。
メッセージを変える方法!
さて、せっかくメンテナンス画面を表示できましたが、表示される文字が素っ気ないですね...
"Service Unavairable"とでかでかと...
これ、変えちゃいましょ!w
方法はとっても簡単です!
メンテナンスモードへ入るコマンドにオプションをつけてあげるだけです。
試しに以下のようにしてみます。
php artisan down --message="メンテ中だよ〜!"
先ほどのコマンドに--message="メンテ中だよ〜!"
を追加しただけですね。
実行した後に画面をみてみると...?
お、変わりましたw
ふざけてますねw
でもとっても簡単にメッセージを変えることができました!
retryをセットする
さて、それでは次にretryというオプションについて触れておきます。
メンテナンスに入る際、さらにretryの時刻を設定することができます。
以下のコマンドを実行してみましょう!
php artisan down --message="メンテ中だよ〜!" --retry=60
この値、結果的にはHTTPヘッダーのretry-after
の値として設定されるらしいです。
では開発者ツールを開きつつ、いつもの画面へアクセスしてみます。
開発者ツールは"右クリック->Inspect(英語版)"から開くことが可能です。
option + command + iでも開くことが可能です。
開いたら画像のようにNetworkタブを開いて、画面を一度更新しなおします。
上記のlocalhost
と503
が表示されていればOKです。
ではさらに赤字の部分をクリックしてみます。
下の方へいくと...retry-after=60
になっていました!
ちゃんと値が入っているのは確認できましたが...HTTPヘッダーのretry-after
とはなんでしょうか・・・?
詳しくは以下が参考になります。
レスポンス HTTP ヘッダーは、ユーザーエージェントがフォローアップリクエストを行う前にどれくらい待つべきかを示します。
MDN WebDocks
ふむ。
つまり、接続ができずになんらかのエラーが発生し、"フォローアップリクエスト"="再度接続を試みること"をするまで、どれくらい待てばいいのか?を表しているそうです。
さらに、大まかには前述した通りですが、HTTPレスポンスコードによって多少意味合いが変わってくるそうですね。
MDN WebDocks
503
(Service Unavailable) レスポンスで送信された場合、これはサービスが利用できないと予想される期間を示します。
つまり、今回のretryオプションに関してはあとどれくらいの時間サービスを停止する予定なのかをセットするのが良さそうですね。
そしてさらにさらに...
Retry-After: <http-date>
MDN WebDocks
Retry-After: <delay-seconds>
こうあるので、普通に数字を入れると秒数を表すことになるようです。
先ほどの例では60を入れたので、あと60秒でメンテ終わるぜ!って伝わる...ということですねw
だから、伝えられた側はOK!60秒待ってまたくるわ!ってなるわけです。
日付でもできるのか試してみましたが、筆者では探しきれず...
一応, 上記MDNにあった"Wed, 21 Oct 2015 07:28:00 GMT"
や、mon,1004202012:00:00GMT
は通用しませんでした...orz
時間分、日数分の秒数を入れる等すればまぁ対応はできなくは無いのかな・・・?
メンテ中にアクセスできるようにする!
さて、前にちらっとお話ししましたが、改修等の動作確認を本番で行いたかった場合があったとして、メンテナンスモードにしてしまうと、開発者もアクセスできなくなりますね...w
いや、メンテ中ってしってるがな!wって。
そう行った状況にも対処できるよう、一部の人はメンテ中でもアクセスできるようにする方法が用意されています。
試しに以下のコマンドを実行してみましょう。
Takapon:MyProject taka$ php artisan down --allow=127.0.0.1
Application is now in maintenance mode.
ちゃんとメンテナンスモードになっていますね!
しかしながら...?
アクセスできちゃいます!
IPアドレスを--allow
で指定してあげればそのIPアドレスの人は閲覧することができるんです。
IPアドレスについての解説は割愛しますが、簡単に言うと、今回は自分自身がアクセスできるように設定したので、自分では閲覧することができたわけですね。
あたりまえですけども。
もっとページをカスタマイズしたい!
先ほどメッセージは変えましたが、やっぱり味気ないですよね...
そんな時は以下のファイルを書き換えればOK...と思ったんですが...
MyProject/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/503.blade.php
実はこれは書き換えは推奨ではありません。
確かにこのファイルを書き換えることで、表示も変わるんですが...
一応、中身はこんな感じです。
@extends('errors::minimal')
@section('title', __('Service Unavailable'))
@section('code', '503')
@section('message', __($exception->getMessage() ?: 'Service Unavailable'))
'503'の部分を'5033'にでもしてみてください。
メンテナンスモードの表示画面も変わると思います。
が...。
公式リファレンスをみるに、ちゃんとそう言うページを作るんだったらこうしてな!っていうのが書かれていました。
どうやら、以下のファイルを書き換えればいいそうです。
resources/views/errors/503.blade.php
と思ったんですが、最初このファイルどころか、errorsというディレクトリすら存在していないんですね...w
なので先ほどあげた503.blade.phpと間違えてて、え?公式ミスってね?ってなってました..w
resourcesの下にあるviewsまではみなさんも有ると思います。
さらにその下にerrorsディレクトリを作成し、その中に503.blade.phpと言う名前のファイルを作成しましょう!
そして、中身を適当に書いてから確認をすると、いい感じに書き換わるはずです!
<p>テスト</p>
上記でセーブ後、メンテナンスモードの画面を確認したら...
よしなにこのbladeが存在していたらみてくれるようになってるっぽいですね!(深追いはしませんが!
あとは好きにカスタマイズしていってください!.
downを何度しても反映されない!?
さて、最後に上記内容を実行していてもしかしたらメンテナンスモードのコマンドに何度も打ってるんだけど、全然メッセージとかretryとか変わらないんだけど!?
って言う方いらっしゃるかもしれません...
メンテナンスモードのままメンテナンスモードのコマンドを打っても、それは反映されません。
一度メンテナンスモードを復帰させ、再度メンテナンスモードへ移行することで反映されるはずです。
僕も最初そうなりましたw
また、ちょっとした小話をしておくと、Laravelのサーバーを落としてしまうと、メンテナンスモードにしていたとしても、画面が表示されなくなります。
落としたあと、再起動すると、ちゃんとメンテナンスモードのままですが、メンテナンス中に一度Laravelのサーバーを落とす必要が出る場合等は気をつけたほうがいいかもしれません。
まとめ
さて、今回はメンテナンスモードについてみていきました!
正直企業レベルならこのデフォルト機能を使うより、多少手間はかかってもルートを書き換える等して対処したほうが自由度が高いかもしれませんね。
ただし、個人開発レベルならわざわざそこまでする必要はない場合が多いでしょう。
本機能を存分に使ってみてもいいのかなと思います。
それでわ!