FastCGIとは何か?

エックスサーバーのページに「FastCGI」の記載がありました。

  • FastCIGとは何か?
  • レンタルサーバーでどのように「FastCGI」を利用できるのか?

調べてみました。

FastCGIでサーバーがこうなった

  • FastCGIでプログラムの処理スピードが上がった
  • サーバーの負荷が下がった

処理スピードが上がり、負荷が下がる、いいことずくめです。

簡単に言うと「早くなったCGI」です。

そもそも「CGI」とは何なのか?

レンタルサーバーの勉強をしていると「CGI」という用語をよく聞くと思います。

CGIとは「Common Gateway Interface」の略です。

CGIとは、サーバー上で動くアプリケーションです。(掲示板とかアンケートとか)

CGIは特定のプログラム言語ではありません。

CGIというプログラム言語はありません。

一般的に「Perl」を中心に解説されますが、「Perl」だけでなく「C」や「C++」や「PHP」や「Ruby」や「Python」などもCGIとして実装できます。

 

CGIとは何?Perlと違うの?何が違うの?

結構混乱すると思いますのでもう1回整理します。

一般的にCGI=Perlというイメージがありますが、違います。

.CGI → Webサーバー上でCGIプログラムとして実行したい

.pl → Webサーバー上でPerlプログラムを実行したい

 

例えば、こんなプログラムがあります。

#!/usr/bin/perl
# Perl CGIテスト
print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<H2>Hello World!</H2>\n";
print "</body></html>\n";
exit;

 

このプログラムを「test.pl」で保存すると「Perl」プログラムになります。

このプログラムを「test.cgi」で保存すると「CGI」プログラムになります。

 

タマちゃん
え?でも.cgiにしたらperlだって分からなくなるよね?

 

確かに「test.pl」から「test.cgi」に変更すると、中身がperlなのか何なのか分からなくなります。

しかしコンピュータは最初の行の「#!/usr/bin/perl」を見て「Perlだな」と分かるのです。

※逆に言うと拡張子よりも1行目の「#!/usr/bin/perl」とか「#!/bin/sh」とか「#!/usr/bin/ruby」で何のプログラムか判断しています。

 

せっかくPerlとCGIのプログラムを作ったので、Webサーバー上で実行してみましょう。

プログラムの中身は一緒の「test.pl」と「test.cgi」は何が違うのでしょうか?

Webサーバー上でPerlとCGIプログラムが動くように設定する

まずはPerlがインストールされているか確認します。

Webサーバーへログインします。

Perlがインストールされているか?インストールされているとしたらバージョンはいくつか?を確認します。

 

# perl -v

 

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
(with 34 registered patches, see perl -V for more detail)

 

Copyright 1987-2012, Larry Wall

 

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

 

Perlはすでにインストールされていて、バージョンはv5.16.3でした。

 

/etc/httpd/conf/httpd.conf の編集

次に、「/etc/httpd/conf/httpd.conf」ファイルを編集します。

今回は CGIプログラム、Perlプログラムを /var/www/cgi-bin ディレクトリ配下に置いて実行することにしました。

# cd /etc/httpd/conf/
# cp -ip httpd.conf httpd.conf_20170406
# vi httpd.conf

#
# AddHandler allows you to map certain file extensions to "handlers":
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi
↓これをコメントアウトして下の1行を追加します。
AddHandler cgi-script .cgi .pl

 

 

httpd.confを変更したらhttpdを再起動します。

CentOS7なので「systemctl」コマンドでhttpdを再起動します。

# systemctl restart httpd

 

 

 

早速「test.cgi」と「test.pl」にアクセスしてみると・・・

 

「403 Forbidden」エラーがでました。

エラーの内容も「You don't have permission to access /test.pl on this server.」と権限が足りないよと言っています。

まだ権限の設定をしていませんでした。

権限は、Options に「ExecCGI」の追加です。

先ほどのこの部分のことです。

 # (You will also need to add "ExecCGI" to the "Options" directive.) ←この文章を読むのを忘れていた。

 

 

 

再度、/etc/httpd/conf/httpd.conf を編集します。

# vi /etc/httpd/conf/httpd.conf

#
# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options ExecCGI ←この行を追加します。
    Require all granted
</Directory> 

 

 

 

httpd.confを変更したらhttpdを再起動します。

# systemctl restart httpd

 

 

再度プログラムを実行します。

 

「test.cgi」も「test.pl」も実行されました。

 

「test.cgi」と「test.pl」の違いは何?

タマちゃん
結局この2つは何が違うの?
山ちゃん
実は何も違わなくて、Webサーバー側でどのように定義されているかだけなんだよ

 

ややこしいですが、もう一度整理しましょう。

拡張子「.cgi」とすると、サーバー上で「CGI」プログラムとして実行される

拡張子「.pl」とすると、サーバー上で「Perl」プログラムとして実行される

プログラムの中身は一緒、でもサーバーが「CGI」として処理をするか、「Perl」として処理をするかが違う

 

タマちゃん
でも結局どっちも一緒と言うことだよね?

 

ただ、サーバーのポリシーとしてCGIとしてのプログラム実行は許可していても、Perlプログラムの実行は拒否するというポリシーで運用しているケースもあるかもしれません。

あるいは、CGIプログラムの実行は拒否しても、RubyやPerlやPHPとしてなら許可するとか。

だから中身は一緒でも、どのようなサーバー運用ポリシーがあるかで、拡張を「.cgi」にしなければいけないとか、設定も変わってきます。

中身は一緒でも「Perl」プログラムとして運用管理するのか?「CGI」プログラムとして運用管理するのか?で異なってきます。

CGIについては理解ができたでしょうか。

FastCGIとは何か?CGIとの違いは何か?

では、次に「FastCGI」「CGI」の違いを見てみましょう。

 

通常のCGI

通常プログラムを実行する時、プログラムをメモリにロードして実行します。

CGIプログラムを実行する場合も例外はなく、実行時にメモリにロードされて実行します。

プログラムが完了したらメモリを解放します。

つまりメモリ上から消えます。

(プロセスを終了させるという言い方もします)

そして次にプログラムが実行されるときは、再度プログラムはディスクからメモリにロードされて実行されます。

毎回このようにディスクからプログラムをメモリにロードして実行する形式にするのは無駄が多いのと処理時間が掛かるということで「FastCGI」が開発されました。

 

FastCGI

下図は FastCGI の動作を図解しています。

通常のCGIは毎回プログラムを実行するたびにディスクからプログラムをロードしていますが、FastCGIは一度プログラムがロードされたらしばらくメモリ上に残ります。

(プロセスが終了せずにメモリ上に残るという言い方もします)

そのため、2回目、3回目と以降はプログラムの実行速度が速くなります。

これがFastCGIです。

毎回毎回ディスクからメモリにプログラムをロードする手間を省いています。

しかもディスクアクセスはメモリアクセスよりも処理時間が掛かります。

その工程を削っているわけですが FastCGI の処理速度は速いわけです。

エックスサーバーの「FastCGI」は「PHP」も含んでいる!

エックスサーバーの「FastCGI」は「PHP」も対象です。

ここまで読んでいるなら

「え?PHPはCGIじゃないよ!」

とビックリはしていないですよね。

PHP も Ruby も Perl も Python も C も 「CGI」 です。

だから「FastCGI」には「PHP」も含まれているよ!と言っても理解できると思います。

 

エックスサーバーの「FastCGI」も素晴らしいと思いますし、「FastCGI」に「PHP」も含まれているというのも素晴らしいです。

私はこういった技術的に攻めの姿勢が大切だと思っています。

月額900円(税抜)から、高速・多機能・高安定レンタルサーバー『エックスサーバー』

 

FastCGI設定手順

1.エックスサーバーのサーバーパネルにログインします。

 

 

2.「PHP高速化設定(FastCGI化)」をクリックします。

 

 

3.対象のドメインを選択します。

 

 

4.もし「PHP高速化設定(FastCGI化)」が有効になってなかったら有効にします。

※新規でエックスサーバーをレンタルした場合は、デフォルトで「FastCGI」が有効になっています。

 

最後に

私も CGI の勉強になりました。

HTTPのログ(access_log)を見たり、「.htaccess」を確認したり、httpd.conf を調べたりしましたが、気が付いたことは様々な要素が関連しているということです。

Perlだけ勉強すればよいのではなく httpd だったり access_log を確認しつつプログラムを作り実装していくという大きな流れを意識する必要があります。

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

“FastCGIとは何か?” への1件のコメント

コメントを残す

メールアドレスが公開されることはありません。