IISはMicrosoft Internet Information Servicesの略で、Windows標準のウェブサーバーである。VisualStudioで作成したプログラムを実行することに適した環境である。Windows10ではIISのバージョンは10.0である。IISマネージャーの実体は inetmgr.exe である。
Apache HTTP Server、Nginxと競合している。
このページではCGI(Common Gateway Interface) とISAPIを中心に解説する。
Windowsの初期状態では、IISは有効化されていない。コントロールパネルから[プログラムと機能]>[Windowsの機能の有効化または無効化]からIISを有効にする。
[インターネット インフォメーション サービス]>[World Wide Web サービス]>[World Wide Web サービス]>[アプリケーション開発機能]内の「ASP.NET 4.8」と「CGI」にチェックを入れてCGIを有効にでき、「ISAPI 拡張」にチェックを入れてISAPI拡張を有効にできる。
クラシックモードはIIS6.0での処理方法であり、統合モードはIIS7.0での処理方法である。クラシックモードではIISではISAPI内のAspnet_isapi.dllによってフォーム認証、Windows認証、マップハンドラ(ASPXとTraceなど)を処理する。
統合モードではASPXはAspnet_isapi.dllを使わずに処理することができる。
IISのウィンドウは左ペイン、中央ペイン、右ペインに大きく分かれている。左側にサイト構成のツリービュー、中央のコンテンツ、右側に操作が配置されている。
左ペインのサイト構成はWindows10の場合、ツリートップがサーバー、配下に各サイト、サイトの配下にはフォルダや仮想ディレクトリが配置される。
ツリートップのサーバーの右ペインで[サーバーの管理]の[開始]をクリックするとサーバーが起動し、[停止]をクリックするとサーバーが停止する。サイト([Defalt Web Site]など)についても同様、[Web サイトの管理]の[開始]をクリックするとサイトがウェブブラウザからアクセス可能状態になり、[停止]をクリックするとアクセス不可になる。ブラウザからサイトを見れるようにするには、サーバーとサイトの両方で[開始]をクリックすればよい。
公開するフォルダの設定し、フォルダ以下のファイルをIISからアクセスできるようにする。
「資格情報の設定」ができていない場合は、ブラウザで開いたときに「アクセスが拒否されました。」エラーが表示される。
1.[サイト]の[Default Web Site]をクリックし、右ペインの[基本設定]の基本設定をクリックする。
[サイトの編集]ウィンドウが表示される。
2.[物理パス]を入力し、次に[接続]ボタンをクリックする。
[接続]ウィンドウが表示される。
3.[特定ユーザー]にチェックし、[設定]ボタンをクリックする。
[資格情報の設定]ウィンドウが表示される。
4.[ユーザー名]と[パスワード]にアカウント情報を入力する。
5.ウィンドウの[OK]ボタンをクリックしていき、3つのウィンドウすべてを閉じる。
IISは特殊なセキュリティトークンを用いてファイルへアクセスする。そのため、トークンに対するアクセス許可を公開フォルダに設定する。
アクセス許可がない場合は、ブラウザで開いたときに「アクセスが拒否されました。」エラーが表示される。
1.公開フォルダ(rootフォルダとする)を右クリックし、[プロパティ]をクリックする。
[root のプロパティ]ウィンドウが表示される。
2.[セキュリティ]タブをクリックし、[編集]ボタンをクリックする。
[root のアクセス許可]ウィンドウが表示される。
3.[追加]ボタンをクリックする。
[ユーザー または グループ の選択]ウィンドウが表示される。
4.[選択するオブジェクト名を入力してください]欄に「IIS AppPool\DefaultAppPool」と入力し、[名前を確認]ボタンをクリックする。※「DefaultAppPool」の部分はアプリケーションプール(ワーカープロセス関連付け)の名前である。
5.ウィンドウの[OK]ボタンをクリックしていき、3つのウィンドウすべてを閉じる。
CGIはWebページの生成にWebサーバーから外部プログラムを呼び出しを行う。プロセスを生成にCPUコストが重いが、自由にプログラムを起動でき便利である。セキュリティホールには注意が必要である。
例として以下のようなプログラムをビルドする。
#include <stdio.h>int main(){ printf("Content-type: text/html\n\n"); printf("Hello World!"); return 0;}作成した実行可能ファイル ( .exe)をCGI用のフォルダ等に配置する。
CGIフォルダを仮想ディレクトリに設定する
1.サイトをクリックする。
2.右ペインの[アプリケーションの表示]をクリックし、[アプリケーションの追加...]をクリックする。
(1~2手順はサイトを右クリックして、[アプリケーションの追加...]をクリックでも良い。)
[アプリケーションの追加ウィンドウ]が表示される。
3.[エイリアス](cgiなど、任意。cgiとして説明する)と[物理パス]を入力する。
※[エイリアス]と[物理パス]のフォルダ名が同一の場合、プログラムを実行できないことがあるので注意。
4.[OK]ボタンをクリックする。
以上で[Default Web Site]配下に「エイリアス名の」仮想ディレクトリが作成される。
CGI設定手順 1に続いて、ハンドラマッピングを設定する。
1.仮想ディレクトリ[cgi]をクリックし、中央ペインの[ハンドラー マッピング]をダブルクリックする。
[モジュールマップの編集]ウィンドウが表示される。
2.[要求の制限]ボタンをクリックする。
[要求の制限]ウィンドウが表示される。
3.[アクセス]タブをクリックし、[実行]にチェックを入れる。
4.ウィンドウの[OK]ボタンをクリックしていき、2つのウィンドウすべてを閉じる。
5.右ペインの[機能のアクセス許可の編集...]をクリックする。
6.[実行]チェックを入れて、[OK]ボタンをクリックする。
CGI設定手順 2に続いて、プログラム実行許可を設定する。
1.IISホームをクリックし、中央ペインの[ISAPI および CGI の制限]をダブルクリックする。
2.右ペインの[追加...]をクリックする。
[ISAPI または CGI の制限の追加]ウィンドウが表示される。
3.[ISAPI または CGI パス]にプログラムのパスを入力する。(右のボタンからフォルダを開くダイアログを利用できる。)また任意に[説明]を入力し、[拡張パスの実行を許可する]にチェックし、[OK]ボタンをクリックする。
また、必要であればプログラムに「公開フォルダのセキュリティ設定」のようなセキュリティ設定を行う。
バッチ(bat)ファイルの場合はスクリプトとして実行する。バッチファイルの例として「Hello, World!」と表示するコードを示す。作成したバッチファイルを公開フォルダ内に配置する。
@echo offecho Content-Type: text/htmlecho.echo.echo Hello, World!exitIISで初期状態ではバッチファイルを実行するためのハンドラーマッピングがないので設定する。
1.[ハンドラー マッピング]の操作から[スクリプトマップの追加...]をクリックする。
2.[要求パス]には「*.bat」と入力し、[実行可能ファイル]には「%windir%\system32\cmd.exe /c %s %s」と入力する。[名前]は任意で私は「BatScript」と入力しておいた。[要求の制限]ボタンがあるが[アクセス]がスクリプトなのでクリック(変更)しなくてもよい。入力が終わったら、[OK]ボタンをクリックする。
[ISAPIおよびCGIの制限]とは連動しているため自動的に入力される。説明は任意に入力可能である。[拡張バスの実行を許可する]にチェックが入っていないと、「HTTP エラー 404.2 - Not Found」エラーが表示される。
ISAPIファイルはDLLとして用意する必要がある。IISではこれをワーカープロセス上で実行する。DLLでは3つのエクスポート関数が必要である。
・BOOL WINAPI GetExtensionVersion(LPHSE_VERSION_INFO pVer)
・DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpECB)
・BOOL WINAPI TerminateExtension(DWORD dwFlags)
作成したDLLを公開フォルダ内に配置する。
また、[Windowsの機能の有効化または無効]の設定で、[インターネットインフォメーションサービス]>{World Wide Web サービス]>[アプリケーション開発機能]の[ISAPI 拡張]にチェックを入れておく。
1.配置されているフォルダ、または使用しているなら仮想ディレクトリを選択し[機能のアクセス許可の編集...]をクリックする。
[機能のアクセス許可の編集]ウィンドウが表示される。
2.[実行]にチェックを入れ、[OK]ボタンをクリックする
1.IISホームから[ISAPI および CGI の編集]をダブルクリックする。
2.操作の[追加]をクリックする。
3.[ISAPI または CGI パス]にDLLパスを入力し、[説明]を任意入力し、[拡張パスの実行を許可する]にチェックし、[OK]ボタンをクリックする。
ページを開いてみて「HTTP エラー 500.0 - Internal Server Error」が出るようであれば、32ビット/64ビットを切り替える必要がある。DLLを変えることもできる。IIS側の切り替える場合は以下の手順を行う。
1.[アプリケーションプール]をクリックする。
2.[アプリケーションプールの既定値の設定...]をクリックする。
3.[32ビットアプリケーションの有効化]のTrue/Falseを切り替える。
参考リンク:IIS Tomcat 連携
現在の設定はタスクマネージャーからも確認できる。[プロセス]タブの「IIS Worker Process」に「(32ビット)」があればDLLも32ビットでなければならず、なければ64ビットでなければならない。
因みに、VisualStudioでDLLの32ビット/64ビットの切り替えは、プロジェクトを右クリックし、[プラットフォーム]を切り替えればよい。