たとえば、Webアプリケーションのコードをいくつかのビジネスユニットに分割したい、管理者用の Webサーバーをユーザー用から分離したい、メインの部分をプリエンプティブに実行できるように、まだプリエンプティブに対応していない古い部分を別のインスタンスで実行したい、というような状況で、複数の Webサーバーの必要性を考えたことがあるかもしれません。
4D v18 R3 では、このようなことが簡単にできるようになります。
複数のWebサーバーを操作する
新しい WEB serverコマンドを使用すると、各サーバーを別々のオブジェクトで管理することができます。また、任意パラメーターで、使用するサーバーを定義することができます:
- Web database server カレントデータベースの Webサーバーを操作する (コマンドが呼び出された場所によって、ホストデータベースまたはコンポーネントデータベース)
- Web host database server コンポーネントからホストデータベースのWebサーバーを操作する
- Web request receiving server リクエストを受信した Webサーバーを操作する (たとえば、Webサーバー管理用の汎用メソッド内で使用します)。
コンポーネントWebサーバーを起動する
互換性のため、コンポーネントの Webサーバーは、”開始時にWebサーバーを起動” 設定が有効でも、自分自身で起動しません。
コンポーネントの Webサーバーを起動するには、まず WEB server (Web database server) コマンドを使用して、その Web サーバーオブジェクトをインスタンス化する必要があります。このコマンドが返すコンポーネントの Webサーバーオブジェクトを使って、起動と終了の操作がおこなえます。
C_OBJECT($myComponentWebServer)
$myComponentWebServer:=WEB Server(Web database server)
では、Webサーバーオブジェクトのプロパティを見てみましょう:
{ "name": "HDI_WebServerObject_Component1.4dbase", "isRunning": false, "defaultHomepage": "indexComponent1.html", "rootFolder": "/PACKAGE/WebFolder/", "characterSet": 106, "debugLog": 0, "HSTSEnabled": false, "HSTSMaxAge": 63072000, "HTTPCompressionLevel": 1, "HTTPCompressionThreshold": 1024, "HTTPEnabled": true, "HTTPPort": 8080, "HTTPTrace": false, "HTTPSEnabled": true, "HTTPSPort": 4431, "inactiveSessionTimeout": 480, "IPAddressToListen": "0.0.0.0", "keepSession": true, "inactiveProcessTimeout": 480, "logRecording": 0, "maxConcurrentProcesses": 100, "maxRequestSize": -1, "maxSessions": 100, "sessionCookieDomain": "", "sessionCookieName": "4DSID", "sessionCookiePath": "", "sessionIPAddressValidation": true, "minTLSVersion": 3, "openSSLVersion": "OpenSSL 1.1.1d 10 Sep 2019", "perfectForwardSecrecy": false, "cipherSuite": "...", "certificateFolder": "/PACKAGE/WebCertificate/" }
Webサーバーオブジェクトには、関連する Webサーバーを操作するための 2つのメンバー関数も含まれています。
Webサーバーの起動と停止
start メンバー関数により、Webサーバーを起動することができます。引数を指定しない場合は、データベース設定で定義されている設定を使用して開始されます。
WEB Server(Web host database server).start()
stop メンバー関数を使用すると、Webサーバーを停止できます。
WEB Server(Web host database server).stop()
いくつかの設定をオーバーライドしたい場合は、その設定に対応する属性名を値とともに格納するオブジェクトを用意します。それ以外の設定は、カレントデータベースの設定を使用します。
C_OBJECT($myComponentWebServer;$options;$result)
$myComponentWebServer:=WEB Server(Web database server)
$options:=New object("HTTPPort";8081;"defaultHomepage";"myCompHomepage.html")
$result:=$myComponentWebServer.start($options)
なお、設定を直接変更することはできません。まず、Webサーバーを停止してから、新しい設定で起動する必要があります。
利用可能な Webサーバーのリストアップ
新しい WEB Server listコマンドは、ホストデータベースで利用可能なすべての Webサーバーオブジェクトのコレクションを返します。
C_COLLECTION($webServers)
$webServers:=WEB Server list
以下は、独自の Webサーバーを実行しているデータベースと、Webサーバーをそれぞれ実行している 2つのコンポーネントからの結果の例です:
[ {"name": "HDI_WebServerObject_Host", ...} , {"name": "HDI_WebServerObject_Component1", ...} , {"name": "HDI_WebServerObject_Component2", ...} ]
データベース WEB メソッド
レガシーなホストデータベースの Webサーバーで常におこなわれてきたように、”On Web Connection” と “On Web Authentication” データベースメソッドは、リクエストを受け取るデータベースにおいて呼び出すことができます。たとえば、Webリクエストがコンポーネントの Webサーバーに送信され、このリクエストが既存のリソースに適合しない場合、このコンポーネントの “On Web Connection” メソッドが呼び出され、リクエストの処理と返信を任意におこなうことができます。
ログについて
Webサーバーのログを複数の場所で探すのを避けるため、ホストデータベースの Logsフォルダーにすべて保存します。ホストデータベースの Webサーバーログは Logsフォルダーにそのまま保存され、各コンポーネントの Webサーバーログはそれぞれサブフォルダー内に保存されます。
レガシーWebコマンド
ホストデータベースの Webサーバーを操作するすべてのレガシーWebコマンドは、たとえコンポーネントから呼び出されたとしても、ホストデータベースをターゲットにします。各レガシーWebコマンドの実行対象は、ドキュメントで説明されています。
コンポーネントの Webサーバーを扱えるのは、新しい Webサーバーオブジェクトだけです。Webサーバーオブジェクトを使って、異なるサーバーを好きなように管理しましょう!