Slide 1

Slide 1 text

堅牢 & 運用楽々 な WordPress を Azure App Service で 株式会社 pnop / Cloudlive 株式会社 浅見 城輝 2020/03/13 @JAZUG TOHOKU

Slide 2

Slide 2 text

© 2020 pnop © 2011 Microsoft Corporation All Rights Reserved. About me kuniteru.asami Find me Database Azure 2012~ Microsoft Azure

Slide 3

Slide 3 text

© 2020 pnop はじめに Azure App Service の WordPress の構築については、 App Service(リリース当初は Web Apps)の登場と共に 何度も紹介されています。 しかしながら、App Service は日々進化しているため、最新の機能 (Preview を含む)なども取り入れ、今 Azure App Service に WordPress を作るならというお話しをさせていただきます。 ※ 2020/03/13 時点の情報がベースとなります ※ Preview 機能も紹介していますが、Preview であることは 明記していません

Slide 4

Slide 4 text

© 2020 pnop WordPress のよくある課題 応答速度の向上 セキュリティ 可用性の向上

Slide 5

Slide 5 text

© 2020 pnop 応答速度を向上したい よくある WordPress の高速化手法 Azure App Service での課題

Slide 6

Slide 6 text

© 2020 pnop WordPress の Plugin と Azure の機能を組み合わせて高速化する Azure Cache for Redis に Object Cache を持つことで DB へのア クセスを軽減 • Redis Object Cache Plugin CDNを利用し (Azure CDN or Azure Front Door) グローバルに分散したコンテン ツ キャッシュを持つ よくある WordPress の高速化手法と Azure での対応 ページをキャッシュする • WP Super Cache など 最新バージョンの PHP の利用 • App Service では最新への バージョンアップが容易 • リビジョンレベルは 自動アップデート WordPress Plugin の活用 App Service のスペックを上げる • Premium (max): CPU 4 core, RAM 14 GB, SSD • Isolated (max): CPU 8 core, RAM 32 GB, SSD App Service のインスタンスを 増やし、アクセスを分散する • 負荷状況に応じて自動で 増減することでコストを 抑制 App Service の性能向上 Azure DB for MySQL/MariaDB の スペックを上げる • (max) CPU 64 core, RAM 320 GB データベースの読取レプリカで、 データベースへのアクセスを 分散する • HyperDB Plugin DB の 性能向上 外部 キャッシュ の利用 PHP ランタイム の高速化 PHP アクセラレーターの利用 コードを圧縮し 通信データ量を減らす • Autoptimize など

Slide 7

Slide 7 text

© 2020 pnop Azure App Service での課題 Azure App Service では、 一般に WordPress をインストールする領域のストレージが遅め 速度が遅い領域での I/O を減らすために、データの永続化および App Service インスタンス間で の共有が必要なディレクトリにのみ、Azure Files をマウントする(一部のデプロイ方法) Premium File Storage をマウントしてそこにアプリケーションを展開(App Service for Container) ← デフォルトでは home 以下が Azure Files をマウントした共有ストレージ ← wwwroot が Web サイトのドキュメント ルート / (D:¥) home site wwwroot index.php wp_content ← メディア や テーマ、プラグインのファイルが配置される(要永続化)

Slide 8

Slide 8 text

© 2020 pnop セキュリティ 最新バージョンへの更新 Web Application Firewall 管理サイトの認証

Slide 9

Slide 9 text

© 2020 pnop 最新バージョンへの更新 古い WordPress で運用を続けたために、既知のセキュリティ ホールをつかれ、 コンテンツを改竄されるなどのインシデントが頻繁に発生している WordPress の更新 WordPress の機能としての自動更新 WordPress アプリケーションのファイル全てを永続化領域(Azure Files)に 保存している場合に限り利用できる wp_content だけを永続化領域に保存しているなどの場合、自動更新後のスケール アウトや障害による インスタンスの再起動により、永続化領域以外のファイルがデプロイ直後のものに戻ってしまう Official Docker Image を利用し、Continuous Deploy を有効にすれば、自動更新される OS や httpd、PHP などの更新 基本的には Azure が自動で最新に更新してくれる ただし App Service for Container の場合は、その Container Image に依存する Continuous Deploy を有効にしている場合は、Image が更新されれば App Service も更新される

Slide 10

Slide 10 text

© 2020 pnop Web Application Firewall WordPress を対象とした攻撃は日々大量に来る WAF を通して App Service にアクセスさせることで安全性を高める Azure Application Gateway Azure Front Door Virtual Machines (VMSS) に セットアップした 3rd-Party の WAF 製品 3rd-Party が提供している Azure 外の WAF サービス ※ 実は App Service 内にも WAF の機能は持っているが、ほとんど情報もなく、利用事例は極端に少ない

Slide 11

Slide 11 text

© 2020 pnop WordPress の管理サイトへのログインを試みる攻撃も多い WordPressが独自に実装する認証だけではなく、 App Service の Easy Auth 機能あるいは WordPress の Plugin により 外部 IdP が提供する安全な認証を適用することができる とても簡単な設定だけで、リスクの低い認証を実現できる MFA、アクセス元 IP 制限、ログイン監査 など Easy Auth が対応する認証プロバイダー 管理サイトの認証 Azure Active Directory Microsoft Account Facebook Google Azure AD B2C に対応する IdP Twitter And more…

Slide 12

Slide 12 text

© 2020 pnop App Service や Azure DB for MySQL は通常、VNet には所属していない。 そのためそれらの間は通常はグローバル ネットワークでの通信となる が、リージョン VNet 統合と PaaS への VNet サービス エンドポイントか Private Link を組み合わせることで、通信経路を制限することができる。 App Service から Azure DB for MySQL への通信 (リージョン)VNet 統合 + Private Link VNet グローバルネット (IP 制限) リージョン VNet 統合 + サービス エンドポイント VNet My App Service 11.11.11.11 22.22.22.22

Slide 13

Slide 13 text

© 2020 pnop 可用性の高い環境

Slide 14

Slide 14 text

© 2020 pnop App Service の可用性 App Service は インスタンスを複数にすると可用性が上がる App Service Plan Load Balancer Azure DB fro MySQL Instance #1 Instance #2 Azure Files

Slide 15

Slide 15 text

© 2020 pnop データベースの高い可用性とレプリケーション Azure DB for MySQL/MariaDBでは、標準で高可用性構成がとられる ディザスタ リカバリあるいは読取分散による高速化のために、 同構成の読取専用レプリカを作ることも可能 Standard 可用性モデル Gateway Ring Primary Database Engine spare mount Data files Log files failover Page Blob (Premium) spare Client ※ Premium 可用性モデルでは、読取専用として Secondary にアクセスすることも可能

Slide 16

Slide 16 text

© 2020 pnop お薦めの構成

Slide 17

Slide 17 text

© 2020 pnop 構成案 コンテンツ 管理者 読取レプリカ レプリケーション /wp-admin への アクセスはフィルタ アクセス制限 コンテンツ管理者 /wp-admin への アクセスはフィルタ コンテンツ管理用 WordPress /wp-contents Azure AD 認証 プライマリ mount mount アクセス制限 CDN WAF CDN WAF Azure Front Door Azure AD App Service Azure Storage Azure DB for MySQL Azure AD 認証

Slide 18

Slide 18 text

© 2020 pnop App Service に対するアプリケーションのデプロイ方法 ZIP / WAR file Bitbucket DropBox GitHub ローカル Git OneDrive Azure Repos Docker FTP(S) Azure Marketplace

Slide 19

Slide 19 text

© 2020 pnop Azure Marketplace で提供されている WordPress

Slide 20

Slide 20 text

© 2020 pnop Azure Marketplace で提供されている WordPress https://github.com/azureappserviceoss/wordpress-azure https://hub.docker.com/r/appsvcorg/wordpress-alpine-php:0.72

Slide 21

Slide 21 text

© 2020 pnop お薦めの WordPress デプロイ先とデプロイ方法 App Service for Container に対し Docker Hub の WordPress Docker Official Image Docker Compose で Continuous Deploy

Slide 22

Slide 22 text

© 2020 pnop Docker Compose – App Service for Linux docker-compose.yml ファイルの例 version: '3.5' services: wordpress: image: wordpress ports: - "8080:80" restart: always environment: WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST} WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME} WORDPRESS_DB_USER: ${WORDPRESS_DB_USER} WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD} # WORDPRESS_TABLE_PREFIX: # WORDPRESS_AUTH_KEY: # WORDPRESS_SECURE_AUTH_KEY: # WORDPRESS_LOGGED_IN_KEY: # WORDPRESS_NONCE_KEY: # WORDPRESS_AUTH_SALT: # WORDPRESS_SECURE_AUTH_SALT: # WORDPRESS_LOGGED_IN_SALT: # WORDPRESS_NONCE_SALT: # WORDPRESS_DEBUG: WORDPRESS_CONFIG_EXTRA: | define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL); volumes: - "${WEBAPP_STORAGE_HOME}/site/wwwroot/wp- content:/var/www/html/wp-content"

Slide 23

Slide 23 text

© 2020 pnop Docker Compose – App Service for Linux 接続先 MySQL 情報や /home 以下の永続化設定 App Service のアプリケーション設定として以下を追加/変更する WEBSITES_ENABLE_APP_SERVICE_STORAGE(変更) false → true に変更 WORDPRESS_DB_HOST(追加) MySQL ホスト名 WORDPRESS_DB_NAME(追加) MySQL データベース名 WORDPRESS_DB_USER(追加) MySQL ログインユーザー名 WORDPRESS_DB_PASSWORD(追加) MySQL ログインパスワード

Slide 24

Slide 24 text

© 2020 pnop Tips

Slide 25

Slide 25 text

© 2020 pnop WordPress on Azure App Service Tips Azure Database for MySQL / MariaDB と SSL 通信するために wp-config.php に以下を追加 define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL) 外部の SMTP サーバーを利用したメール送信 SMTP サーバーを利用する WordPress プラグインで SendGrid などを利用 SendGrid - https://wordpress.org/plugins/sendgrid-email-delivery-simplified/ メディア ファイルへのアクセス メディア ファイルの保存先に Azure Blob Storage を利用する WordPress プラグイン Microsoft Azure Storage for WordPress - https://wordpress.org/plugins/windows-azure-storage/ メディア ファイルへのアクセスに CDN を利用するためのプラグインを利用 メディアファイルの変更時に、CDN にキャッシュされたファイルをリフレッシュする