PerlでHTTPサーバを構築する方法: HTTP::Server::Simpleの活用

Perlにおいて、**HTTP::Server::Simple** モジュールは軽量なHTTPサーバの実装を可能にします。このモジュールはシンプルで使いやすく、開発やテストに適しています。以下では、このモジュールを使ってHTTPサーバを設定する方法を紹介します。

HTTP::Server::Simpleのインストール

まず、CPANから **HTTP::Server::Simple** モジュールをインストールします。以下のコマンドを使用してください:
cpan HTTP::Server::Simple
または、`cpanm` を使用している場合、次のコマンドが有効です:
cpanm HTTP::Server::Simple

基本的なHTTPサーバの作成

以下のコードは、ポート8080で動作し、「こんにちは、世界!」というメッセージを返す簡単なHTTPサーバを作成する例です。
use strict;
use warnings;
use HTTP::Server::Simple::CGI;

package SimpleWebServ;
our @ISA = ('HTTP::Server::Simple::CGI');

sub process_request {
    my ($self, $cgi) = @_;
    print "HTTP/1.0 200 OK\r\n";
    print $cgi->header,
          $cgi->start_html('Welcome'),
          $cgi->h1('こんにちは、世界!'),
          $cgi->end_html;
}

my $srv = SimpleWebServ->new(8080);
print "サーバは http://localhost:8080 で稼働中\n";
$srv->run();
上記のコードは、**HTTP::Server::Simple::CGI** クラスを継承した `SimpleWebServ` サーバクラスを作成し、リクエスト処理メソッドをオーバーライドしています。

サーバ機能の拡張

リクエストパスに基づいて異なるコンテンツを返すように、`process_request` メソッドを拡張できます。
use strict;
use warnings;
use HTTP::Server::Simple::CGI;

package EnhancedServ;
our @ISA = ('HTTP::Server::Simple::CGI');

sub process_request {
    my ($self, $cgi) = @_;
    my $req_path = $cgi->path_info;

    if ($req_path eq '/greet') {
        print "HTTP/1.0 200 OK\r\n";
        print $cgi->header,
              $cgi->start_html('Greeting'),
              $cgi->h1('こんにちは!'),
              $cgi->end_html;
    } elsif ($req_path eq '/farewell') {
        print "HTTP/1.0 200 OK\r\n";
        print $cgi->header,
              $cgi->start_html('Farewell'),
              $cgi->h1('さようなら!'),
              $cgi->end_html;
    } else {
        print "HTTP/1.0 404 Not Found\r\n";
        print $cgi->header,
              $cgi->start_html('NotFound'),
              $cgi->h1('404 - 見つかりません'),
              $cgi->end_html;
    }
}

my $server_inst = EnhancedServ->new(8080);
print "サーバは http://localhost:8080 で稼働中\n";
$server_inst->run();
このコードは、リクエストパスに応じて異なるレスポンスを生成します。

ログ機能の追加

サーバのデバッグと監視のために、各リクエスト情報をログファイルに記録する機能を追加します。
use strict;
use warnings;
use HTTP::Server::Simple::CGI;
use POSIX qw(strftime);

package LoggableServ;
our @ISA = ('HTTP::Server::Simple::CGI');

sub process_request {
    my ($self, $cgi) = @_;
    my $request_path = $cgi->path_info;

    # リクエスト情報のログ記録
    my $log_msg = strftime("[%Y-%m-%d %H:%M:%S]", localtime) . " - $request_path\n";
    open my $log_fh, '>>', 'access.log' or die "ログファイルを開けません: $!";
    print $log_fh $log_msg;
    close $log_fh;

    if ($request_path eq '/greet') {
        print "HTTP/1.0 200 OK\r\n";
        print $cgi->header,
              $cgi->start_html('Greeting'),
              $cgi->h1('こんにちは!'),
              $cgi->end_html;
    } elsif ($request_path eq '/farewell') {
        print "HTTP/1.0 200 OK\r\n";
        print $cgi->header,
              $cgi->start_html('Farewell'),
              $cgi->h1('さようなら!'),
              $cgi->end_html;
    } else {
        print "HTTP/1.0 404 Not Found\r\n";
        print $cgi->header,
              $cgi->start_html('NotFound'),
              $cgi->h1('404 - 見つかりません'),
              $cgi->end_html;
    }
}

my $logger_srv = LoggableServ->new(8080);
print "サーバは http://localhost:8080 で稼働中\n";
$logger_srv->run();
このコードにより、各リクエスト情報が `access.log` ファイルに記録され、サーバの動作状況や履歴を確認できるようになります。

タグ: Perl HTTP::Server::Simple CGI サーバ構築 ログ管理

8月21日 14:03 投稿