Cgi Apache

CGI Apache httpd #

CGIプログラムをテストする環境をApache httpdを使って作ります。

CGI #

CGI (Common Gateway Interface)はWebサーバーがサーバー上でプログラムを実行する仕組みです。

今回はWebサーバーにApache httpdを使い、CGIプログラムを実行できる環境を作成します。

httpdはDockerで動かすことにします。

まずは設定ファイルhttpd.confをmy-httpd-orig.confというファイル名しにして取り出します。

docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > my-httpd-orig.conf

取り出しが設定ファイルを編集してCGIを有効にします。ここではCGIに加えてSSIも有効にしています。また、CGIへのルーティングを.htaccessファイルで行えるようにします。

CGIを有効にする設定

LoadModule cgid_module modules/mod_cgid.so
LoadModule cgi_module modules/mod_cgi.so
Options Indexes FollowSymLinks Includes ExecCGI
AddHandler cgi-script .cgi

SSIを有効にする設定

LoadModule include_module modules/mod_include.so
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

.htaccessを使えるようにする設定

AllowOverride All

Dockerfile #

httpのDockerイメージをベースにして、CGIプログラムの実行環境として、PythonとRubyをインストールしました。

実際に使用するサーバー環境と合わせるために、/usr/local/binにpythonとrubyのシンボリックリングを作っています。

httpが公開するスタティックファイルはコンテナ内の /usr/local/apache2/publicディレクトリとなりますが、CGIプログラムの本体自体は公開する必要がないため、ここでは/usr/local/apache2/privateディレクトリを作り、このディレクトリにCGIプログラムを置くことにします。

FROM httpd:2.4
RUN apt update \
    && apt upgrade -y \
    && apt install -y python3 python3-pip python-is-python3 ruby \
    && ln -s /usr/bin/python /usr/local/bin/python \
    && ln -s /usr/bin/ruby /usr/local/bin/ruby
COPY ./my-httpd.conf /usr/local/apache2/conf/httpd.conf
RUN mkdir -p /usr/local/apache2/private

イメージをビルドします。

docker build -t my-apache2 .

コンテナを起動します。

docker run -dit --name my-apache-app -p 8080:80 -v %~dp0public:/usr/local/apache2/htdocs/ -v %~dp0private:/usr/local/apache2/private/ my-apache2

ここで%~dp0は現在のディレクトリの意味です($PWDと同等)。

現在のディレクトリのpublic以下にhtmlなどWebサーバーが公開するファイルを置き、private以下にCGIプログラムなど、公開する必要のないファイルを置くことにします。

コンテナを起動した後で、ウェブブラウザでhttp://localhost:8080/にアクセスすると、publicディレクトリに置いたファイルが表示されます。

CGIプログラム #

CGIプログラムはファイル名を.cgiとします。

下のようなRubyプログラムをpublic/hello.cgiに保存します。

#!/usr/local/bin/ruby
print "Content-Type: text/html\n\n"
print "hello from RUBY\n"

ブラウザでhttp://localhost:8080/hello.cgiにアクセスすると

hello from RUBY

と表示されます。

これでCGIプログラムを実行できる環境ができました。

SSI #

SSI (Server Side Includes)もCGIのようにWebサーバーがプログラムを実行する仕組みのひとつです。

HTMLファイルを.shtmlというファイル名にすることで、そのHTMLファイル内でSSIが有効になります。

public/ssi.shtmlとして下のような内容を保存します。

<!DOCTYPE html>
<html>
<body>
<p><!--#echo var="DATE_LOCAL" --></p>
<p><!--#exec cmd="python --version" --></p>
<p><!--#exec cmd="ruby --version" --></p>
</body>
</html>

ブラウザでhttp://localhost:8080/ssi.shtmlにアクセスすると

Saturday, 13-Jul-2024 01:57:27 UTC

Python 3.11.2

ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux-gnu]

のように表示され、SSIによりプログラムの実行結果が反映されていることがわかります。