エックスサーバーのページに「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 |
このプログラムを「test.pl」で保存すると「Perl」プログラムになります。
このプログラムを「test.cgi」で保存すると「CGI」プログラムになります。
確かに「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
Copyright 1987-2012, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the Complete documentation for Perl, including FAQ lists, should be found on |
Perlはすでにインストールされていて、バージョンはv5.16.3でした。
/etc/httpd/conf/httpd.conf の編集
次に、「/etc/httpd/conf/httpd.conf」ファイルを編集します。
今回は CGIプログラム、Perlプログラムを /var/www/cgi-bin ディレクトリ配下に置いて実行することにしました。
# cd /etc/httpd/conf/ # |
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 # |
httpd.confを変更したらhttpdを再起動します。
# systemctl restart httpd |
再度プログラムを実行します。
「test.cgi」も「test.pl」も実行されました。
「test.cgi」と「test.pl」の違いは何?
ややこしいですが、もう一度整理しましょう。
拡張子「.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 を確認しつつプログラムを作り実装していくという大きな流れを意識する必要があります。
コメント
コメント一覧 (1件)
[…] FastCGIとは何か? […]