【Perl講座 第6回】モダンPerlの世界へ!Webフレームワーク「Mojolicious」入門とPSGIデプロイ

「CGI」を捨てよ、町へ出よう。

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回までは、Perlを使って「CGI」という仕組みでWeb掲示板を作ってきました。

しかし、実はCGIには大きな弱点があります。
アクセスがあるたびに「Perlを起動して、処理して、終了する」を繰り返すため、アクセスが集中するとサーバーが激重になるのです。
また、規模が大きくなると、コードがスパゲッティ状態になりがちです。

コウ君

先生、最近Ruby on RailsとかPythonのDjangoとか、カッコいい名前のやつよく聞くんですけど。
Perlにはそういう「フレームワーク」ってないんですか?
毎回 print "Content-Type..." って書くの、正直飽きてきました…。

リナックス先生

待ってました!その質問。
Perlにも素晴らしいフレームワークがあるわ。その名も「Mojolicious(モジョリシャス)」
これを使えば、面倒なヘッダー出力も、URLの振り分けも、全部自動でやってくれるの。
しかも、CGIとは比べ物にならないくらい「爆速」で動くわよ。
今日から「モダンPerl」の世界へダイブしましょう!

本記事では、Perlの現代的なWebフレームワーク「Mojolicious」を導入し、前回作った掲示板をモダンに書き換える方法を解説します。
さらに、Apacheと連携させた本格的な本番サーバー構成(リバースプロキシ)も構築します。

🐪 Perlサーバサイドプログラミング講座(バックナンバー)

現在地:【第6回】モダンPerlの世界へ!Webフレームワーク「Mojolicious」入門


第1章:なぜ「Mojolicious」なのか?

Perlには CatalystDancer2 など有名なフレームワークがありますが、初心者に最もおすすめなのが Mojolicious です。

Mojoliciousのここが凄い

  • 依存関係ゼロ: 他のモジュールを大量にインストールする必要がなく、cpanm Mojolicious だけで即使えます。
  • リアルタイムWeb対応: WebSocketなどを標準サポートしており、チャットアプリなども簡単に作れます。
  • 開発サーバー内蔵: Apacheの設定をいじらなくても、コマンド一つで開発用サーバーが立ち上がります。
  • モダンな記法: 最新のPerlの機能をフル活用した、直感的で美しいコードが書けます。

CGIとPSGIの違い

モダンPerlを語る上で欠かせないのが「PSGI(Perl Web Server Gateway Interface)」です。

  • CGI: アクセスのたびにPerlプロセスを起動・終了する。(重い)
  • PSGI: Perlプロセスを常駐させておき、Webサーバーからのリクエストを高速に処理する。(速い)

Mojoliciousは、このPSGIに対応したアプリケーションを作成するためのフレームワークです。


第2章:環境構築とインストール

AlmaLinux 9 に Mojolicious をインストールします。
OSのパッケージマネージャーではなく、最新版を使うために cpanm を使います。

1. cpanmの確認

第4回でインストールしましたが、もし入っていない場合は入れましょう。

sudo dnf install cpanminus -y

2. Mojoliciousのインストール

sudo cpanm Mojolicious

これだけでインストール完了です。
確認してみましょう。

mojo version

バージョン情報と、可愛い雲のキャラクターのアスキーアートが表示されればOKです。


第3章:Hello World (Mojolicious::Lite)

Mojoliciousには、大規模向けの「Fullアプリ」と、1ファイルで書ける「Liteアプリ」があります。
学習用には Mojolicious::Lite が最適です。

1. アプリファイルの作成

適当なディレクトリ(ホームディレクトリなど)で作業します。
app.pl というファイルを作成します。

nano app.pl

コード内容:

#!/usr/bin/env perl
use Mojolicious::Lite -signatures;

# ルーティング設定
# GETメソッドで '/' にアクセスがあったら実行する
get '/' => sub ($c) {
  $c->render(text => 'Hello Mojolicious!');
};

# アプリケーションを開始
app->start;

2. 開発用サーバーで起動 (morbo)

Apacheの設定はいりません。以下のコマンドを打つだけです。

morbo app.pl

Web application available at http://127.0.0.1:3000 と表示されます。
サーバーのポート3000番で起動しました。

3. ブラウザからアクセス

ブラウザで http://サーバーIP:3000 にアクセスします。
※アクセスできない場合、ファイアウォールで3000番を開ける必要があります。

# 一時的に3000番を開ける(テスト用)
sudo firewall-cmd --add-port=3000/tcp
# テストが終わったら --remove-port で閉じてください

「Hello Mojolicious!」と表示されましたか?
これがモダンPerlの世界です。HTMLヘッダーも文字コードも気にしなくて大丈夫です。


第4章:ルーティングとパラメータの受け取り

Webアプリの基本は「URLによって処理を変える(ルーティング)」と「データを受け取る」ことです。

ルーティング(Routing)

URLの一部を変数として受け取ることができます。

# 例: /hello/tanaka にアクセスした場合
get '/hello/:name' => sub ($c) {
  my $name = $c->stash('name'); # プレースホルダ(:name)の値を取得
  $c->render(text => "こんにちは、$name さん!");
};

パラメータの取得

?q=keyword や POSTデータの受け取りは、$c->param を使います。
CGI.pmと似ていますが、自動的にUTF-8デコードされているのが最大の利点です。

# GET /search?q=perl
get '/search' => sub ($c) {
  my $keyword = $c->param('q');
  $c->render(text => "検索キーワード: $keyword");
};

第5章:【実践】掲示板アプリの移植

それでは、前回までに作った「DB版掲示板」を、Mojoliciousで書き直してみましょう。
驚くほどコードが短く、読みやすくなります。

bbs_mojo.pl の作成

#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
use DBI;

# データベース接続設定(ヘルパーとして登録)
helper db => sub {
    my $dsn = "DBI:mysql:database=bbs_db;host=localhost";
    my $user = "bbs_user";
    my $pass = "password123";
    my %attr = (
        PrintError => 0, RaiseError => 1,
        mysql_enable_utf8 => 1, AutoCommit => 1
    );
    return DBI->connect($dsn, $user, $pass, \%attr);
};

# トップページ(一覧表示)
get '/' => sub ($c) {
    my $dbh = $c->db;
    my $sth = $dbh->prepare("SELECT * FROM posts ORDER BY id DESC");
    $sth->execute;
    
    # 全データをハッシュリファレンスの配列として取得
    my $posts = $sth->fetchall_arrayref({});
    
    # テンプレート(index)を描画し、データを渡す
    $c->render(template => 'index', posts => $posts);
};

# 投稿処理
post '/post' => sub ($c) {
    my $name = $c->param('name');
    my $message = $c->param('message');
    
    if ($name && $message) {
        my $dbh = $c->db;
        my $sth = $dbh->prepare("INSERT INTO posts (name, message) VALUES (?, ?)");
        $sth->execute($name, $message);
    }
    
    # トップページへリダイレクト
    $c->redirect_to('/');
};

app->start;

# 以下、テンプレートセクション
__DATA__

@@ index.html.ep
<!DOCTYPE html>
<html>
<head><title>Mojolicious BBS</title></head>
<body>
    <h1>モダン掲示板</h1>
    
    <form action="/post" method="POST">
        名前: <input type="text" name="name"><br>
        内容: <textarea name="message"></textarea><br>
        <input type="submit" value="書き込む">
    </form>
    <hr>
    
    <table border="1">
        <tr><th>ID</th><th>名前</th><th>メッセージ</th><th>日時</th></tr>
        % for my $post (@$posts) {
            <tr>
                <td><%= $post->{id} %></td>
                <td><%= $post->{name} %></td>
                <td><%= $post->{message} %></td>
                <td><%= $post->{created_at} %></td>
            </tr>
        % }
    </table>
</body>
</html>

解説

  1. helper: データベース接続のような共通処理を登録できます。$c->db でどこからでも呼べます。
  2. $c->render: テンプレートを指定してHTMLを生成します。データ(posts)を渡すのも簡単です。
  3. __DATA__: ファイルの末尾にテンプレートを埋め込む機能です。1ファイルで完結できます。
  4. ep (Embedded Perl): Mojoliciousのテンプレートエンジンです。% でPerlコードを、<%= %> で変数の埋め込み(自動エスケープ付き)ができます。

実行してブラウザで確認してみてください。
CGI時代に苦労した「文字コード変換」や「HTML出力」が、魔法のように自動化されているのが分かるはずです。


第6章:本番環境へのデプロイ(Hypnotoad + Apache)

morbo は開発用なので、本番運用には向きません。
本番では、Mojoliciousに付属する高性能プリフォークサーバー Hypnotoad(ヒプノトード) を使います。
そして、その前段にApacheを置いて、ユーザーからのアクセスを中継(リバースプロキシ)させるのが一般的な構成です。

1. Hypnotoadでの起動

バックグラウンドで起動し、ポート8080で待ち受けるようにします。

# 環境変数でポート指定して起動
MOJO_LISTEN=http://*:8080 hypnotoad bbs_mojo.pl

これで、Perlアプリが常駐プロセスとして立ち上がりました。

2. Apacheのリバースプロキシ設定

Apacheの設定ファイルを編集し、80番ポートへのアクセスを内部の8080番へ転送します。

sudo nano /etc/httpd/conf.d/mojo_proxy.conf

設定内容:

<VirtualHost *:80>
    ServerName your-server-ip
    
    # プロキシ設定
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
    
    # WebSocketを使う場合は以下も必要
    # ProxyPass / wss://127.0.0.1:8080/
</VirtualHost>

3. SELinuxの設定(超重要)

AlmaLinuxなどのRHEL系では、SELinuxが「Apacheが外部のポート(8080など)へ接続すること」をブロックします。
これを許可しないと 503 Service Unavailable になります。

# Apacheからネットワーク接続を許可する
sudo setsebool -P httpd_can_network_connect 1

4. Apache再起動

sudo systemctl restart httpd

これで、ブラウザから http://サーバーIP/(80番)にアクセスすると、裏で動いているMojoliciousアプリが表示されるはずです。
これが現代的なWebアプリの「デプロイ」構成です。


第7章:ホットデプロイ(無停止更新)

Hypnotoadのすごいところは、「サービスを止めずにプログラムを更新できる(ホットデプロイ)」機能です。
コードを修正した後、以下のコマンドを打つだけです。

hypnotoad bbs_mojo.pl

すると、新しいプロセスが立ち上がり、古いプロセスは処理が終わってから静かに終了します。
ユーザーは切断されることなく、いつの間にか新しいバージョンに切り替わります。
CGIでは当たり前だった「修正即反映」の利便性と、常駐プロセスの「高速性」を両立しているのです。


まとめ:Perlは「遅い」言語ではない

お疲れ様でした!
Mojoliciousを使うことで、PerlでのWeb開発が劇的にモダンで快適なものになりました。

今回の重要ポイント:

  • Mojolicious::Lite は1ファイルで書ける軽量フレームワーク。
  • CGIではなくPSGI(常駐プロセス)で動かすことで爆速になる。
  • c->render とテンプレートエンジン ep でHTML生成も楽々。
  • 本番では Hypnotoad + Apacheリバースプロキシ構成が鉄板。

これで機能面は充実しました。
しかし、Webアプリを作る上で絶対に忘れてはいけないのが「セキュリティ」です。
便利なフレームワークを使っても、書き方が悪ければ脆弱性は生まれます。

次回、第7回は「セキュリティと見た目の分離!テンプレートエンジンの利用とXSS対策」です。
今回少し触れたテンプレート機能をさらに深掘りし、Webアプリ最大の脅威である「クロスサイトスクリプティング(XSS)」を防ぐ正しいコーディング作法を学びます。
安全なアプリを作るために必須の知識です。お楽しみに!

▼ エンジニアとしてのキャリアを加速させる ▼

Mojoliciousを動かす
「VPS」で自分専用環境

おすすめVPSを見る

モダン開発スキルを年収に
「ITエンジニア転職」

転職エージェントを見る

コメント