2011年8月19日

PHP+MySQLのWebアプリをWindows Azure上で動かす

既存のPHP+MySQLのウェブアプリケーションをWindows Azure上で動かすにはいくつかの方法あります、今回は元々Xampp上で動作するウェブアプリケーションをWindows Azure MySQL PHP Solution Accelatorを使って動作検証しました。

今回利用するパッケージは下記通り
 1. Windows Azure MySQL PHP Solution Accelator
 2. MySQL 5.1.58 x64
 3. PHP 5.2.17 nts VC6 x86
 4. phpMyAdmin 3.4.3.2

手順は下記通り
■上記パッケージをインストール
 MySQLインストールに関して
 1. カスタマイズインストールを選んで、サーバーデータとプログラムを同じフォルダにインストール
 2. インスタンスConfigurationは行わない
 3. binフォルダにある.map及び.pdbを削除

■Solution AccelatorのBuild.batを実行
 先ほどインストールしたMySQL、PHP及びphpMyAdminのフォルダを指定します

■PHPの修正
 PhpMyAdminWebRole\php\php.ini-recommendedをphp.iniに名前変更して、下記修正を行う
 extension_dir = "./ext"
 extension=php_mbstring.dll
 extension=php_mcrypt.dll
 extension=php_mysql.dll
 cgi.force_redirect = 0

 今回検証したウェブアプリケーションにはさらに下記設定が必要
 short_open_tag=On
 extension=php_pdo.dll
 extension=php_pdo_mysql.dll

PhpMyAdminの修正
 PhpMyAdminWebRole\phpmyadmin\libraries\config.defualt.phpに下記修正を行う
 $cfg['AllowArbitraryServer'] = true;

■MySQLの設定
 ServiceConfiguration.cscfgでMySQLのインスタンス数を設定します
  <Role name="MySql_WorkerRole">
     <Instances count="1" />
    ……
  </Role>


■Configの修正
 ServiceConfiguration.cscfgに下記修正を行う
 1.ローカルエミュレータの場合
  a.TableStorageEndpoint
   http://127.0.0.1:10002
  b.BlobStorageEndpoint
   http://127.0.0.1:10000
  c.DataConnectionString

   UseDevelopmentStorage=true
  d.DiagnosticsConnectionString
   UseDevelopmentStorage=true
 2.WIndows Azureにデプロイする場合
  a.TableStorageEndpoint
   http://Account Name.table.core.windows.net
  b.BlobStorageEndpoint
   http://Account Name.blob.core.windows.net
  c.DataConnectionString

   DefaultEndpointsProtocol=https;AccountName=Account Name;AccountKey=Account Shared Key
  d.DiagnosticsConnectionString
   DefaultEndpointsProtocol=https;AccountName=Account Name;AccountKey=Account Shared Key
  e.AccountName
  f.AccountSharedKey

■デプロイ&実行
 1. ローカルエミュレータの場合
  Runme.cmdを実行します。途中でMySQLにのファイアウォール警告が出た場合許可します。
  image

 2. Windows Azureの場合
  Packme.cmdを実行して、パッケージファイルが作成されます。
  このファイルをAzureにデプロイします。

■PhpMyAdminからMySQLへ接続
 1. MySQLのIPアドレスおよびポートの確認
  http://XXX.cloudapp.net/Admin.aspxに接続します

   image
   「Show MySql instances」をクリックして、MySQLのIPアドレスおよびポートを確認できます

   image
2. PhpMyAdminからMySQLへ接続
  http://XXX.cloudapp.net/PHPMyAdmin/index.phpに接続して、先ほど確認したIPアドレスおよびポート番号を入力してログインします。初期状態ではユーザー名は「mysqluser」、パスワードは「#ms123」になります。
  image
  ログイン後、phpMyAdminの画面が表示されます

  image

 

■まとめ
 とりあえずAzure上でPHP+MySQLが動作することを確認しました。ただし課題まだ残っています。
 1.MySQLインスタンスのアドレスやポート番号は固定じゃないので、ウェブアプリケーションで設定を動的に変える方法を考える必要があります。Azure Companionでは改良されたようなので、今度試してみる
 2. Windows Azureではロールが終了した場合、MySQLのデータも全部消えます。そのためMySQLはレプリケーション機能を利用して、Master/Slave構成で動作しています、さらにBlob Storageを使って、定期的に差分バックアップを取っています。今後障害発生時のリカバリについて検証する必要があります。
Azure Companionでどうなったのも気になる。
 3. メンテナンスを考える場合、SQLAzureに移行したほうが楽かもしれません、移行のコストにもよりますが
 4. 今回検証したウェブアプリケーションではAzure上で多くの機能が動作しませんでした。下記のエラーが発生します
  HTTP エラー 400.0 - Bad Request
  ASP.NET detected invalid characters in the URL.
  どうも今回のウェブアプリケーションでは下記例のように、URLに「&」が使われており(URLエンコードはしておりますが)
   URL例:http://xxxxxxx/delete/id/6&26?abc=1

  Apacheでは問題ないですが、IISではそれがだめ。ここに書いてある解決方法を試してもだめでした。今度時間あったらもうちょっと調べる

 

以上

0 件のコメント:

コメントを投稿