Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

162 views

Published on

Magento Meetup Tokyo 14で使用した、Magento2のメンテナンス画面についての資料です。

Published in: Internet
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Meetup Tokyo #14 メンテナンス画面を極める
  2. 2. メンテナンス画面の場所 • pub/errors以下に配置 • defaultが標準デザイン
  3. 3. メンテナンス画面のカスタマイズ 1. local.xml.sampleをコピーし、local.xmlにリネーム 2. skinタグの値を変更 3. skinタグの値と同じ名前のディレクトリを作成 4. CSS,JS,テンプレートを配置
  4. 4. 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>
  5. 5. 気をつけたいこと • ドキュメントルートがpubの場合は正しく動かない – processor.phpのERROR_DIR定数を書き換える • 複数のメンテナンス画面デザインは作れない – design.xmlとlocal.xmlしか読まない
  6. 6. メンテナンスモード • モードを有効にする – php bin/magento maintenance:enable • モードを無効にする – php bin/magento maintenance:disable • 許可IPを設定する – php bin/magento maintenance:allow-ips [IPアドレス] • 状態のチェック – php bin/magento maintenance:status
  7. 7. 許可IP • var/.maintenance.ip にカンマ区切りで列挙 – 1行で書くこと。改行すると読んでくれない • 実はコマンドを叩かなくても書けば要はOK
  8. 8. アクセス許可IPの罠 • メンテナンスモードの判定は、 $_SERVER[‘REMOTE_ADDR’]を見てい る
  9. 9. MagentoFrameworkAppBootstrap.php protected function assertMaintenance() { ~中略~ $this->maintenance = $this->objectManager ->get('MagentoFrameworkAppMaintenanceMode'); $isOn = $this->maintenance->isOn(isset($this->server['REMOTE_ADDR']) ? $this->server['REMOTE_ADDR'] : '’ ); ~中略~ }
  10. 10. __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; }
  11. 11. 実は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 = MagentoFrameworkAppBootstrap::create(BP, $params); /** @var MagentoFrameworkAppHttp $app */ $app = $bootstrap->createApplication('MagentoFrameworkAppHttp'); $bootstrap->run($app);
  12. 12. よく読むとこうだった /** * 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); }
  13. 13. ロードバランサの罠 • ロードバランサやリバースプロキシは REMOTE_ADDRを改変する • X-HTTP-FORWARDED-FORに実際のクライアントIPを 格納している
  14. 14. 再確認 • MagentoはREMOTE_ADDRを見る • LBやRPのREMOTE_ADDRはクライアントのIPにあら ず • 見るべきはX-HTTP-FORWARDED-FOR
  15. 15. X-HTTP-FOREARDED-FORの罠 • 入っているIPが1個とは限らない • プロキシなどを多段経由する場合、経由したIPが 全部入っていることがある
  16. 16. 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" );
  17. 17. Apacheの場合 • mod_remoteipを使う • apacheのconfに”RemoteIPHeader X-Real-IP”を追記
  18. 18. Nginxの場合 • HttpRealipModuleを使う • real_ip_header X-Real−IP;
  19. 19. まとめ • M2もエラー画面はカスタム可能。 • メンテモードの除外IPはネットワーク構成をよく見て 調整する • 調整の仕方がまずいとメンテモードがかからなかっ たり、除外されるはずの人が除外されない

×