Magento Meetup Tokyo 14 〜メンテナンス画面を極める
-
Upload
hirokazu-nishi -
Category
Internet
-
view
98 -
download
4
Transcript of Magento Meetup Tokyo 14 〜メンテナンス画面を極める
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はネットワーク構成をよく見て調整する
• 調整の仕方がまずいとメンテモードがかからなかったり、除外されるはずの人が除外されない