WordPress向けAzure App Serviceの設定と常時SSL化(標準ドメイン)

連載の3回目では、WordPressを本格的に設定する前にAzure App ServiceやWordPressに対して動作するPHPのバージョンやSSL等、最低限の設定を変更します。

App Serviceの設定

まずはAzure Portalにアクセスします。
https://portal.azure.com

Azure Portalの作成したApp Serviceの画面から「アプリケーションの設定」を選択し、以下のように変更して保存します。

  • PHPのバージョン:一番新しいバージョン(少しでも速くなりますように)
  • 常時接続:ON(5分間隔でポーリングしてサーバプロセスの停止を防止する。価格レベルがBasic以上で設定可能)
  • HTTPバージョン:2.0
  • ARRアフィニティ:OFF(負荷分散構成の場合はON)

常時SSL化(標準ドメインを使用)

Azure App Serviceは標準のドメイン構成の場合はhttpでもhttpsでも利用できますが、Googleがhttpsを推奨することもあり、セキュリティの観点からも今後作成するサイトは全てhttpsにすべきでしょう。
以降の回でカスタムドメインをSSL化する手順も示しますが、開発中のセキュリティ確保のためにもこの段階でSSLを強制してしまいます。

ここからはApp Service上のファイルを直接変更します。
通常はサーバにFTP等で接続してローカルにダウンロードし、変更してからアップするのが一般的ですが色々と面倒です。
そこで「App Service Editor」を使って直接編集してしまいましょう。
※サーバファイルを直接変更するとWordPressが動かなくなる危険があり、変更には注意が必要です

Azure PortalのApp Serviceの画面から「App Service Editor」を選択し「移動」ボタンを押します。
(現時点ではApp Service Editorはプレビュー版が使用できます)

WordPressのSSL対応

App Service Editorで「/wwwroot/wp-config.php」を選択します。

WP_HOMEとWP_SITEURLを以下のように変更します。
「http://」⇒「https://」
App Service Editorには保存ボタンがなく、変更したら自動で保存されます。

//Relative URLs for swapping across app service deployment slots 
define('WP_HOME', 'https://'. filter_input(INPUT_SERVER, 'HTTP_HOST', FILTER_SANITIZE_STRING));
define('WP_SITEURL', 'https://'. filter_input(INPUT_SERVER, 'HTTP_HOST', FILTER_SANITIZE_STRING));

通信をSSLに限定(http⇒httpsにリダイレクト)

httpにアクセスしてもhttpsに自動でリダイレクトさせます。
これにはAzure App Serviceでデフォルトで有効になっているURL Rewriteの機能を使います。
※App Serviceの機能でSSLに限定可能ですが、前述の常時接続が機能しなくなります
※App Serviceの機能でSSLに限定する場合、ポーリングジョブを別途作成して常時接続を代替します

App Service Editorで「/wwwroot/web.config」を以下のように変更します。
「RedirectToHttps」の部分のルールを前に配置します。
(最初から設定されているWordPress向けのルールよりも前に配置する)

<rewrite>
  <rules>
    <rule name="RedirectToHttps" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" pattern="^OFF$" />
        <add input="{HTTP_USER_AGENT}" pattern="^AlwaysOn$" negate="true" />
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" appendQueryString="false" />
    </rule>
    <rule name="WordPress: http://slowcat-wordpress-sample.azurewebsites.net" patternSyntax="Wildcard">
      <match url="*" />
      <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
      </conditions>
      <action type="Rewrite" url="index.php" />
    </rule>
  </rules>
</rewrite>

何をしているかわかりませんよね(^^;

基本的にはhttpでアクセスした場合はhttpsにリダイレクトしています。
ただ、前述の常時接続のポーリングはhttpに対して行われるため全てのアクセスをリダイレクトさせると常時接続が機能しません。
そこで、常時接続のポーリングでのアクセスはUser-AgentヘッダにAlwaysOnの文字列が含まれることから、常時接続のアクセスでないhttpアクセスに限定してhttpsにリダイレクトします。
これによりAzure App Serviceの常時接続を有効にしつつhttpsを強制できるようになります。
セキュリティホールになりえるので設定情報(AlwaysOnの部分)は非公開とすること

動作確認

WordPressのアドレスに対してhttpでアクセスしてみてください。
httpsにリダイレクトされれば成功です。
また、30分くらい放置してアクセスし、数秒程度で画面が表示されれば常時接続が効いていることが確認できます。
(常時接続が効いておらずサーバプロセスが停止している場合、アクセスに数十秒かかるので容易に区別できます)