Azure上のテストコードの整理 ついでにWorkerRoleから起動したTomcatで、JDBCを使ってSQL Azureへ接続
少しAzure上のテストコードの整理をしました。
別々に作っていたプロジェクトを統合したりして。
今は、WebRole上でphpも動くし、WorkerRoleからTomcatの起動もするものをあげています。
http://usaxusa.cloudapp.net/
っで、phpとTomcat(WorkerRoleから別アプリケーションの起動)の設定について、ちょっと(・∀・)
WebRoleでPHP(再)
以前の設定とは少し違う箇所があって、パスの指定にはapprootをつける必要があります。
こんな感じですね。
- Web.roleconfig
<?xml version="1.0"?> <configuration> <system.webServer> <fastCgi> <application fullPath="%RoleRoot%\approot\php\php-cgi.exe" /> </fastCgi> </system.webServer> </configuration>
- Web.config
<?xml version="1.0"?> <configuration> <system.web> <handlers> ... <add name="FastGGI Handler" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="%RoleRoot%\approot\php\php-cgi.exe" resourceType="Unspecified" />
WorkerRoleからTomcat
基本的なやりかたはWindows Azure Tomcat Solution Acceleratorがやってることに同じです。
っというか、それを参考にして構成(・ω・)
概略を説明すれば、TomcatとjreをWorkerRoleのプロジェクトにコピーしてデプロイ対象に含めて。
WorkerRoleでの処理としては、まずTomcatでlistenするポートをWorkerRoleのエンドポイントのポート(RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["XXX"].IPEndpoint.Port)にあわせてserver.xmlを書き換えて。
次に、Tomcatのstartup.batを使ってプロセスを起動という流れ。
一点はまったのが、空のディレクトリがデプロイ対象に含まれず、Tomcatが正しく起動しなかったという点(´д`;)
とりあえず、空のディレクトリについてはemptyファイルを作成して対応。
この辺、Windows Azure Tomcat Solution Acceleratorはコマンドラインからバッチでパッケージを作る設定になっていて問題無いんだよね(・ω・)
っで、Tomcatに限らずXCOPYインストール&起動オプションでポートを指定できるサーバアプリケーションなら、比較的簡単にWorkerRoleから動かせるんじゃないでしょうか(・∀・)?
そしてこれが実行中のTomcat。
http://usaxusa.cloudapp.net:8080/
まあ、これだけだとJavaが動いているのかどうか判りづらいですが(´д`;)
jspも直接見せてないし、Strutsを使ってるけど*.doも見せていないし。
とりあえずHTTPヘッダを見れば、レスポンスが「Server: Apache-Coyote/1.1」な事は確認できますが(´д`)
んで、ついでにJDBCでSQL Azureを使う処理も入れてみた。
http://usaxusa.cloudapp.net:8080/sql/
基本的に他からパチクってきた処理で構成しただけなので、特別な事は何もやっていないですが。
ちなみに、使用しているのはJRE 1.6とSQL Server JDBC Driver 2.0中のsqljdbc4.jar。
あと、Springを使っていて、DataSourceの設定はこんな風にしていて。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> <property name="url" value="jdbc:sqlserver://servername.database.windows.net;databaseName=DatabaseName"/> <property name="username" value="username@servername"/> <property name="password" value="password"/> </bean>
ただ、最初にテストしていた時は、ローカルPCからのJDBC接続は問題が無くても、Azure上にあげたらConnection resetで接続できないという問題が発生していて
それはよくわからないけど解消したんですが(´д`;)
…っというか、今も時々エラーが発生しますね(´д`;)?(エラーが表示されたらF5してみて)
コネクションプールの初回接続時かな、DataSourceのパラメータを弄れば状況は変わるかしら?
っで、その他の注意事項を一点。
今回作ったService Package file、PHPの分で30MB、Tomcatの分で60MB、その他アプリやwarの分も含めてサイズが150MBを超えているんですが。
なんかWebからアップロードしてデプロイしようとすると、エラーが発生するようになってしまい(´・ω・`)
一端Blobにあげて、そっちからデプロイすれば大丈夫っぽいので、今はそうしています。
追記
Connection resetの問題。
気がついたんだけど、SQL Azureのタイムアウトでコネクションが切られているからじゃね( ゚д゚)?
っということで、DataSourceにこんな設定を追加してみる。
<property name="testOnBorrow" value="true"/> <property name="validationQuery" value="select 1"/>
とりあえずエラーは発生しなくなったくさい。
ただ、これだったらむしろプールしない方が良かったりして(´д`;)?
オマケ
telnetでusaxusa.cloudapp.net:9999に接続してみると…。
これは明日の日記で(・∀・)