CGI

2024 年 8 月 27 日 井上 改訂

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

CGI とは Common Gateway Interface の略で,Web サーバから別のプログラムを動かすための取り決めのことです.Perl や Ruby などの言語が CGI プログラムによく使われます.

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

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

ターミナルから以下のコマンドを打つことでも,Web 共有が可能になります.

sudo apachectl start

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


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

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

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

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 などの設定ファイル (ubuntu は apache2.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

次に、.cgi という拡張子をもったプログラムが CGI プログラムであると判断されるようにします。以下の行のコメントアウトを解除します。

#AddHandler cgi-script .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 ファイルを変更する,と言われました.きっと複数のユーザを一気に変更することができるのでしょう.


その他の設定

Timeout 600

31 行目あたりにある,ServerRoot "/usr" の下に書き込みましょう.これによって,サーバーが対応 (計算) する 上限を設定できます.

サーバーの名前を,#ServerName www.example.com:80の下に書きました.

ServerName XXXXXnoMacBook-Pro.local

Documents ディレクトリの名前を html に変更したので,以下の 2 行を変更しました.

DocumentRoot "/Library/WebServer/Documents"
<Directory "/Library/WebServer/Documents">
=> (以下のように変更)
DocumentRoot "/Library/WebServer/html"
<Directory "/Library/WebServer/html">

[inouejunmp:WebServer]$ pwd
/Library/WebServer
[inouejunmp:WebServer]$ ls
CGI-Executables/ html/ share/

Python などスクリプトを置く場所を指定?しました.

ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) "/Library/WebServer/CGI-Executables/$1"
=> (以下のように変更)
#ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) "/Library/WebServer/CGI-Executables/$1"
ScriptAlias /cgi-bin/ "/Library/WebServer/CGI-Executables/"

以下の行の # を取り外して,アクティブにしました.

#LoadModule userdir_module libexec/apache2/mod_userdir.so
#LoadModule php7_module libexec/apache2/libphp7.so

#LoadModule cgi_module libexec/apache2/mod_cgi.so

設定が終わったら、httpd をリスタートします。

sudo service httpd restart

 


テストファイルを動かしてみる
test.cgi.tar.gz をダウンロード&解凍して,得られた test.cgi を

/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

としてローカルで動かすことも可能です.以下が出れば成功です.

スクリプトがそのまま表示されてしまった場合は,以下によって Apache を再起動してください.

sudo apachectl restart

それでも治らない場合は,httpd.conf ファイルをもう一度,見直してください.

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

というアドレスで実行できるはずです.

html と cgi-bin ディレクトリの所有者と権限

Linux:
ディレクトリの所有者と権限は以下のように設定します。以下では cgi-bin ディレクトリだけですが、html ディレクトリも同様の処理をおこないます。こちらを参考にしました。

[osaka USERNAME:www]$ pwd
/var/www
[osaka USERNAME:www]$ sudo chown apache:USERNAME cgi-bin
[osaka USERNAME:www]$ sudo chmod 775 cgi-bin
[osaka USERNAME:www]$ ls -ltr
drwxrwxr-x 4 apache USERNAME 4096 7月 27 14:24 html
drwxrwxr-x 3 apache USERNAME 4096 7月 27 16:14 cgi-bin

Mac:
apache は _www という名前です。「ps aux | grep httpd」でも確認できます。httpd.conf にも

User _www
Group _www

という記述があります。

[inouejun:WebServer]$ pwd
/Library/WebServer
[inouejun:WebServer]$ sudo chown _www:wheel CGI-Executables
[inouejun:WebServer]$ sudo chmod 775 CGI-Executables
[inouejun:WebServer]$ ls -ltr
drwxr-xr-x 3 root wheel 96 1 1 2020 share
drwxrwxr-x 5 _www wheel 160 1 1 2020 Documents
drwxrwxr-x 2 _www wheel 64 1 1 2020 CGI-Executables


改行コードの変換

自作の 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


Ubuntu 18 での CGI 設定

こちらを参照しました.ありがとうございました (2019 年 8 月).

それぞれのサーバーにインストールされている apache2 に関する説明が/var/www/html/index.html にあります。

apache2.4 であれば、http://httpd.apache.org/docs/2.4/ に詳細なドキュメントがあります。

Timeout に関しては、こちらが参考になります。

1. フォルダcgi-binの作成

mkdir で作成しました.

jun-inoue@yamasati:/var/www/html$ pwd
/var/www/html
jun-inoue@yamasati:/var/www/html$ ls
cgi-bin chr1.txt indexDefault.html MS10_Ens97
chr1.html Figs index.html sequences

2. mods-available内にある cgi.load を利用できるようにする

mods-enabled ディレクトリ内部に,にmods-available内のcgi.loadへのシンボリックリンクが無いのを確認する.その後,以下のコマンドでシンボリックリンクを作成する.

sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load

以下で確認.

jun-inoue@yamasati:/etc/apache2/mods-enabled$ ls -l cgi.load
lrwxrwxrwx 1 root root 36 Aug 23 14:19 cgi.load -> /etc/apache2/mods-available/cgi.load

3. serve-cgi-bin.confの編集

jun-inoue@yamasati:/etc/apache2/conf-enabled$ ls
charset.conf localized-error-pages.conf other-vhosts-access-log.conf security.conf serve-cgi-bin.conf

jun-inoue@yamasati:/etc/apache2/conf-enabled$ pwd
/etc/apache2/conf-enabled

jun-inoue@yamasati:/etc/apache2/conf-enabled$ vim serve-cgi-bin.conf

4. cgiプログラムの作成

jun-inoue@yamasati:/var/www/html/cgi-bin$ ls
hello.cgi
jun-inoue@yamasati:/var/www/html/cgi-bin$ cat hello.cgi
#!/usr/bin/perl

print "Content-type: text/html\n";
print "\n";
print "Hello World\n";

5. パーミッションの設定

chmod 755 hello.cgi

6. apache のリスタート

sudo apachectl restart

7.実行

ブラウザのアドレスバーに

localhost/cgi-bin/hello.cgi

と入力し実行.

 

textarea を用いた文字の入力

https://www.fish-evol.org/test_CGI_textarea/test_CGI_textarea.html

Python for bioinformatics 10 章にある例題です.例題はこちらからダウンロード可能です.

ファイルの設定場所は以下.
/var/www/cgi-bin/test_CGI_textarea.py
/var/www/html/test_CGI_textarea.html.txt
(.txt を取り除いて、test_CGI_textarea.html として設置)

Python のスクリプトは,以下によって実行可能権を変更する必要があります.

chmod 755 test_CGI_textarea.py

2019 年 9 月

ajax と FieldStrage() のチェック

https://fish-evol.org/test_ajax_FieldStrage.html

ファイルの設定場所は以下です。
/var/www/cgi-bin/test_ajax_FieldStrage.py
/var/www/html/test_ajax_FieldStrage.html.txt

上記は Ubuntu24.04, apache2 での動作確認です。Apache/2.4.58 (Ubuntu) では動きました。しかし、このサイトは Nginx を用いているので、405 のエラーが出ます: "405 Not Allowed nginx/1.18.0 (Ubuntu)"。おそらく NGINX がスタティックなページ (ここでは、test_ajax_FieldStrage.html) では、POST が使えないためです (こちらを参照)。

なお、NGINX であってもスタティックなページを利用せず .py から直接であれば、表示されます。

https://fish-evol.org/cgi-bin/test_ajax_FieldStrage.py?key=aaa

(2024 年 7 月)。

 

Chown
https://egapool.hatenablog.com/entry/2013/11/29/184300

リンク

[JQuery] Ajax が使える状態かどうかチェックする方法

python CGI でクエリが取得できない

cgi.FieldStorage() が動くかチェックする。

CentOS のポート開放のやり方

サーバーから、http や ssh などのサービスを開始するには、firewall の設定を変更し、ポートを開放する必要がある。

Mac OSX UNIX 活用大全

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

CGI Tutorial

Python の CGI コード.

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

SSi の設定.

CMAN

サーバー監視/ネットワーク監視サービス。ドメインネームと IP アドレスの関連を調べる。