CGI

2013 年 6 月 4日 改訂
井上 潤

このページでは,CGI スクリプトを Mac で実行する際の注意事項を書いています.

CGI とは Common Gateway Interface の略で,Web サーバから別のプログラムを動かすための取り決めのことです.ブログや掲示板などの多くは CGI を利用して実行されるため,CGI プログラムと呼ばれます.Perl や Ruby などの言語が CGI プログラムによく使われます.ここで紹介する方法は,Mac Lion Server 10.7.2 と 10.6.8 で動作確認をしました.

Mac OS X には,Web ページを配信する Web サーバの代表格である「Apache」が 標準で組み込まれています.Apache によってホームページを公開したり CGI などの Web プログラムを実行することができます.


Web サーバの立ち上げ
実は Mac では Web 共有をオンにするだけで,Web サーバを立ち上げることができます.これによってディレクトリを公開したり,CGI プログラムを実行できるようになります.
 Mac OS X では,Web サーバ Apache によるホームページの公開を「Web 共有」と呼んでいます.システム環境設定 > 共有から,Web 共有をオンにしてください.右側にトップページのアドレスがリンクされます.

Mac は Mountain Lion になってから Web 共有がなくなりました.かわりに Server というアプリケーションによって設定を行うのですが,いまいち分かりにくいです.Mountain Lion でも ターミナルから以下のコマンドを打つことで,Web 共有が可能になります.

sudo apachectl start

こちらのページを参照しました.なお,Mountain Lion でも .conf ファイルを作成して Forbidden (403 のエラー) を回避することができるようです [2012 年 10 月].


職場がかわったら,上のコマンドでは apache が起動できなくなりました.httpd で起動したらうまく動きました.

[Napoli:~]$ sudo httpd -k start
httpd (pid 31452) already running

コマンドは「man httpd」で確認してください.アパッチの起動は以下で確認できます

inoue-no-MacBook-Air-2:~ root# ps -ef|grep http
0 2348 1 0:00.09 /usr/sbin/httpd -D FOREGROUND
70 2349 2348 0 9:21AM 9:21AM ?? 0 ?? 0:00.00 /usr/sbin/httpd -D FOREGROUND
70 2351 2348 0 9:21AM ?? 0:00.00 /usr/sbin/httpd -D FOREGROUND
0 2388 2328 0 9:27AM ttys000 0:00.00 grep http

この件に関しては OIST の IT 部門の方に助けていただきました.ありがとうございます (2013 年 4 月).


Web ページにアクセス
「共有」 > 「お使いのコンピュータ〜」に表示されたアドレスを押してください.あるいは,「http://localhost」でローカルホスト上で試すことも出来ます.「It works」などど表示されるはずです.

このファイルの場所は,Apache のメイン設定ファイルである/etc/apache2/httpd.conf に書かれています.

DocumentRoot "/Library/WebServer/Documents"

とされており,ここにある index.html.en がトップページとして読まれています. (「Library」フォルダは,は「ライブラリ」フォルダになっていました.)

ユーザごとのホームページ
「共有」 > 「ホームフォルダの"サイト"〜」に表示されたアドレスを押してください.ユーザごとのホームページが表示されます.これは ~/Sites/index.html が読み込まれています (「Sites」フォルダは,は「サイト」フォルダになっていました).


Apache の設定ファイル

httpd.conf などの設定ファイルを書き換えて,Apache のカスタマイズを行います.Apache の設定ファイルは

/etc/apache2

にあります.


重要: httpd.conf など設定を変える度に apache をリスタートする
httpd.conf など設定ファイルを変更した場合は,毎回以下のコマンドによって Apache を再起動する必要があります.

sudo apachectl restart

httpd の場合は以下です.

sudo service httpd restart



CGI 機能を ON にする.

Apache の設定ファイルを変更します.

/etc/apache2/httpd.conf

を開きます.スパコンでは「/etc/httpd/conf/httpd.conf」にあるので,どこに保存されているかはサーバーを作ったひとによるようです.

以下をコメントアウトして,CGI モジュールがロードされるようにする.

LoadModule cgi_module libexec/apache2/mod_cgi.so

469 行目あたりにある.

#AddHandler cgi-script .cgi

# を取り除きます.これによって .cgi という拡張子をもったプログラムが CGI プログラムであると判断されるようになります. perl と python のプログラムを付け加える場合は,以下です.

AddHandler cgi-script .cgi .pl .py

以上の操作だけだと,ScriptAlias ディレクティブで指定されているディレクトリ以下のプログラムだけが実行可能です.ユーザごとのホームページ以下の CGI プログラムも使えるようにするには,

/etc/apache2/users/JunInoue.conf

を変更します.ExecCGI を新たに加えてください.

<Directory "/Users/JunInoue/Sites/">
 Options Indexes MultiViews ExecCGI
 AllowOverride None
 Order allow,deny
 Allow from all
</Directory>

注意: Mac のコールセンターでは 0000_any_80_.conf ファイルを変更する,と言われました.きっと複数のユーザを一気に変更することができるのでしょう.


テストファイルを動かしてみる
test.cgi.tar.gz を

/Library/WebServer/CGI-Executables

にダウンロードして解凍してくださ.ターミナルから which perl を入力して perl のアドレスを確認し,適宜 #!/usr/bin/perl を書き換えてください.その後,

sudo chmod 755 test.cgi

として実行権を与えます.まずターミナルから動作確認を行います.

./test.cgi

次に,Sasfari などのブラウザから試します.ブラウザに以下のようなアドレスを与えてください. 太字にはウェブサイトのアドレスを書いてください.

http://fisheco1.aori.u-tokyo.ac.jp/cgi-bin/test.cgi

あるいは,

http://localhost/cgi-bin/test.cgi

としてローカルで動かすことも可能です.以下が出れば成功です.test.cgi は /Library/WebServer/CGI-Executables に保存されていますが,cgi-bin を付ける必要があります.CGI-Executables の場所は若干見つけにくいです.マックであれば,ウェブページを置いてある Site と同じディレクトリにあると思います.

[Napoli:Data]$ pwd
/Library/Server/Web/Data
[Napoli:Data]$ ls
CGI-Executables/ Sites/ WebApps/
[Napoli:Data]$ ls CGI-Executables/
010_blastQuery.txt 3Rblast.cgi* blastall*
020_blasRes.txt 3Rblast.cgi~* test.cgi*

あるいは少し時間がかかりますが,find で探しても良いです.

[Napoli:~]$ sudo find / -name CGI-Executables
/Library/Server/Web/Data/CGI-Executables

ユーザごとのホームページ置き場 (私の場合は /Users/JunInoue/Sites) から CGI プログラムを動かす場合は,

http://localhost/~JunInoue/test.cgi

というアドレスになります.



改行コードの変換

自作の perl script を system コマンドなどを用いて CGI プログラムとして走らせると,アウトファイルがの改行コードが Windows の改行コード (CRLF [\r\n]) になっていることがあります.アウトファイルをさらに他の script などで用いる場合は,改行コードを変換する必要があります.

Windows の改行コードをUNIX 標準の LF (ラインフィード) にするには,以下のコマンドを使います.perl で実行するには,system 関数を用いれば良いでしょう.

tr -d "\r" <wind.txt> > unix.txt

 

エラーログ

CGI の設定は,普通の html ファイルより手こずることが多いと思います.エラーログを見るようにすると,問題解決のヒントが得られることがよくあります.

Mac の場合,ローカル (例: http://localhost/~JunInoue/neko1.cgi) で CGI スクリプトを実行した場合,エラーログを確認すると問題点がわかることがあります.エラーログは,以下のコマンドで見れます.

tail -f /var/log/apache2/error_log


リンク

Mac OSX UNIX 活用大全

ここで紹介したかなりの部分は,この本に書かれていたものです.他にも,Mac で Unix を使っている方には,とても参考になることが書いてあります.Mac で CGI をやるには,この本がないと困難だと思います.

CGI Tutorial

Python の CGI コード.

超簡単 Mac OS X のローカルで CGI (SSI も PHP も)

SSi の設定.