Webサーバーでプログラムはなぜ動く?

2021年11月8日

Webサーバーの設定を調整することで、ブラウザが接続してきた時にサーバーに置かれたファイルをプログラムを実行し、その結果を返すように構成できます。

ファイルを見せるのではなくプログラムの実行結果を返す

ApacheなどのWebサーバーソフトは、サーバ上で動作しており、ポート80番や443番などで待ち受けております。

そしてクライアントから「GET/index.htmlHTTP/1.1」のような要求コマンドが送られてきた時には「index.htmlファイルの内容を返す」と言う動作をしています。

Webサーバー上でプログラムを動かすときには、これと同様にして、例えば「GET/index.cgiと言うプログラム」を実行し、その結果を返すように、Webサーバーの設定を調整しておきます。

この時index.cgiは「ユーザーに出力したいHTMLの内容」などを出力するように動作するようにしておきます。

CGI

今例として「index.cgi」を挙げましたが、この拡張し「.cgi」は、プログラムの種類を示します。どの拡張子の時に、どのようなプログラムとして実行するのかは、Webサーバーの設定(Apacheなどの設定ファイル)で変更できます。

「.cgi」と言う拡張子は慣例的に「CGI(Common Gateway Interface)」と言う仕組みでサーバー上のプログラムを実行する仕組みです。「汎用的に」と言うのは、プログラミング言語に関係なく、同じ方法で実行することを意味します。

LinuxなどのサーバーOSには、1行目に「#!プログラム名」と記述しておくと、そのプログラムを読み込んで以降のコードを実行できる仕組みがあります。

CGIプログラムはどのようなプログラミング言語でもかけますが、Perlで書くことがほとんどです。例えば次のように記述します。

1行目の「#!/usr/bin/perl」がPerl言語で書かれたプログラムを実行するためには実行環境コマンド(Perlコマンド)です(Perlコマンドは、ほとんどの場合、サーバーにデフォルトでインストールされていますが、そうでない時は、あらかじめサーバーに管理者がインストールしておく必要があります)

Webサーバープログラム(Apacheなど)によって、このCGIが実行される時には、まず/usr/bin/perlを呼び出します。そして、このファイル自信を/usr/bin/perlに読み込ませることによって、プログラム自体が実行されます。

「echo」と言うのは、Perlにおいて文字出力する命令です。

と言う部分は「これから送信するデータがHTML形式である」ことを示すもので、PerlでWebプログラムを作るときの常套文句です。

そして次の

からが、HTMLの本文に相当するデータです。「<html><body>Hello</body></html>」と言う文字を出力しているので、クライアントには、このHTMLが渡され、「Hello」と言う文字が表示されます。

プログラムの実行環境を指定する

CGIプログラムがPerlで書かれている時は、1行目がPerlコマンドを示す「#!/usr/bin/perl」を指定していますが、他のプログラミング言語で書かれているときは、この部分を変更します。

例えば、PHPの場合には次膿瘍に1行目を「#!/usr/bin/php」と記述します。

2行目以降が、PHPの文法に則ったプログラムになります。

詳しくは別の記事で紹介しますが、PHPのプログラムは、全体を「<?php」と「?>」で括るという決まりがあります。

画面に出力するには、Perlと同じくechoと言う命令を使います。結果は、Perlの場合と同じです。(PHPの場合、デフォルトでHTML形式として出力するので、「echo “Content-Type:text/html"」は不要です)

このように1行目に「PerlやPHP、もしくは他のプログラム実行環境のプログラム名」を指定することで、さまざまなプログラミング言語で書かれたプログラムを実行できると言うのが、CGIの特徴です。

CGIはパフォーマンスが悪い

CGIは、さまざまなプログラミング言語で書かれたプログラムで実行できると言う点で優れています。しかし、次の2つの問題があります。

1.セキュリティの問題

1つ目の問題はセキュリティの問題です。

1行目では、「#!プログラム名」と記述することでサーバー上で好きなコマンドを実行できます。

サーバーにはプログラミング言語を実行するコマンド(PerlやPHPなどの実行環境)以外にも、システムの状態を表示したり変更したりするコマンドもインストールされています。

1行目で、これらが指定された時には、もちろんそのコマンドが実行されます。つまりこれはサーバーで任意のコマンドを実行できることを意味し、セキュリティ的に望ましくあります。

2.パフォーマンスの問題

2つ目の問題は、消費メモリや実行速度の問題です

CGIは、1行目で指定している/usr/bin/perlなどの実行環境が同時にアクセスしているユーザーの数だけ実行されます。

実行環境自体が、大きなメモリを必要とします。そしてまた実行環境の読み込みには時間がかかるのでパフォーマンスがよくありません。

モジュール

この問題を解決するのが「モジュール(module)」です。

モジュール実行方式では、PerlやPHPなどのプログラムを実行する環境を、Webサーバーのプログラム(Apacheなど)にモジュールとして組み込んでおき「どの拡張子の時に、どのモジュールを使うのか」をあらかじめ定めておきます。

すると、その拡張子のURLが要求された時には、モジュールを経由して、該当のプログラムが実行されるようになります。

例えば、Apacheの場合モジュールは「mod_XXX」と言う名称です。具体的にはPerlを実行する「mod_perl」、PHPを実行する「mod_php」Rubyを実行する「mod_ruby」などがあります。

例えば「.php」に対して「mod_php」を動かす構成にしておくとします。

ユーザがブラウザのアドレス帳に「http://www.it-stepup.co.jp/index.php」と入力した時には、HTTPプロトコルで「GET/index.php」と言う要求がサーバーに伝わります。

この時、mod_phpを通じてindex.phpファイルが実行されます。

index.phpは、先程のCGIの場合と同じですが、1行目の「プログラムの実行環境を指定するもの」はなく、次の内容とします。

CGIとの違いは、図に示したようにPerlやPHP、Rubyなどを実行するためのプログラムの実行環境が、Webサーバーとともに既に動いて、都度要求に応じて読み込む必要がないという点。そして、この実行環境(モジュール)は、共通のものが1つだけあり、ユーザーの数だけ実行されるわけではないという点です。

なお、ほとんどのモジュールは、ソースコードをキャッシュします。そのためCGIに比べて格段と早く動作します。

このような理由から最近は、モジュールとして実行するのが主流です。

ただし、Perlのプログラムについては、歴史的な理由でモジュール動作だとキャッシュの機構のために動かない事があるため依然とCGIが使われていることもあります。

最後に

いかがでしたでしょうか、今回はどう言う風にサーバー側でプログラミングが動いているのかを記述してきました、特にホームページを作成している会社などでは間違いなく覚えておいた方がいい内容であると思いますので。

Web関係でも特にホームページ作成などに進みたい方には押さえておいて欲しい内容です。

時間はかかるかと思いますが確実に押さえておきましょう。

ではでは

Follow me!