Oracle SALTには、WebアプリケーションをOracle Tuxedo内で実行し、HTTPサーバー・プラグインによって簡単にアクセスできるようにする機能があります。Apache 2、Oracle HTTP ServerおよびiPlanetなどのHTTPサーバーを使用することで、アプリケーションをワールド・ワイド・ウェブに直接公開できます。HTTPサーバーはOracle Tuxedo固有のプラグイン(mod_tuxedo
と呼ばれる)を使用する必要があり、このプラグインはHTTPリクエストをOracle Tuxedoリクエストに変換し、Oracle TuxedoレスポンスをHTTPレスポンスに変換します。
アプリケーションを記述するには、CGIと同様ですがOracle Tuxedoサーバーおよびその通信モードに固有のGatewayインタフェースをCまたはC++で使用するか、PHP、PythonおよびRubyなどの動的言語を使用します。動的言語を使用すると、プログラムではOracle Tuxedoで実行中であることは認識されないため、Symfony (PHP)、Django (Python)またはRails (Ruby)などのアプリケーション・フレームワークをOracle Tuxedoベースの環境で直接、再利用できます。
mod_tuxedo
はWebリクエスト処理のOracle Tuxedoにおけるクライアント部分を提供しますが、Oracle Tuxedo側でリクエストを処理するメソッドの1つはそのリクエストに直接アクセスすることです。これは受信したバッファ、つまりOracle Tuxedo FML32型付きバッファの形式を記述することで可能になります。
このメソッドでは、Oracle Tuxedoサービスを開発することで動的HTTPコンテンツを生成し、その段階でOracle Tuxedo RASPおよび統合機能を利用できます。
HTTPリクエストの関連要素(メソッド名、問合せ文字列のURL、ファイル名、POSTデータなど)が、mod_tuxedo
(HTTPレスポンス・ヘッダー(必要な場合)、HTMLドキュメント)への戻りデータと同様に、公開されます。
詳細は、『Oracle SALTリファレンス・ガイド』の付録H「Oracle SALT HTTP FML32バッファ形式」を参照してください。
開発プロセスは、HTMLコードを生成する通常のOracle Tuxedoサービスの開発と同様ですが、異なる点はRESTfulサービスの開発が、サービスの動作を制御する一連の規則またはルールに準拠するということです(GETを処理するサービスはPUTの処理時と異なる動作をします)。RESTfulサービスは一般的に、HTMLブラウザを使用してアクセスできるように設計されていません(つまり、SOAPサービスと同様です)。
mod_tuxedo
モジュールを使用して特定のURLを処理するように構成されます。mod_tuxedo
がリクエストをインターセプトします。mod_tuxedo
がリクエストをフォーマットしてOracle Tuxedoサービスに送信します。そのサービス名はSCRIPT_NAME
値から導出されます。後で示す例で、該当するサービスはTUXSVC
と名付けられます。REQUEST_METHOD
にはREST
操作、すなわちGET
、PUT
、POST
またはDELETE
が含まれます。PATH_INFO
にはアクセスされるソースが含まれる場合があります。この例では"/1234"が含まれます。プログラムは、クライアントおよびサーバー間で文書化された規則に従ってこの値を解析して、アカウント番号を取得します。QUERY_STRING
またはPOST_DATA
(GET
またはPOST
の場合)には追加パラメータが含まれる場合があります。事前に決められた規則によって、パラメータの表記とその内容が制御されます。これはサービス開発者によって決定され、アプリケーション・ドキュメントとして発行されることで、クライアント・プログラムがこれらのサービスと通信するように開発できます。mod_tuxedo
に送り返されます。mod_tuxedo
がレスポンスをクライアント・プログラムに送り返します。各種のコンポーネントをリスト4-1からリスト4-4まで示します。
<Location "/ACCOUNT">
<IfModule mod_tuxedo.c>
SetHandler tuxedo-script
Tuxconfig "/home/maurice/src/tests/secsapp/work/tuxconfig"
</IfModule>
</Location>
Oracle Tuxedoサービスをリスト4-2に示されているとおりに記述します。
void
ACCOUNT(TPSVCINFO *rqst)
{
char val[1024]; /* TODO: query size first */
long len;
int rc;
/* Fetch PATH_INFO value, which contains the resource */
len = sizeof(val);
rc = Fget32((FBFR32 *)inbuf, PATH_INFO, 0, (char *)val, &len);
if (rc < 0) {
/* Handle error */
}
/* Variable 'val' contains resource name, process it */
...
/* Fetch QUERY_STRING, which optionally contains
additional parameters */
len = sizeof(val);
rc = Fget32((FBFR32 *)inbuf, QUERY_STRING, 0, (char *)val, &len);
if (rc < 0) {
/* Handle error */
}
/* Depending on method, do processing */
len = sizeof(val);
rc = Fget32((FBFR32 *)inbuf, REQUEST_METHOD, 0, (char *)val, &len);
if (rc < 0) {
/* Handle error */
}
if (strcmp(val, "GET") == 0) {
...
} else if (strcmp(val, "PUT") == 0) {
...
} else if (strcmp(val, "POST") == 0) {
/* Get POST_DATA, parse it */
...
} else if (strcmp(val, "DELETE") == 0) {
...
}
/* Compose return document, using xml or JSON */
...
/* Return result document */
tpreturn(TPSUCCESS, 0, result, 0L, 0);
}
リクエストURL: http://myhost/ACCOUNT/1234
リスト4-3に示されているレスポンス(XML)。
注: | XML生成は既存のlibtxml を使用して実行できます。 |
<account id="1234">
<balance value="10000"/>
<customer name="John Smith"/>
</account>
リスト4-4に示されているレスポンス(JSON)。
注: | JSONの生成はJSON-Cを使用して実行できます。JSON-Cは無償で再配布可能なCでのJSON実装(MITライセンス)で、ソース・コードとして提供されています。多くのライブラリが多数の言語(PHP、Perl、Python、Ruby、Javaなどを含む)に存在します。 |
[
"account": {
"id": "1234",
"balance": {
"value": "10000"
},
"customer": {
"name": "John Smith"
}
}
]
WEBHNDLR
Oracle Tuxedoシステム・サーバー内でのPHPアプリケーションの実行方法と同様に、Oracle SALTではWeb用のアプリケーションをPythonで記述できます。PHP (すべてのスクリプトがCGI同様のモデルで実行するように設計されています)とは異なり、Pythonでは特定のWebレイヤーを使用した実行が必要です。
このレイヤーはWSGI (Web Server Gateway Interface)として示され、言語に組み込まれます。これは事実上のPython仕様(PEP 333)です。Pythonでは、アプリケーションがWSGIに対して記述されますが、完全なアプリケーション・フレームワークが使用可能です(WSGIに準拠。Djangoが最も一般的である傾向があります)。
次の項では、Python WSGIアプリケーション(Djangoフレームワークの使用を含む)を実行するためにWEBHNDLR
を構成する方法について説明します。
簡単なWSGIアプリケーションの例をリスト4-5に示します。
import cgi
def application(environ, start_response):
form = cgi.FieldStorage(fp=environ['wsgi.input'],
environ=environ,
keep_blank_values=1)
write = start_response('200 OK', [('Content-type', 'text/html')])
if form.getvalue('name'):
write('<html><head><title>Hello!</title></head>\n')
write('<body>\n')
write('<h1>Hello %s!</h1>\n' % form['name'].value)
else:
write('<html><head><title>Who is there?</title></head>\n')
write('<body>\n')
write('<h1>Who is there?</h1>\n')
write('<form action="%s" method="POST">\n' % environ['SCRIPT_NAME'])
write('What is your name?<br>\n')
write('<input type="text" name="name" value="%s"><br>\n'
% cgi.escape(form.getvalue('name', ''), 1))
write('<input type="submit" value="That is my name"></form>\n')
write('</body></html>\n')
return None
Djangoなどのフレームワークでは、これはハンドラ・スクリプトで実行されます。このスクリプトはアプリケーション開発者には表示されません。
あらゆるPython WSGIアプリケーションは、次の手順に従ってWEBHNDLR
システム・サーバー内で実行される可能性があります。
詳細は、『Oracle SALTリファレンス・ガイド』のWEBHNDLR(5)に関する項を参照してください。
リスト4-6に、WSGIアプリケーションのためのApache構成の例を示します。
<VirtualHost 10.143.7.223:2280>
DocumentRoot "/media/src/tests"
<Directory "/media/src/tests">
<IfModule mod_tuxedo.c>
SetHandler tuxedo-script
Tuxconfig "/media/src/TUX11g/web/tests/tuxconfig"
TuxService PYWEB
</IfModule>
</Directory>
</VirtualHost>
スタンドアロンWSGIアプリケーションのためのubbconfigファイルおよび設定は、test_app.py (==module)
という名前のスクリプト内にあり、これは/media/src/tests
ディレクトリ内にあります(PYTHONPATH
には /media/src/tests
が含まれる必要があります)。
WEBHNDLR SRVGRP=PHPGRP SRVID=1 MIN=5 MAX=8
CLOPT="-A -- -l Python -S PYWEB "
WEBHNDLR
を起動する前に次のいずれかを実行してください。
Apache Djangoベースのアプリケーションについては、RewriteEngineルールとAliasに注意する必要があります。これらは、リスト4-7に示すように、静的ファイル(例: CSS、画像またはjavascript)の場所を示し、ルートURLをアプリケーションにマップ(最後のRewriteRuleを参照)するために存在します。
<VirtualHost 10.143.7.223:2280>
DocumentRoot "/media/src/test_django/mysite"
Alias /media /usr/lib/python2.5/site-packages/django/contrib/admin/media
<Directory "/media/src/test_django/mysite">
<IfModule mod_tuxedo.c>
SetHandler tuxedo-script
Tuxconfig "/media/src/TUX11g/web/tests/tuxconfig"
TuxService PYWEB
</IfModule>
</Directory>
RewriteEngine On
RewriteRule ^/(media.*)$ /$1 [QSA,L,PT]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /mysite/$1 [QSA,L]
</VirtualHost>
環境変数DJANGO_SETTINGS_MODULE
は、WEBHNDLR
を起動する前に設定する必要があります。たとえば、mysite
というアプリケーションでは次のようになります。
DJANGO_SETTINGS_MODULE=mysite.settings
Djangoの例のためのPYTHONPATH
設定は、mysite
と呼ばれ、/media/src/test_django
ディレクトリ内に存在します。
PYTHONPATH=/media/src/test_django
Djangoの例のためのubbconfig設定はここで記述されています。
WEBHNDLR SRVGRP=PHPGRP SRVID=1 MIN=5 MAX=8
CLOPT="-A -- -l Python -S PYWEB"
WEBHNDLR
を起動する前に次のいずれかを実行してください。
WEBHNDLR
Oracle Tuxedoシステム・サーバー内でのPHPアプリケーションの実行方法と同様に、Oracle SALTではWeb用のアプリケーションをRubyで記述できます。PHP (すべてのスクリプトがCGI同様のモデルで実行するように設計されています)とは異なり、Rubyでは特定のWebレイヤーを使用した実行が必要です。
WSGIに相当するもの(Rackと呼ばれます)が存在しますが、これは別個にインストールされるライブラリの形式で実行されます。Rubyでは、アプリケーションがRackの最上部に直接記述される場合がありますが、Railsなどの完全なアプリケーション・フレームワークが使用可能です。Rackアプリケーションは、Rubyに対するアプリケーションおよびサーバー間のインタフェースです(WSGIと同様)。これは通常、言語へのアドオンとしてインストールされ、Railsなどのアプリケーション・サーバー環境に対する前提条件となります。次の項では、Ruby Rack準拠のアプリケーション(Railsフレームワークの使用を含む)を実行するためにWEBHNDLR
を構成する方法について説明します。
リスト4-8では、簡単なRackアプリケーションの例を示します。
class HelloWorld
def call(env)
[200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
end
end
Rubyなどのフレームワークでは、これはハンドラ・スクリプトで実行され、アプリケーション開発者には表示されません。
リスト4-8内のスクリプトはRackUpスクリプトを使用してハンドラに渡されます。RackUpスクリプトではさらに機能性(かなりの例外、LINTラッパーなど)をアプリケーションに追加できます。
アプリケーションをロードしているRackUpスクリプトの例をリスト4-9に示します。
require 'hello'
use Rack::ShowExceptions
run HelloWorld.new
あらゆるRuby Rack準拠のアプリケーションは、次の手順に従ってWEBHNDLR
システム・サーバー内で実行される可能性があります。
リスト4-10に、Apache (またはOHS)の構成の例を示します。
<VirtualHost 10.143.7.223:2380>
DocumentRoot "/media/src/tests"
<Directory "/media/src/tests">
<IfModule mod_tuxedo.c>
SetHandler tuxedo-script
Tuxconfig "/media/src/TUX11g/web/tests/tuxconfig"
TuxService RBWEB
</IfModule>
</Directory>
</VirtualHost>
ubbconfigファイルのWEBHNDLR
設定は次のとおりです。
WEBHNDLR SRVGRP=PHPGRP SRVID=1 MIN=5 MAX=8
CLOPT="-A -- -l Ruby -S RBWEB"
Apache (またはOHS)構成については、RewriteEngine
ルールおよび(SetHandler
とは反対に)AddHandler
ディレクティブに注意する必要があります。これらは、リスト4-11に示すように、HTTPサーバーを静的ファイル(CSS、画像、javascriptなど)にリダイレクトするために存在します。
<VirtualHost 10.143.7.223:2380>
SetEnv RAILS_RELATIVE_URL_ROOT /media/src/rails_test
DocumentRoot "/media/src/rails_test/public"
RewriteEngine On
RewriteRule ^(/stylesheets/.*)$ - [L]
RewriteRule ^(/javascripts/.*)$ - [L]
RewriteRule ^(/images/.*)$ - [L]
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /rails3.tuxrb [QSA,L]
<Directory "/media/src/rails_test/public">
Allow from All
<IfModule mod_tuxedo.c>
AddHandler tuxedo-script .tuxrb
Tuxconfig "/media/src/TUX11g/web/tests/tuxconfig"
TuxService RBWEB
</IfModule>
</Directory>
</VirtualHost>
ubbconfigファイルのWEBHNDLR
設定(Railsアプリケーションが/media/src/rails_test
ディレクトリで設定され、RailsTest
と名付けられていることが前提)は、次のようになります。
WEBHNDLR SRVGRP=PHPGRP SRVID=1 MIN=5 MAX=8
CLOPT="-A -- -l Ruby -S RBWEB'. That is, remove the "-a /media..." portion
WEBHNDLR
を起動する前に次のいずれかを実行してください。
PHPスクリプトはWEBHNDLR
で直接サポートされているため、アプリケーションをOracle Tuxedo環境で実行するための変更は特に必要ありません。HTTPサーバーにおけるPHPスクリプトの場所の変更だけで十分です。WEBHNDLR
でPHPスクリプトを実行するようにフレームワークが一度設定されると、PHPアプリケーションは自動的にサポートされます。
詳細は、Oracle SALTコマンド・リファレンス・ガイドのWEBHNDLR(5)に関する項を参照してください。
PHPスクリプトはWEBHNDLR
で直接サポートされているため、アプリケーションをOracle Tuxedo環境で実行するための変更は特に必要ありません。HTTPサーバーにおけるPHPスクリプトの場所の変更だけで十分です。WEBHNDLR
でPHPスクリプトを実行するようにフレームワークが一度設定されると、PHPアプリケーションは自動的にサポートされます。
(リスト4-12に示されている)"test.php
"というスクリプトを、HTTPサーバーのドキュメント・ルート・フォルダ内に配置します。
-- listing x-x test.php script
<?php
phpinfo();
?>
--
ブラウザで次の場所を指定します。http://<your_host>:<port>/test.php