Webサイトを作っていると、「CGIファイル」という言葉を耳にすることがあるでしょう。拡張子が.cgiや.plのファイルを見かけたことはないでしょうか。CGIはWebサーバー上でプログラムを動かすための仕組みであり、フォームの送信処理やアクセスカウンターなど、古くから多くのWebサイトで活躍してきました。
しかし、CGIファイルとは具体的に何なのか、どこに置けばいいのか、パーミッションはどう設定するのかなど、初めて触れる方には疑問が多いはずです。本記事では、CGIファイルの種類・拡張子・配置場所・実行権限・MIMEタイプまで、わかりやすく解説していきます。
CGIファイルとは?その正体と役割をひとことで言うと
それではまず、CGIファイルとは何かという基本から解説していきます。
CGIファイルとは、Webサーバーが受け取ったリクエストに応じて実行されるプログラムファイルのことです。CGIはCommon Gateway Interfaceの略称であり、サーバーとプログラムの間で情報をやり取りするための「共通の窓口」として機能します。
ブラウザからURLにアクセスすると、通常はHTMLファイルがそのまま返されます。一方、CGIファイルにアクセスした場合は、サーバーがそのファイルを「プログラム」として実行し、その出力結果をHTMLとしてブラウザに返す仕組みになっています。
CGIファイルは「静的なHTML」ではなく、サーバー上で動的に処理を行う実行可能なプログラムファイルです。フォームの入力内容を処理したり、データベースと連携したりと、ユーザーの操作に応じた動的なレスポンスを返すことができます。
CGIが登場した1990年代には、動的なWebコンテンツを実現するほぼ唯一の手段として広く普及しました。現在はPHPやRuby on Railsなどの技術に置き換えられつつありますが、今でもレンタルサーバーなどでCGIが使われているケースは少なくありません。
CGIファイルの拡張子の種類一覧
CGIファイルには、使用するプログラミング言語によってさまざまな拡張子があります。代表的なものを以下の表で確認してみましょう。
| 拡張子 | 言語 | 特徴 |
|---|---|---|
| .cgi | 汎用(Perl・Pythonなど) | CGIプログラムであることを明示する最も一般的な拡張子 |
| .pl | Perl | CGI黎明期に最も普及した言語。テキスト処理が得意 |
| .py | Python | 近年人気が高い。cgitbモジュールでデバッグも容易 |
| .rb | Ruby | 日本発の言語。CGIライブラリが標準で付属 |
| .sh | シェルスクリプト | Unixコマンドを組み合わせた簡易的な処理に使用 |
拡張子が.cgiの場合、ファイルの1行目に記述されたシェバン(後述)によって実行される言語が決まります。拡張子はあくまでファイルの識別に使われるものであり、実際の処理はシェバンとファイルの内容によって決定されます。
シェバンとは?CGIファイルの1行目の意味
CGIファイルの先頭には、必ずといっていいほど次のような記述があります。
#!/usr/bin/perl
# Perlを使用する場合のシェバン
#!/usr/bin/python3
# Python3を使用する場合のシェバン
#!/usr/bin/ruby
# Rubyを使用する場合のシェバン
この#!(シェバン、またはシバン)から始まる1行目は、「このファイルをどのプログラムで実行するか」をサーバーに伝えるための重要な記述です。シェバンが間違っていると、CGIは正しく動作せずエラーになってしまいます。
Perlの場合は#!/usr/bin/perl、Pythonの場合は#!/usr/bin/python3が一般的ですが、サーバーによってインストール場所が異なることもあります。which perlなどのコマンドで確認するとよいでしょう。
MIMEタイプの出力が必要な理由
CGIプログラムは、HTMLを出力する前に必ずMIMEタイプ(Content-Type)を宣言する必要があります。これはブラウザに「これから送る内容の種類」を伝えるためのものです。
#!/usr/bin/perl
# Content-Typeの宣言(必須)
print "Content-Type: text/html\n\n";
print "";
print "
アボカドの在庫数:42個
“;
print ”
";
Content-Type: text/htmlの後には必ず空行(\n\n)が必要です。この空行がないと、サーバーはヘッダーの終わりを認識できず、500エラーが発生してしまいます。HTMLではなくJSONを返す場合はContent-Type: application/json、テキストのみならContent-Type: text/plainを指定します。
CGIファイルの配置場所はどこが正しいのか
続いては、CGIファイルをどこに置けばよいのかを確認していきます。
CGIファイルは、Webサーバーの設定によって実行が許可されたディレクトリにのみ配置できます。適切な場所に置かなければ、ブラウザからアクセスしてもプログラムとして実行されず、ソースコードがそのまま表示されたり、エラーになったりしてしまいます。
cgi-binディレクトリの役割と特徴
cgi-binは、CGIスクリプトを置くために設けられた専用ディレクトリです。多くのWebサーバー(特にApache)では、デフォルト設定で/var/www/cgi-bin/や/usr/lib/cgi-bin/がCGI実行可能なディレクトリとして設定されています。
| 環境 | cgi-binの一般的なパス |
|---|---|
| Apache(Linux) | /var/www/cgi-bin/ または /usr/lib/cgi-bin/ |
| レンタルサーバー(共用) | ~/public_html/cgi-bin/ など |
| ローカル開発環境(XAMPP) | C:\xampp\cgi-bin\ |
cgi-binに配置されたファイルは、ブラウザからhttps://example.com/cgi-bin/script.cgiのようなURLでアクセスできます。このディレクトリ内のファイルは実行対象として扱われるため、セキュリティ上の管理が特に重要なポイントになります。
cgi-bin以外にCGIを配置する方法
Apacheの設定を変更すれば、cgi-bin以外の場所でもCGIを実行できます。.htaccessファイルに以下のように記述することで、特定のディレクトリやファイルに対してCGI実行を許可できます。
# .htaccessでCGI実行を許可する設定
Options +ExecCGI
AddHandler cgi-script .cgi .pl .py
ただし、サーバーの設定でAllowOverrideが許可されていないと.htaccessの設定は反映されません。また、セキュリティリスクが高まるため、不要なディレクトリへのCGI実行許可は避けるのが基本です。
レンタルサーバーでのCGI配置の注意点
レンタルサーバーを利用している場合、CGIファイルの配置場所はサービスによって異なります。多くの場合、管理画面やFAQで「CGIが使えるディレクトリ」が明示されているので、必ず確認してから配置しましょう。
また、レンタルサーバーではPerlやPythonのインストールパスがサーバーごとに異なることもあります。シェバンを書く際には、サポートページで公式のパスを確認することが大切です。間違ったパスを指定するだけで500エラーが発生してしまうため、注意が必要でしょう。
CGIファイルの実行権限(パーミッション)の設定方法
続いては、CGIファイルを動かすうえで欠かせないパーミッションの設定について確認していきます。
CGIファイルは、ただ配置するだけでは動作しません。Linuxのファイルシステムでは、ファイルごとに「誰が・何をできるか」という実行権限(パーミッション)を設定する必要があります。
755と705の違いと使い分け
CGIファイルに設定するパーミッションとして最もよく使われるのが755です。数字の意味は以下の通りです。
| 数値 | 対象 | 読み取り | 書き込み | 実行 |
|---|---|---|---|---|
| 7 | オーナー(自分) | ○ | ○ | ○ |
| 5 | グループ | ○ | × | ○ |
| 5 | その他(Webサーバー) | ○ | × | ○ |
Webサーバーは「その他」のユーザーとしてファイルを実行するため、3桁目に実行権限(1)が含まれていることが必須です。755であれば、オーナー・グループ・その他すべてに実行権限が与えられます。
chmodコマンドでの設定方法
パーミッションの変更にはchmodコマンドを使います。
# CGIファイルに755のパーミッションを設定する
chmod 755 script.cgi
# 確認コマンド
ls -l script.cgi
# 出力結果:-rwxr-xr-x 1 user group 1234 Jan 1 12:00 script.cgi
FTPソフトを使っている場合は、ファイルを右クリックして「パーミッション変更」や「属性変更」から数値で755を入力するだけで設定できます。コマンドが使えない環境でも対応可能でしょう。
パーミッション設定時のセキュリティ注意点
パーミッションに関してはセキュリティ上の注意点もあります。777(全員に読み書き実行を許可)は絶対に避けるべき設定です。外部から書き込みが可能になり、悪意のあるコードを注入されるリスクが生じます。
CGIファイルのパーミッションは755が基本。データを書き込むログファイルや一時ファイルには666や600を使い分けましょう。書き込み可能なファイルに実行権限を与えることは、セキュリティ上の重大なリスクになります。
また、cgi-binディレクトリ自体のパーミッションも適切に設定する必要があります。ディレクトリには通常705または755を設定し、外部からの不正アクセスや改ざんを防ぐことが重要です。
CGIファイルに関するよくあるトラブルと対処法
続いては、CGIファイルを扱う際によく発生するトラブルと、その解決方法を確認していきます。
CGIは設定が少しでも間違うとすぐにエラーになる、デリケートな仕組みです。特に初心者の方が躓きやすいポイントを押さえておきましょう。
500 Internal Server Errorの主な原因
500エラーはCGIで最もよく遭遇するエラーです。主な原因としては以下が挙げられます。
| 原因 | 対処法 |
|---|---|
| シェバンのパスが間違っている | which perl などで正しいパスを確認 |
| パーミッションが755になっていない | chmodで755に設定し直す |
| Content-Typeの後に空行がない | \n\nの2つ改行を確認 |
| 文字コードの問題(BOM付きUTF-8) | BOMなしUTF-8で保存し直す |
| Windowsの改行コード(CRLF) | LFに変換して保存する |
特に改行コードの問題は見落としがちです。WindowsのエディタでCGIファイルを作成すると、改行コードがCR+LF(\r\n)になってしまい、Linuxサーバーでは正しく認識されないことがあります。
ファイルがダウンロードされてしまう場合の対処
CGIにアクセスしたときにプログラムが実行されず、ファイルがそのままダウンロードされてしまう場合は、MIMEタイプの設定が原因であることが多いでしょう。
Apacheの設定でCGIとして認識させるには、AddHandlerやScriptAliasが正しく設定されている必要があります。レンタルサーバーの場合は、コントロールパネルでCGI実行が有効になっているか確認してみましょう。
デバッグ時に役立つエラー確認方法
CGIのエラーを調べるには、サーバーのエラーログを確認するのが最も確実な方法です。Apacheの場合、エラーログは通常/var/log/apache2/error.logや/var/log/httpd/error_logに記録されます。
# Apacheのエラーログをリアルタイムで確認
tail -f /var/log/apache2/error.log
# 出力結果:[error] [pid 12345] script not found or unable to stat: /var/www/cgi-bin/test.cgi
Perlスクリプトの場合は、コマンドラインから直接実行することで構文エラーを確認できます。
# Perlの構文チェック(-cオプション)
perl -c script.cgi
# 出力結果:script.cgi syntax OK
まとめ
本記事では、CGIファイルの基本的な意味から、拡張子の種類(.cgi・.pl・.py・.rb)、配置場所(cgi-bin)、実行権限(パーミッション・755・chmod)、MIMEタイプの出力方法まで幅広く解説しました。
CGIファイルを正しく動かすためのポイントは、シェバンの記述・適切な配置場所・755のパーミッション設定・Content-Typeの正確な出力の4つに集約されます。どれか一つでも欠けると500エラーに直結してしまうため、順を追って確認する習慣をつけましょう。
現在はPHPやNode.jsなどより便利な技術が普及していますが、CGIの仕組みを理解しておくことはWebの基礎知識として今でも十分に価値があります。古いシステムのメンテナンスや、CGIしか使えないレンタルサーバー環境での開発にも役立てていただければ幸いです。