Magento Meetup Tokyo 14 〜メンテナンス画面を極める

Preview:

Citation preview

Meetup Tokyo#14

メンテナンス画面を極める

メンテナンス画面の場所

• pub/errors以下に配置

• defaultが標準デザイン

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

1. local.xml.sampleをコピーし、local.xmlにリネーム

2. skinタグの値を変更

3. skinタグの値と同じ名前のディレクトリを作成

4. CSS,JS,テンプレートを配置

local.xml

<?xml version="1.0"?><config>

<skin>sample</skin><report>

<action>print</action><subject>Store Debug

Information</subject><email_address></email_address><trash>leave</trash>

</report></config>

気をつけたいこと

• ドキュメントルートがpubの場合は正しく動かない

– processor.phpのERROR_DIR定数を書き換える

• 複数のメンテナンス画面デザインは作れない

– design.xmlとlocal.xmlしか読まない

メンテナンスモード

• モードを有効にする– php bin/magento maintenance:enable

• モードを無効にする– php bin/magento maintenance:disable

• 許可IPを設定する– php bin/magento maintenance:allow-ips [IPアドレス]

• 状態のチェック– php bin/magento maintenance:status

許可IP

• var/.maintenance.ip にカンマ区切りで列挙

– 1行で書くこと。改行すると読んでくれない

• 実はコマンドを叩かなくても書けば要はOK

アクセス許可IPの罠

• メンテナンスモードの判定は、$_SERVER[‘REMOTE_ADDR’]を見ている

Magento\Framework\App\Bootstrap.php

protected function assertMaintenance(){

~中略~

$this->maintenance = $this->objectManager->get('Magento\Framework\App\MaintenanceMode');

$isOn = $this->maintenance->isOn(isset($this->server['REMOTE_ADDR']) ? $this->server['REMOTE_ADDR']: '’

);

~中略~}

__constructで設定しているが・・・

/*** Constructor** @param ObjectManagerFactory $factory* @param string $rootDir* @param array $initParams*/

public function __construct(ObjectManagerFactory $factory, $rootDir, array $initParams){

$this->factory = $factory;$this->rootDir = $rootDir;$this->server = $initParams;

}

実はindex.phpで設定

$params = $_SERVER;$params[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] = [

DirectoryList::PUB => [DirectoryList::URL_PATH => ''],DirectoryList::MEDIA => [DirectoryList::URL_PATH => 'media'],DirectoryList::STATIC_VIEW => [DirectoryList::URL_PATH => 'static'],DirectoryList::UPLOAD => [DirectoryList::URL_PATH => 'media/upload'],

];$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params);/** @var \Magento\Framework\App\Http $app */$app = $bootstrap->createApplication('Magento\Framework\App\Http');$bootstrap->run($app);

よく読むとこうだった/*** Static method so that client code does not have to create Object Manager Factory

every time Bootstrap is called** @param string $rootDir* @param array $initParams* @param ObjectManagerFactory $factory* @return Bootstrap*/

public static function create($rootDir, array $initParams, ObjectManagerFactory $factory = null){

self::populateAutoloader($rootDir, $initParams);if ($factory === null) {

$factory = self::createObjectManagerFactory($rootDir, $initParams);}return new self($factory, $rootDir, $initParams);

}

ロードバランサの罠

• ロードバランサやリバースプロキシはREMOTE_ADDRを改変する

• X-HTTP-FORWARDED-FORに実際のクライアントIPを格納している

再確認

• MagentoはREMOTE_ADDRを見る

• LBやRPのREMOTE_ADDRはクライアントのIPにあらず

• 見るべきはX-HTTP-FORWARDED-FOR

X-HTTP-FOREARDED-FORの罠

• 入っているIPが1個とは限らない

• プロキシなどを多段経由する場合、経由したIPが全部入っていることがある

Varnishで最初のだけいただく

std.collect(req.http.x-forwarded-for);set req.http.X-Real-IP = regsub ( req.http.x-forwarded-for, "^(([0-9]{1,3}\.){3}[0-9]{1,3})(.*)", "\1" );

Apacheの場合

• mod_remoteipを使う

• apacheのconfに”RemoteIPHeader X-Real-IP”を追記

Nginxの場合

• HttpRealipModuleを使う

• real_ip_header X-Real−IP;

まとめ

• M2もエラー画面はカスタム可能。

• メンテモードの除外IPはネットワーク構成をよく見て調整する

• 調整の仕方がまずいとメンテモードがかからなかったり、除外されるはずの人が除外されない

Recommended