はじめに
WebBroker の記事を書きましたが、Apache HTTP Server のインストールや設定方法は DocWiki にも詳細が (多分) ないので、記事にしてみました。
Apache HTTP Server のインストールと設定
以下、Delphi で作った CGI や Apache モジュール (共有オブジェクト) を動かせるようにするための基本的な設定です。
See also:
■ Apache HTTP Server (Windows) のインストール
Apache HTTP Server はソースコードの形態で提供されているため、Windows 向けの実行形式ファイル一式は Apache Lounge からダウンロードします。
インストール
ZIP をダウンロードしたらアーカイバで解凍し C:\Apache24 へ展開します。
デフォルトのフォルダ以外にインストールしたい場合には conf サブフォルダにある httpd.conf ファイルを書き替える必要があります。
Define SRVROOT "c:/Apache24"
■ Web サーバーの開始と終了
Web サーバーを起動するには、コマンドプロンプトで \bin\httpd.exe を実行します。Explorer からダブルクリックでも大丈夫です。
正しく動作していれば http://localhost をブラウザで開いた時に
と表示されます。コマンドプロンプトを閉じると Web サーバーは終了します。
C:\Apache24\htdocs フォルダが静的ページのルートディレクトリ (/) となります。
Apache をサービスで起動
Apache HTTP Server をサービスで起動するようにするには、管理者権限のコマンドプロンプトで次のように入力します。
httpd.exe -k install
実際に実行すると次のような表示になります。
C:\Apache24\bin>httpd.exe -k install
Installing the 'Apache2.4' service
The 'Apache2.4' service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.
アンインストールは次のように入力します。
httpd.exe -k uninstall
Apache サービスの操作
サービスで起動された Web サーバーはコントロールパネルの [サービス] から開始 / 停止 / 再起動が行えます。サービス名は Apache2.4 です。
Apache サービスの開始 / 停止 / 再起動はコマンドプロンプトからも行えます (要管理者権限)。
httpd.exe -k start
httpd.exe -k stop
httpd.exe -k restart
■ CGI や Apache モジュール (共有オブジェクト) を使うための設定
CGI の設定は特に必要ありませんが、デフォルトのままだと cgi-bin フォルダでしか動作しません。これを変更するには conf サブフォルダにある httpd.conf ファイルを書き替える必要があります。
Apache モジュール (共有オブジェクト) を使うには conf サブフォルダにある httpd.conf ファイルを書き替える必要があります。これに関しては後述します。
httpd.conf を書き替えたら、Web サーバーを再起動する必要があります。
■ CGI モジュールのテスト
Delphi で作った CGI モジュール (*.exe) を実フォルダ C:\Apache24\cgi-bin\ に吐くようにするか、モジュールをコピーし、http://localhost/cgi-bin/<CGI モジュール名> をブラウザで開きます。
64bit サーバーでは 32bit / 64bit CGI モジュールいずれも動作します。
■ Apache モジュール (共有オブジェクト) のテスト
まずは Apache モジュール (共有オブジェクト) についての説明が必要です。
32bit Web サーバーには 32bit の Apache モジュール (共有オブジェクト) が、64bit Web サーバーには 64bit の Apache モジュールが必要です。
・モジュール名とハンドラ名の命名規則
Apache モジュール (共有オブジェクト) のプロジェクトファイルのソースが次のようになっていたとします。
library mod_webbroker;
...
var
GModuleData: TApacheModuleData;
exports
GModuleData name 'webbroker_module'; // モジュール名は任意に変更可能
begin
{$IFDEF MSWINDOWS}
CoInitFlags := COINIT_MULTITHREADED;
{$ENDIF}
Web.ApacheApp.InitApplication(@GModuleData);
Application.Initialize;
Application.WebModuleClass := WebModuleClass;
Application.Run;
end.
この時、各名称は次のようになっています:
| 項目 | 名称 |
|---|---|
| プロジェクト名 | mod_webbroker |
| モジュールファイル名 | mod_webbroker.dll |
| モジュール名 | webbroker_module |
| ハンドラ名 | mod_webbroker-handler |
ハンドラ名はデフォルトだと プロジェクト名 + '-handler' という名前になっていますが、InitApplication() の 2 番目のパラメータで変更する事ができます。
Web.ApacheApp.InitApplication(@GModuleData, 'webbroker-handler');
古い Delphi ではやり方が違うので注意が必要です。
| 項目 | 古い Delphi | 新しい Delphi |
|---|---|---|
| モジュール名 (デフォルト) |
ModuleName グローバル変数 (プロジェクト名 + '_module') |
GModuleData グローバル変数 (ウィザードで入力したモジュール名) |
| ハンドラ名 (デフォルト) |
ContentType グローバル変数 または Handler グローバル変数 (プロジェクト名 + '-handler') |
InitApplication() 第 2 パラメータ (プロジェクト名 + '-handler') |
・Apache モジュール (共有オブジェクト) を使う
conf サブフォルダにある httpd.conf ファイルに設定を追加する必要があります。
まずはロードするモジュールを記述します。
LoadModule <モジュール名> modules/<モジュールファイル名 (*.dll)>
次に仮想フォルダとハンドラを関連付けます。
<Location /<仮想フォルダ>>
SetHandler <ハンドラ名>
</Location>
上記例だと、次のような記述になります (仮想フォルダは xyz):
LoadModule webbroker_module modules/mod_webbroker.dll
<Location /xyz>
SetHandler mod_webbroker-handler
</Location>
・動作確認
Delphi で作った Apache モジュール (*.dll) を実フォルダ C:\Apache24\modules に吐くようにするか、モジュールをコピーした上で、conf サブフォルダにある httpd.conf ファイルを書き替えます。
この設定を行うと、http://localhost/<指定した仮想フォルダ> で Web アプリケーションを実行できます。
■ ISAPI モジュールを Apache で使う
Windows 用 Apache では、IIS (Internet Information Services) 用の ISAPI モジュールを利用する事もできます。
32bit Web サーバーには 32bit の ISAPI モジュールが、64bit Web サーバーには 64bit の ISAPI モジュールが必要です。
・mod_isapi モジュールを有効にする
ISAPI モジュールを使うには mod_isapi モジュールを有効にする必要があります。
1. mod_isapi.so の記述のある行を探し、先頭に # があってコメントアウトされていれば外します。
LoadModule isapi_module modules/mod_isapi.so
2. <IfModule alias_module> セクションを探し、最後に以下の行を加えます。
ScriptAlias /isapi/ "${SRVROOT}/isapi/"
cgi-bin 同様、実フォルダ C:\Apache24\isapi\ に置かれた ISAPI モジュールを http://localhost/isapi/<ISAPI モジュール名> でアクセスできるようにします。
<IfModule alias_module>
...
ScriptAlias /cgi-bin/ "${SRVROOT}/cgi-bin/"
ScriptAlias /isapi/ "${SRVROOT}/isapi/"
</IfModule>
3. <Directory "${SRVROOT}/cgi-bin"> セクションを探し、これを丸ごとコピーして ISAPI 用のセクションを作ります。Options の設定だけが異なります。
<Directory "${SRVROOT}/isapi">
AllowOverride None
Options ExecCGI
Require all granted
</Directory>
以下のようになります。
#
# "${SRVROOT}/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "${SRVROOT}/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<Directory "${SRVROOT}/isapi">
AllowOverride None
Options ExecCGI
Require all granted
</Directory>
4. <IfModule mime_module> セクションを探し、次の項目がなければ追加します。
AddHandler isapi-handler .dll
以下のようになります。
<IfModule mime_module>
...
AddHandler isapi-handler .dll
</IfModule>
5. http.conf の末尾に、mod_isapi のための各種ディレクティブを記述します。
ISAPIAppendLogToErrors on
See also:
・動作確認
Delphi で作った ISAPI モジュール (*.dll) を実フォルダ C:\Apache24\isapi\ に吐くようにするか、モジュールをコピーし、http://localhost/isapi/<ISAPI モジュール名> をブラウザで開きます。
このままですと、ISAPI モジュールは呼び出し毎にロード / アンロードされるため効率がよくありません。ISAPI モジュールをサーバー起動時にロードし、終了時にアンロードするためには ISAPICacheFile ディレクティブで ISAPI モジュールを指定します。
ISAPICacheFile isapi/mod_webbroker.dll
ただ、Apache HTTP Server で無理に ISAPI モジュールを使う必要はないかと思います。Delphi で Apache モジュール (共有オブジェクト) 向けにプロジェクトを作ってビルドすればいいだけですし、そちらの方がパフォーマンスも良好です。
おわりに
簡単に Apache HTTP Server のインストール方法と設定を紹介してみました。Delphi の関連書籍にも Apache HTTP Server の設定方法が載っていたりするのですが、多くの場合バージョンが古く現在のものとは設定方法が異なっています。
Linux 向けに「WebBroker のための Apache HTTP Server 導入 (Linux)」なんて記事をあえて書く必要はないかと思っています。
- Linux (x64) プラットフォーム向けにビルド
-
*.dllを*.soで読み替え - Linux 版 Apache HTTP Server に mod_ispi モジュールは存在しない (ISAPI モジュールは動作しない)
http.conf の書き方は同じなので、ちょっと読み替えればいいだけですしね。
書き忘れがあったら後で追記します。




