読者です 読者をやめる 読者になる 読者になる

Goldstine研究所

mosuke5's tech blog

クラウド上でのWordPressのスケールアウトを考える

WordPress クラウド AWS Alibaba Cloud 分散 スケールアウト

複数台サーバでのWordPressの構築・運用について考える。
実際に、とあるクラウドで分散環境のWordPressを構築したのでその知見をまとめる。
なるべく特定のクラウドに特価しないものとして記載したい。

やりたいこと

  • スケールアウトできるWordPress環境を作る
  • SSLに対応する
  • HTTP/2に対応する
  • AWSなどのクラウド環境で構築する

アーキテクチャ

まず先に全体のアーキテクチャ図から示す。
これから各項目について解説していく。

f:id:mosuke5:20170104185455p:plain

SSL・HTTP/2への対応

まずSSLへの対応だが、通常ならばロードバランサをSSLの終端とし下記のような構成にすることが多いだろう。
この場合はロードバランサをL7のものとして稼働させる。

f:id:mosuke5:20170104190001p:plain

しかし、HTTP/2に対応しようと思うと事情は異なってくる。
(もちろん、最近ではAWSのALBのようにHTTP/2に対応する製品がでてきているのは承知だが。)
現在のパブリッククラウドで利用できるロードバランサの多くはまだHTTP/2に対応していない。
そのため、ロードバランサをL4として稼働させ、配下のWebサーバにてHTTP/2を処理する必要がでてくる。
この場合、ロードバランサはTCPでポート443を待ち受けるようにし、配下のWebサーバへポート443のままでフォワードすればいい。

f:id:mosuke5:20170104185953p:plain

クラウド環境ではWebサーバがスケールすることは前提にいれることがおおい。
そのため、この場合のSSL証明書はN台に対応した製品を買う必要がある。
例えば以下のような製品など。

データベースの分離

分散環境でのWordpressでは共通したコンテンツを配信するため、データベースはもちろんWebサーバとは分離したほうがいい。
それぞれのWebサーバは共通のデータベースを見に行くべきだ。
データベースを自前で冗長化しても構わないが、それなりの運用コストがかかることは容易に想像がつくので、
クラウドのマネージドデータベースサービスを利用した。

管理画面

管理画面のみを分離するアーキテクチャも考えられるが、ここではそうしないこととする。
管理画面へのログインセッションの保持は、別途KVS(RedisやMemcached)に保存してもいいと思う。
ですが、WordPress4.0以降ではデフォルトではMySQLへセッションを保存するので必須の対応ではないといえる。

github.com

記事で使うアップロード画像などの対応

管理画面から記事を投稿するとする。
記事のデータはデータベースに保存されるためどのWebサーバからも記事を参照できる。
しかし、記事に含まれる画像データはどうだろうか。

通常のWordpressでは管理画面サーバの/wp-content/uploads以下に画像を保存する。
複数台Webサーバがある状態で、たまたまアクセスしているサーバに画像を保存しても、他のサーバからは参照することができない。

これに対するソリューションはいくつかあるだろう。
例えば、rsyncなどを使って他のサーバと画像ファイルを同期するとか、画像用のストレージを用意しNFSで参照するとか。
冗長化の観点からもここはオブジェクトストレージのサービスを利用するのがいいだろう。

例えば、下記のような製品だ。

クラウドのオブジェクトストレージとWordPressを連携するプラグインは多く出ている。

デプロイへの対応

Wordpressのコードのデプロイ、Webサーバの設定変更などにどう対応するか。
ツールはなんでもいいが(シェルスクリプトでもいいし、Ansible,Chefなどでも)、
デプロイツールなど用いて全台サーバにデプロイできるようにしておくといいだろう。あたりまえ。
影響の大きいデプロイをするときはロードバランサーから切り離してデプロイ、テストとやるといいと思う。
あるいは、新しく構築(デプロイ)した別のWebサーバインスタンスを用意し、ロードバランサーで向き先を変更してもいい。

ロードバランサー配下のWebサーバはプライベートネットワークに配置しておりインターネットから直接アクセスできない。
そのため、デプロイサーバを用意することでデプロイできるようにした。
あるいは、踏み台サーバを用意して、多段SSHを使ってもいいかもしれない。

さいごに

他にも、工夫した点などはあるが、WordPressのスケールアウトという点に絞って簡単にまとめた。
OSSの利用は簡単だが、そのスケールや冗長化は毎度悩まさせると感じる。
以前もGitlabを運用してた時に冗長化をどうするか考えていたのを思い出す。