目次 前 次 PDF


Webアプリケーション・サーバーのプログラミング

Webアプリケーション・サーバーのプログラミング
この項には次のトピックが含まれます:
概要
Oracle SALTには、WebアプリケーションをOracle Tuxedo内で実行し、HTTPサーバー・プラグインによって簡単にアクセスできるようにする機能があります。Apache 2、Oracle HTTP ServerおよびiPlanetなどのHTTPサーバーを使用することで、アプリケーションをワールド・ワイド・ウェブに直接公開できます。HTTPサーバーはOracle Tuxedo固有のプラグイン(mod_tuxedoと呼ばれる)を使用する必要があり、このプラグインはHTTPリクエストをOracle Tuxedoリクエストに変換し、Oracle TuxedoレスポンスをHTTPレスポンスに変換します。
注意:
GWWSシステム・サーバーはマルチスレッドのプログラムなので、HPプラットフォーム上では、コンパイラの-mtフラグでマルチスレッディングを有効にしてプラグイン・ライブラリを構築する必要があります。
アプリケーションを記述するには、CGIと同様ですがOracle Tuxedoサーバーおよびその通信モードに固有のGatewayインタフェースをCまたはC++で使用するか、PHP、PythonおよびRubyなどの動的言語を使用します。動的言語を使用すると、プログラムではOracle Tuxedoで実行中であることは認識されないため、Symfony (PHP)、Django (Python)またはRails (Ruby)などのアプリケーション・フレームワークをOracle Tuxedoベースの環境で直接、再利用できます。
ネイティブOracle Tuxedo Webアプリケーションの開発
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リファレンス・ガイド』を参照してください。
開発プロセスは、HTMLコードを生成する通常のOracle Tuxedoサービスの開発と同様ですが、異なる点はRESTfulサービスの開発が、サービスの動作を制御する一連の規則またはルールに準拠するということです(GETを処理するサービスはPUTの処理時と異なる動作をします)。RESTfulサービスは一般的に、HTMLブラウザを使用してアクセスできるように設計されていません(つまり、SOAPサービスと同様です)。
データ・フローは次のようになります。
Apache2またはOHSプロセスが、mod_tuxedoモジュールを使用して特定のURLを処理するように構成されます。
mod_tuxedoがリクエストをインターセプトします。
mod_tuxedoがリクエストをフォーマットしてOracle Tuxedoサービスに送信します。そのサービス名はSCRIPT_NAME値から導出されます。後で示す例で、該当するサービスはTUXSVCと名付けられます。
Oracle Tuxedoサービスがデータを受け取り、それを適宜処理します。
REQUEST_METHODにはREST操作、すなわちGETPUTPOSTまたはDELETEが含まれます。
PATH_INFOにはアクセスされるソースが含まれる場合があります。この例では"/1234"が含まれます。プログラムは、クライアントおよびサーバー間で文書化された規則に従ってこの値を解析して、アカウント番号を取得します。
QUERY_STRINGまたはPOST_DATA (GETまたはPOSTの場合)には追加パラメータが含まれる場合があります。事前に決められた規則によって、パラメータの表記とその内容が制御されます。これはサービス開発者によって決定され、アプリケーション・ドキュメントとして発行されることで、クライアント・プログラムがこれらのサービスと通信するように開発できます。
Oracle Tuxedoサービスがレスポンスを構成し、これは暗黙的にmod_tuxedoに送り返されます。
レスポンスの形式はユーザーが決定できます。
"XML
"CSV (カンマ区切り値)
JSON
mod_tuxedoがレスポンスをクライアント・プログラムに送り返します。
各種のコンポーネントをリスト3-1からリスト3-4まで示します
リスト3-1 OHSまたはApache2の構成(httpd.conf引用)
<Location "/ACCOUNT">
 
<IfModule mod_tuxedo.c>
SetHandler tuxedo-script
Tuxconfig "/home/maurice/src/tests/secsapp/work/tuxconfig"
</IfModule>
 
</Location>
 
Oracle Tuxedoサービスをリスト3-2に示されているとおりに記述します
リスト3-2 Oracle Tuxedoサービス
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/レスポンスの例:
メソッド: GET
リクエストURL: http://myhost/ACCOUNT/1234
リスト3-3に示されているレスポンス(XML)。
注意:
XML生成は既存のlibtxmlを使用して実行できます。
リスト3-3 XMLレスポンス
<account id="1234">
<balance value="10000"/>
<customer name="John Smith"/>
</account>
 
リスト3-4に示されているレスポンス(JSON)。
注意:
JSONの生成はJSON-Cを使用して実行できます。JSON-Cは無償で再配布可能なCでのJSON実装(MITライセンス)で、ソース・コードとして提供されています。多くのライブラリが多数の言語(PHP、Perl、Python、Ruby、Javaなど)に存在します。
リスト3-4 JSONレスポンス
[
"account": {
"id": "1234",
"balance": {
"value": "10000"
},
"customer": {
"name": "John Smith"
}
}
]
 
Python Webアプリケーションの開発
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を構成する方法について説明します。
前提条件
Python 2.5.5以上のインストール。
Pythonは共有ライブラリを有効にして構築されている必要があります。通常、初回のインストールではこのような設定になっています。ソースから構築する場合は、--enable-sharedオプションを構成手順で使用する必要があります。
一般的なデータベースまたはサードパーティ・ライブラリのサポートの制約はありません。
使用方法
簡単なWSGIアプリケーションの例をリスト3-5に示します
リスト3-5 WSGIアプリケーションの例
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システム・サーバー内で実行される可能性があります。
1.
Apache (またはOHS)を構成してリクエストをWEBHNDLRに転送します。必要とされる静的ファイル(例: 画像、CSSスタイルシートまたはjavascriptファイル)へのパスを示すために、追加的な構成が必要になる場合があります。
2.
アプリケーション・パスをPYTHONPATH環境変数に追加します。
3.
WEBHNDLRに対するAPP_CONFIGを設定して、アプリケーションまたはミドルウェア・ハンドラをロードします(Djangoなどのフレームワークが対象)。
詳細は、『Oracle SALTリファレンス・ガイド』を参照してください。
スタンドアロン・スクリプト/アプリケーション
リスト3-6に、WSGIアプリケーションのためのApache構成の例を示します。
リスト3-6 スタンドアロン・スクリプト/アプリケーションの例
<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を起動する前に次のいずれかを実行してください。
APP_CONFIGtest_app (UNIXの場合は'export APP_CONFIG=test_app')に設定、または
ENVFILEを値APP_CONFIG=test_appとともに使用。
Djangoベースのアプリケーション
Apache Djangoベースのアプリケーションについては、RewriteEngineルールとAliasに注意する必要があります。これらは、リスト3-7に示すように、静的ファイル(例: CSS、画像またはjavascript)の場所を示し、ルートURLをアプリケーションにマップ(最後のRewriteRuleを参照)するために存在します。
リスト3-7 Djangoベースのアプリケーション
<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を起動する前に次のいずれかを実行してください。
APP_CONFIG django.core.handlers.wsgi (WSGIHandler) (UNIXの場合は'export APP_CONFIG="django.core.handlers.wsgi (WSGIHandler)"' )に設定、または
ENVFILEを値APP_CONFIG=" django.core.handlers.wsgi (WSGIHandler)"とともに使用。
Ruby Webアプリケーションの開発
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を構成する方法について説明します。
前提条件
Ruby 1.9.xのインストール。
Rubyは共有ライブラリを有効にして構築されている必要があります。通常、初回のインストールではこのような設定になっています。ソースから構築する場合は、--enable-sharedオプションを構成で使用する必要があります。
Rails 2.xまたは3.0.xのライブラリ。
一般的なデータベースまたはサードパーティ・ライブラリのサポートの制約はありません。
使用方法
リスト3-8では、簡単なRackアプリケーションの例を示します。
リスト3-8 簡単なRackアプリケーションの例
class HelloWorld
def call(env)
[200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
end
end
 
Rubyなどのフレームワークでは、これはハンドラ・スクリプトで実行され、アプリケーション開発者には表示されません。
リスト3-8内のスクリプトはRackUpスクリプトを使用してハンドラに渡されます。RackUpスクリプトではさらに機能性(かなりの例外、LINTラッパーなど)をアプリケーションに追加できます。
アプリケーションをロードしているRackUpスクリプトの例をリスト3-9に示します。
リスト3-9 RackUpスクリプトの例
require 'hello'
 
use Rack::ShowExceptions
run HelloWorld.new
 
あらゆるRuby Rack準拠のアプリケーションは、次の手順に従ってWEBHNDLRシステム・サーバー内で実行される可能性があります。
1.
Apache (またはOHS)を構成してリクエストをWEBHNDLRに転送します。必要とされる静的ファイル(例: CSSスタイルシートまたはjavascriptファイル)へのパスを示すために、追加的な構成が必要になる場合があります。
2.
WEBHNDLRを構成して、アプリケーションまたはミドルウェア・ハンドラをロードします(Railsなどのフレームワークが対象)。
Ruby Rack Lobster
リスト3-10に、Apache (またはOHS)の構成の例を示します。
リスト3-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"
APP_CONFIGを設定します。
Ruby Railsアプリケーション
Apache (またはOHS)構成については、RewriteEngineルールおよび(SetHandlerとは反対に)AddHandlerディレクティブに注意する必要があります。これらは、リスト3-11に示すように、HTTPサーバーを静的ファイル(CSS、画像、javascriptなど)にリダイレクトするために存在します。
リスト3-11 Ruby Railsアプリケーション
<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を起動する前に次のいずれかを実行してください。
APP_CONFIGをRack Upスクリプトへのパスに設定(UNIXの場合は'export APP_CONFIG=" /media/src/rails_test/config.ru"')するか、ENVFILEを値APP_CONFIG=" /media/src/rails_test/config.ru"とともに使用します。
PHP Webアプリケーションの開発
PHPスクリプトはWEBHNDLRで直接サポートされているため、アプリケーションをOracle Tuxedo環境で実行するための変更は特に必要ありません。HTTPサーバーにおけるPHPスクリプトの場所の変更だけで十分です。WEBHNDLRでPHPスクリプトを実行するようにフレームワークが一度設定されると、PHPアプリケーションは自動的にサポートされます。
詳細は、Oracle SALTコマンド・リファレンス・ガイドを参照してください。
前提条件
PHP 5.3.2以上のインストール。
PHPは--enable-embed構成オプションを使用して構築されている必要があります。
一般的なデータベースまたはサードパーティ・ライブラリのサポートの制約はありません。
使用方法
PHPスクリプトはWEBHNDLRで直接サポートされているため、アプリケーションをOracle Tuxedo環境で実行するための変更は特に必要ありません。HTTPサーバーにおけるPHPスクリプトの場所の変更だけで十分です。WEBHNDLRでPHPスクリプトを実行するようにフレームワークが一度設定されると、PHPアプリケーションは自動的にサポートされます。
(リスト3-12に示されている)"test.php"という名前のスクリプトを、HTTPサーバーのドキュメント・ルート・フォルダ内に配置します。
リスト3-12 test.phpスクリプト
-- listing x-x test.php script
<?php
phpinfo();
?>
--
 
ブラウザで次の場所を指定します。http://<your_host>:<port>/test.php
関連項目

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved