1. Magento2のモードについて

Magento2には、defaultモード、developerモード、productionモードの、三つのモードがあります。

Magento2にモードがある? 三つのモード? と言われても、そんなことは寝耳に水だ、というかたもいるかもしれません。私自身、Magento2に「モード」があることは、Magento2をいじりはじめてから数カ月後に知りました。それまでは、Magento2に三つのモードが存在することなどまったく知らずに作業をしていました。

何をきっかけに「モード」の存在に気づいたのかというと、それは、ある日突然に、ということでもなく、なにかトラブルにぶつかって検索していると、’developer mode’ ‘production mode’ という言葉をよく見かけていたので、Magento2にはそういう「モード」というものがあるらしい、程度の認識はあったのだと思います。

いま最も鮮明に憶えているのは、defaultモードからdeveloperモードに変換した後、もう一度defaultモードに戻ることができなかったことです。defaultモードは、文字通り、デフォルトの状態でのみ可能なモードで、一度別のモードに変換すると、再びdefaultモードには戻せない、という、この事実を知った時は(大げさですが)衝撃的でした。

Why can’t one switch back to the default mode on Magento 2?
https://magento.stackexchange.com/questions/112523/why-cant-one-switch-back-to-the-default-mode-on-magento-2

上記のフォーラムでも、「defaultモードは、Magento2のインストール時のみで、一度モードを変換すると、もうdefaultモードには戻れない。戻る必要もないし、戻る方法もない」のようなことが書かれています。

つまり、cPanelからMagento2をインストールしたり、ComposerでMagento2をインストールしたり、あるいはファイルから手動でインストールしたり、そのインストールしたフレッシュな状態のMagento2は、おしなべてdefaultモードで、はじめてMagento2に触れる場合は、たいていはそのdefaultモードのままサイト構築の作り込みをしているのです。

話しが前後しましたが、私もやはりdefaultモードでサイト構築を進めていました。
Magento2には ‘developer mode’ や ‘production mode’ という「モード」があるらしいという認識は頭の片隅にありましたが、自分の作業しているMagento2がいまどのモード下なのかということに関しては、サイトの表示されないエラーに直面し、どうにも修復できない行き詰りの状況になるまで、きちんと確かめていませんでした。

Magento2が壊れた時、developerモードであれば、ブラウザにエラーログも表示され、バグの解消作業がやりやすい、と一般に言われています。
なので、私も、当面のエラー修復のヒントを得るために、Magento2をdeveloperモードに変換しようとしました。そして、その時になって、ふと「いま、一体なんのモードなんだろう」と、当たり前のような疑問を、ようやく実際に確かめることになったのです。

Magento2のモードを確認するには、二つの方法があり、一つは、/app/etc/env.php のファイルの中の、‘MAGE_MODE’ => ‘default’ で判明します。
もう一つの方法は、Magento2のルートで以下のコマンドを打ちます。

php bin/magento deploy:mode:show

そうすると、default / developer / production いずれかの回答が返ってきます。
その時、私に返ってきた答えは ‘default mode’ で、これで、私ははじめてdefaultモード(インストール時のデフォルト状態)の存在を知りました。

Magento2モード変更のコマンド

‘developer mode’ が「開発環境モード」で、 ‘production mode’が「製品モード(本番環境モード)」だろうことは容易に想像できます。それぞれのモードへは、以下のコマンドで変換することができます。

php bin/magento deploy:mode:set developer
php bin/magento deploy:mode:set production

モードの転換ができると、Enabled developer mode. のようなメッセージが表示されます。
ただし、先述したように、php bin/magento deploy:mode:set default と打っても、default modeに切り換えることはできません。上記の画像でも、Cannot switch into given mode “default” とエラーが出ています。一度defaultモードを離れたら、原則として、後はdeveloperモードで構築をつづけ、本番環境への移行時に、productionモードに変換することになります。

問題は、このモード変換が、Magento2の管理画面からの操作では不可能だということです。
Magento2系は「モード」を備え、あたかもユーザーの利便性を向上させたかのように見えますが、一般の運営者にとっては、この「モード」の存在は、単に面倒が増えただけとも言えます。車で言えば、ギアチェンジをするのに、わざわざボンネットを開けねばならないような使い勝手の悪さです。
ちょっと愚痴っぽくなってしまうのですが、この一点を見るだけでも(意図的なのかMagento社のリソース不足なのかは不明ですが)、いかに現行のMagento2が、運営者の視点を切り落としてリリースされているかが分かります。

もちろん、defaulモードのまま構築し、defaultモードのまま本番環境に移行することはできます。できますが、実際にdefaultモードのままでは(特に本番環境では)マイナス面が大きいと言えます。
次に、defaultモード、developerモード、productionモード、それぞれのモードの特徴を見てみます。

2. defaultモード/developerモード/productionモード

公式ドキュメントのAbout Magento modesにそれぞれのモードの説明があるので、簡単にまとめたいと思います。

defaultモード

  • 静的ファイルのキャッシュが有効になる。
  • 例外(エラー)メッセージは、ブラウザに表示されず、/var/reports/ のlogファイルに書き込まれる。
  • header内のカスタムX-Magento-*のhttpリクエストとその反応は隠れる。

developerモード

  • 静的ファイルのキャッシュが無効になる。
  • Verboseログが提供される。
  • 自動コードコンパイラが有効になる。
  • /var/reports/ 内のエラーリポートが詳細化し、エラーメッセージがブラウザにも表示される。
  • header内のカスタムX-Magento-*のhttpリクエストとその反応を表示する。
  • サイト全体のパフォーマンスは遅くなる。

productionモード

  • 例外(エラー)メッセージは、ブラウザに表示されず、/var/reports/ のlogファイルに書き込まれる。
  • 静的ファイルのキャッシュが有効になる(キャッシュのみになる)。
  • 自動コードコンパイラが無効になる。新しくアップデートされたファイルがシステムに書き込まれない。
  • Magento管理画面で、キャッシュの「有効/無効」の選択肢がなくなる。

また、前項で触れた Why can’t one switch back to the default mode on Magento 2? のページの画像を参照して、わかりやすい表にしてみます。

Magento2のモードの違い
機能 defaultモード developerモード productionモード
ブラウザでのエラー表示
自動コード生成
クラス定義 reflectionベース reflectionベース 事前コンパイル
静的ファイルのマテリアライズ シンボリックリンク 事前コンパイル
Configファイルの有効化
自動テーマ登録

ここで説明されていることは、正直、かなり難しいと感じる内容で、私もよく理解できていない項目もあるのですが、重要な点としては、各モードにより、Magento2の静的ファイル(Static View Files)の生成方法が違う、そのマテリアライズ(静的ファイルのMagntoファイルシステムへの書き込み)も違う、ということが挙げられます。
これはサイトの表示速度にも影響し、実際のファイル構造にも大きく関わることなので、Magento2でサイトを構築/運営するのなら、必ず押さえておくべきポイントになります。個人的には、defaultモードはサード、developerモードはセカンド、productionモードはトップ、というように、マニュアル車のギアチェンジを想像するとイメージが摑みやすいのではないかと思います。

また、developerモードは構築開発にふさわしい状態ですが、ブラウザからのアクセスにより、その度ごとに /pub/static/ 以下に静的ファイルのシムリンクが生成されているので、サイトのパフォーマンスが極端に低下します。なので、大きなバグやエラーに悩むことがないのであれば、defaultモードのまま構築作業を進め、本番環境への移行時に、直接、defaultモードからproductionモードへ切り換える手順をとっても、特に問題はないと思われます。

3. Magento2の静的ファイル(Static Files)の生成展開について

Magento2は、PHPという動的なプログラムで書かれていますが、ブラウザでの表示速度を最適化するために、画像やCSS、JSなどのファイルを、静的ファイルとして生成展開し、キャッシュする機能を備えています。そして、その展開されるファイル群は、/pub/static/ 以下のフォルダに配置されます。
静的ファイルの展開方法や、キャッシュの有無は、各モードにより、以下のような違いがあります。

defaultモード

  • SSHでのコマンドを実行しなくても、ブラウザからのリクエストによりファイル展開される。
  • /pub/static 以下の静的ファイルは、マテリアライズ化され、キャッシュされる。
  • 画像、CSSなどの編集後は、Static Fileのキャッシュをクリアしないと、変更が反映されない。

developerモード

  • SSHでのコマンドを実行しなくても、ブラウザからのリクエストによりファイル展開される。
  • /pub/static/ 以下の静的ファイルは、キャッシュされず、リクエストの度ごとにシムリンクが生成される。
  • 原則として、静的ファイルのキャッシュをクリアしなくても、変更が反映される。

productionモード

  • php bin/magento setup:static-content:deploy により、事前にファイル展開をする必要がある。
  • /pub/static/ 以下の静的ファイルは、オリジナルソースへの直接リンクにより生成される。
  • 画像、CSSなどの編集後は、php bin/magento setup:static-content:deploy のコマンドを実行しないと変更が反映されない。

default、developer、production と、モードによるファイルの生成の違いは、やや分かりづらい面があるのですが、developer が自動生成、productionは事前展開、defaultはその真ん中くらい、と、おおざっぱに摑んでおいてもいいのではないか、と私は思います。厳密には(defaultについては)間違いかもしれませんが、サイト運営者にとっては、何より、本番環境への移行局面が重要になるので、developerモードとproductionモードの違いは、必ず意識しておいてください。

各モードのファイル展開の違いについては、公式ドキュメントよりも、Which compilation commands are needed in developer mode and when? で明解に論じられていますので、詳しく調べたい場合には、こちらを土台にしてみてください。

重要なポイントは、本番のproductionモードにおいては、カスタマイズCSSの追加など、静的ファイルに変更があるような編集を行った後は、PuTTYなどでSSHアクセスをして、php bin/magento setup:static-content:deploy のコマンドで、ファイル展開を逐次行わないといけないという点です。defaultやdeveloperモードにおいては、静的ファイルをコマンドで展開させる必要はありません。しかし、productionモードに変換した後に、この展開コマンドを実行しないと、フロントのサイトに変更内容が反映されないのです。

英語以外の言語ロケールをインストールしている場合には、言語ロケール毎に展開コマンドの実行が必要になります。例えば、日本語ストアの静的ファイルを展開させるには、php bin/magento setup:static-content:deploy ja_JP を実行します。通常の展開コマンドの半角あとに、言語ロケールのコードを入力するかたちになります。言語ロケールについては、Magento多言語化のページ、もしくは、Magento2の日本語化の記事もご参照ください。

また、php bin/magento deploy:mode:set production のコマンドにより、はじめてMagento2をproductionモードに変更する際には、自動でファイル展開が行われます。しばらく時間がかかることが多いので、画面を見守っていてください。

productionモードに転換すると、サイト表示速度が、体感でも速くなったのが分かります。一方で、/pub/static/ 以下に、Magento2のすべての静的ファイルが言語ロケール毎に配置されるので、サーバーのディスク使用量が急激に上昇します。特に、マルチストア構成にしている場合、また、CMSページ数や画像数が多い場合は、この点もご留意ください。