26.5 CGIスクリプトを実行させる

ApacheのCGI (Common Gateway Interface)により、通常CGIスクリプトとして呼ばれるスクリプトまたはプログラムを含んだ動的コンテンツを作成できます。CGIスクリプトは、どのプログラム言語でも作成できます。通常、PerlまたはPHPなどのスクリプト言語が使用されます。

ApacheがCGIスクリプトによって作成されたコンテンツを配信できるようにするには、mod_cgiを有効化する必要があります。 また、mod_aliasも必要です。デフォルトでは、両モジュールとも有効化されています。モジュールの有効化の詳細については、26.4.2項 「有効化と無効化」を参照してください。

[Warning]CGIセキュリティ

サーバがCGIスクリプトを実行できるようになると、潜在的なセキュリティホールが発生します。詳細については、26.7項 「セキュリティ問題の回避」を参照してください。

26.5.1 Apacheの設定

SUSE Linuxでは、CGIスクリプトの実行は、/srv/www/cgi-bin/ディレクトリ内でのみ許可されています。この場所は、すでにCGIスクリプトを実行するように設定されています。仮想ホスト設定を作成しておらず(26.2.1.2項 「仮想ホスト設定」を参照)、ホスト固有のディレクトリにスクリプトを配置する場合は、このディレクトリのロックを解除し、設定する必要があります。

例 26.5 VirtualHost CGIの設定

ScriptAlias /cgi-bin/ "/srv/www/example.com_cgi-bin/"1

<Directory "/srv/www/example.com_cgi-bin/">
 Options +ExecCGI2
 AddHandler cgi-script .cgi .pl3
 Order allow,deny4
 Allow from all
</Directory>
    
1

このディレクトリ内のすべてのファイルをCGIスクリプトとして処理するようにApacheに指示します。

2

CGIスクリプトの実行を有効化します。

3

.plおよび.cgiの拡張子が付いたファイルをCGIスクリプトとして処理するようにサーバに指示します。必要に応じて調整します。

4

Order Allowディレクティブは、デフォルトのアクセス状態、およびこれらのディレクティブが評価される順序を制御します。この場合、「allow」文およびすべての場所からのアクセスが有効化される前に、「deny」文が評価されます。

26.5.2 テストスクリプトの実行

CGIプログラミングは通常のプログラミングとは異なり、CGIプログラムとスクリプトの前にContent-type: text/htmlなどのMIMEタイプヘッダを記述する必要があります。このヘッダはクライアントに送信され、クライアントは、受信したコンテンツによってコンテンツの種類を識別します。次に、このスクリプトの出力は、通常、Webブラウザなどのクライアントが認識できる形式(たいていの場合はHTML、プレーンテキスト、画像など)でなければなりません。

Apacheパッケージの一部として、/usr/share/doc/packages/apache2/test-cgi内に簡単なテストスクリプトが含まれています。このスクリプトは、いくつかの環境変数の内容をプレーンテキストとして出力します。このスクリプトを/srv/www/cgi-bin/か、仮想ホストのスクリプトディレクトリ(/srv/www/example.com_cgi-bin/)のいずれかにコピーし、「test.cgi」という名前を付けます。

Webサーバによってアクセス可能なファイルは、rootユーザによって所有される必要があります(詳細については、26.7項 「セキュリティ問題の回避」を参照)。Webサーバは別のユーザ名で実行しているので、CGIスクリプトはworld-executableおよびworld-readableである必要があります。CGIディレクトリに移動し、chmod 755 test.cgiコマンドを使用して適切なパーミッションを適用します。

次に、http://localhost/cgi-bin/test.cgiまたはhttp://example.com/cgi-bin/test.cgiを呼び出します。「CGI/1.0 test script report」を参照してください。

26.5.3 トラブルシューティング

テストプログラムの出力の代わりにエラーメッセージが表示される場合は、以下を確認します。

CGIトラブルシューティング

  • 設定を変更した後、サーバを再ロードしましたか?rcapache2 probeを使用して確認します。

  • カスタムCGIディレクトリを設定した場合、適切に設定されていますか?不明な場合は、デフォルトのCGIディレクトリの/srv/www/cgi-bin/内にあるスクリプトを実行し、http://localhost/cgi-bin/test.cgiを呼び出します。

  • ファイルのパーミッションは正しいですか?CGIディレクトリに移動し、ls -l test.cgiを実行します。その出力が以下で始まっているかどうかを確認します。

    -rwxr-xr-x  1 root root
         
  • そのスクリプトにプログラミングエラーがないかどうか確認します。test.cgiを変更しなかった場合は該当しませんが、独自のプログラムを使用する場合は、常にプログラミングエラーがないかどうか確認してください。