Magentoを本格的な構成で運用する〜後編〜

前回はMagentoを本格的に運用するための構成について解説しました。
今回は前回の内容を踏まえ、実際に環境を作ってみましょう。

今回の構成について

今回構築する構成は、

  • WebサーバーとDBサーバーをそれぞれ1台
  • スイッチ1台
  • DBサーバーにはグローバルIPアドレスを付与しない
  • DBサーバーへはWebサーバーを経由してアクセスする

というものです(下図参照)。今回は最小コストのケースをご紹介したいと思います。

まずはWebサーバーを作成

最初にWebサーバーを作成します。スタートアップスクリプトを使うと楽ができるので、「第2回 Magentoをインストールしてみよう」を参考にしてWebサーバーを作成しておきます。

ただし、スタートアップスクリプトが対象にしているのはWebサーバーとDBサーバーが同居する構成です。今回はWebサーバーとDBサーバーは独立したサーバーとして構築するので、スタートアップスクリプトで作成したWebサーバーに対して以下の作業が必要になります。

  • ネットワーク周りの調整
  • データベースの内容を移設する作業
  • MySQLを取り除く作業

スイッチの追加とWebサーバーの調整

Webサーバーが起動したら、さくらのクラウドの管理画面からスイッチを選択し、追加します。名前やアイコンは適宜設定してください。

このスイッチにWebサーバーとDBサーバーを接続し、通信できるようにします。

WebサーバーにNICを追加する

次にWebサーバーにNICを追加します。さくらのクラウドのマニュアル「NICの追加と削除」を見ながら追加しましょう。スイッチに接続する側のNICに付与するIPアドレスとサブネットマスクはプライベートIPアドレスの範囲で設定してください。ここで設定した内容はDBサーバーの作成時にも使用しますので、忘れずにメモしておきましょう。

さて、NICの追加ができたらWebサーバーを起動し直します。起動後にNICが正しく認識されているか、IPアドレスを持っているかを確認しましょう。もしNICが認識されない場合や、IPアドレスを持っていない場合は、/etc/networking/interfacesなどの定義を確認してみてください。

Webサーバーの設定を調整する

いまのままではDBサーバーを作成しても、DBサーバーは外部に通信ができません。DBサーバーを作成する前にWebサーバー側の設定を調整しておきましょう。

IPフォワードを有効にする

WebサーバーをDBサーバーからみた中継サーバーにするために、/etc/sysctl.confに以下の定義を追加します。

net.ipv4.ip_forward = 1

編集が終わったら、

sudo sysctl -p

で反映しておきます。

パケット転送の定義をする

IPフォワードの設定だけでは不十分なので、iptablesを用いてパケット転送の定義を行います。下記の内容のファイルをWebサーバー上に作成し、sudoコマンドで実行してください。

#!/bin/bash
internal_net='192.168.1.0/24'
my_internal_ip='192.168.1.1'
local1='192.168.0.0/16'
local2='127.0.0.0/8'
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -s $internal_net -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s $internal_net -j MASQUERADE
iptables -A OUTPUT -o eth0 -d $local1 -j DROP
iptables -A OUTPUT -o eth0 -d $local2 -j DROP
iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A INPUT -f -j DROP
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -d 224.0.0.1 -j DROP
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -N LOGGING
iptables -A LOGGING -j LOG --log-level warning --log-prefix "DROP:" -m limit
iptables -A LOGGING -j DROP
iptables -A INPUT -j LOGGING
iptables -A FORWARD -j LOGGING
iptables-save
exit 0

実行できたら、iptablesを起動し、ついでにOSのリブート時にも起動するようにしておきましょう。Ubuntu Linuxの場合は、

sudo apt-get install iptables-persistent

で、iptablesの設定を永続化できるようにします。インストールできたら、

sudo /etc/init.d/netfilter-persistent save

を実行して保存しておきます。

ちなみに上記のルールの一部はさくらのクラウドのパケットフィルタ機能でも実現可能です。(22番や80番、443番ポートへのアクセス許可はパケットフィルタ機能のほうがメンテナンスは楽かもしれません)

SSHを公開鍵認証方式に変える

スタートアップスクリプトで作成したサーバーの場合、デフォルトではSSHはパスワード認証方式になっています。このままではユーザー名とパスワードに対する総当たり攻撃を受けてしまいます。そこでSSHの認証方式を公開鍵認証方式に変更します。(編集部注:この記事ではコマンドによる作業手順をご紹介していますが、さくらのクラウドのコントロールパネルでも設定できます。詳しくはさくらのクラウドのマニュアルをご覧ください)

スタートアップスクリプトで作成したユーザーにSSHのキーペアを作成する

スタートアップスクリプトで作成したユーザーにはSSHのキーペアが初期状態では作成されていません。次のコマンドを実行してキーペアを作成しましょう。

ssh-keygen

画面のプロンプトに沿って入力をしていくと、ホームディレクトリに.sshディレクトリが作成され、その中にSSHキーペアが作成されます。次に以下のコマンドを実行して公開鍵を認証済みキーとして登録します。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

登録できたら、公開鍵の対になる秘密鍵を確認します。

cat ~/.ssh/id_rsa

表示された内容をコピーして手元に保存しておきます。この秘密鍵は接続の際に必ず必要になるので、紛失しないように注意してください。

/etc/ssh/sshd_configを編集

Webサーバーの/etc/ssh/sshd_configをviエディタなどで開き、以下の内容を変更します。

(変更前)PermitRootLogin prohibit-password
(変更後)PermitRootLogin no

(変更前)PubkeyAuthentication no
(変更後)PubkeyAuthentication yes

(変更前)PasswordAuthentication yes
(変更後)PasswordAuthentication no

変更できたら保存し、sshdを以下のコマンドで再起動します。

sudo /etc/init.d/ssh restart

設定が正しいか接続確認をする

Windowsの場合はお使いのSSHクライアントを新しく起動して、先程作成した秘密鍵を指定して接続します。(クライアントによっては秘密鍵の変換が必要ですが、ここでは割愛します)

MacやLinuxの場合は、ターミナルで以下のように実行します。

ssh -i 秘密鍵のパス ユーザー名@WebサーバーのIPアドレス

うまく接続できれば完了です。

IPアドレスによるアクセス制限をかける場合

アクセス元のIPアドレスでSSH接続を制限する場合は、iptablesの設定を以下のように変更します。(固定IPアドレスによるインターネット接続がある方向けです)

(変更前)sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
(変更後)sudo iptables -A INPUT -i eth0 -p tcp -s アクセス元IPアドレス --dport 22 -j ACCEPT

インターネット側から一切SSH接続できないようにするには

また、インターネット側からSSH接続できない状態でサーバにログインするには、以下の方法があります。

DBサーバーを作成

さて、ようやくDBサーバーを作成するステップに来ました。Webサーバーと同じくらいのスペックのサーバーをUbuntu Serverで作成します(本記事執筆時点では、さくらのクラウドで提供されている最新版はUbuntu Server 16.04 LTSです)。このときWebサーバーと異なる点としては、下記のスクリーンショットに表示されている以下の内容を指定する点です。

  • NICの接続先をスイッチにする
  • IPアドレスをWebサーバーのローカルIPアドレスとおなじネットワークになるように指定する
  • ゲートウェイのIPアドレスをWebサーバーのローカルIPアドレスにする

間違えるとうまくつながらないので注意してください。

MySQLのセットアップ

DBサーバーが起動したら、Webサーバー経由でログインします。DBサーバーはグローバルIPアドレスを持っていないので、直接DBサーバーにログインすることはできません。そのためWebサーバーを踏み台にして通信を行います。

さて、無事にDBサーバーにログインできたら、apt-getコマンドでMySQLをインストールしましょう。インストール時にはMySQLにおけるrootユーザーのパスワードの設定を求められます。設定したパスワードは忘れないようにメモしておきましょう。

sudo apt-get install mysql-server-5.7

apt-getが通らない場合は、Webサーバー側のiptablesの設定などを見直してみてください。

MySQLがインストールできたら、mysqlコマンドを実行してMySQLに対話型インターフェイスで接続します。

mysql -u root -h localhost -p
(先程インストール時に設定したパスワードの入力を求められます)

ログインできたら、WebサーバーのローカルIPアドレスからMagentoの使うMySQLユーザーが接続できるようにMySQL上のユーザーを定義しておきます。以下のコマンドをMySQLの対話型インターフェイスで実行します。

GRANT ALL privileges ON データベース名.* TO 'ユーザー名'@'WebサーバーのIPアドレス' IDENTIFIED BY 'パスワード';

ユーザー名やパスワードは、Webサーバーをスタートアップスクリプトで作成するとメールで送られてきますので、その内容を使用します。ユーザーが作成できたら、同じく対話型インターフェイスで、

FLUSH PRIVILEGES;

を実行して権限を反映させます。最後にWebサーバーからDBサーバーに対して以下のmysqlコマンドで接続できるか確認します。

mysql -u ユーザー名 -h DBサーバーのIPアドレス -p

正しく接続できればユーザーの作成は完了です。

データベースの移設

ようやくデータベースを移設する段階に来ました。
最初にWebサーバー上にあるMySQLに入っているMagentoのデータベースのダンプを取ります。
Webサーバー上で以下のコマンドを実行して、データベースのダンプを取りましょう。

mysqldump -u ユーザー名 -h localhost -p データベース名 > dump.sql

無事にダンプが採取できたら、引き続きダンプをDBサーバー上にリストアします。

mysql -u ユーザー名 -h DBサーバーのIPアドレス -p データベース名 < dump.sql

無事にリストアできたら、Magentoの設定ファイルを編集します。スタートアップスクリプトを使った場合、/var/www/magneto/app/etc/env.php に設定ファイルがあります。このファイルをviエディタなどで開くと、以下の記述があります。

'db' => 
 [
  'connection' => 
  [
    'default' =>
    [
      'host' => 'localhost',
      'dbname' => 'magento',
      'username' => 'magento',
      'password' => '設定したパスワード',
      'model' => 'mysql4',
      'engine' => 'innodb',
      'initStatements' => 'SET NAMES utf8;',
      'active' => '1',
    ]
 ]
],

hostの値をDBサーバーのIPアドレスに変更し、保存しておきましょう。

動作の確認

Magentoからみたデータベース接続先を変更できたら、動作確認を行います。ブラウザでアクセスし、正しく表示できれば完了です。

少なくともWebサーバーとDBサーバーを分けておけば、この先負荷分散構成にする場合や、データベースをさくらのクラウドのDBアプライアンスに載せ替える場合でも比較的簡単に切り替えができます。

WebサーバーからMySQLを撤去

データベースが無事に移設できたら、WebサーバーのMySQLは不要になります。

sudo apt-get remove mysql-server-5.7

でパッケージごと削除しておきましょう。

Varnishを導入して更に快速に

スタートアップスクリプトではApacheだけでMagentoを動作させています。開発サイトではこれで十分なのですが、実稼働環境として考える場合には少々物足りません。

実際のところMagento2系はVarnishをアプリケーションサーバーの前に置くことを強く推奨しています。また、昨今は全ページHTTPS化が当たり前になっています。VarnishはそのままではHTTPSを扱えないので、SSLオフロード機能のあるロードバランサーか、HAProxy、あるいはHitchといったミドルウエアが必要になります。

VarnishとHitchをMagentoと組み合わせる方法については、弊社サイトの「Hitch 1.4とVarnish 5.2でHTTP/2なMagento環境を作る」で紹介しています。

VarnishとHitchまで導入できれば、かなり快速なMagentoベースのサイトが構築できます。本番運用をする際は是非導入を検討してみてください。

次回以降は

さて、次回以降はいよいよMagentoのカスタマイズ方法について取り上げていきます。テーマのカスタマイズ方法や、エクステンションの作り方について取り上げます。お楽しみに。