「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回】Linuxの「最強の武器」を手にせよ!環境構築とCGIでのHello World
- 【第2回】入力フォームを攻略せよ!GET/POSTデータの受け取りと変数入門
- 【第3回】掲示板を作ろう(前編)!制御構文とファイル操作(読み書き)の基礎
- 【第4回】車輪の再発明を防ぐ!CPANモジュールの導入とCGI.pmの活用
- 【第5回】データはデータベースへ!MariaDB(MySQL)連携とDBI/DBDモジュール
- 【第6回】モダンPerlの世界へ!Webフレームワーク「Mojolicious」入門
- 【第7回】セキュリティと見た目の分離!テンプレートエンジンの利用とXSS対策
- 【第8回】実践アプリ開発!簡易ブログシステムの構築とPSGIデプロイ
第1章:なぜ「Mojolicious」なのか?
Perlには Catalyst や Dancer2 など有名なフレームワークがありますが、初心者に最もおすすめなのが 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>
解説
helper: データベース接続のような共通処理を登録できます。$c->dbでどこからでも呼べます。$c->render: テンプレートを指定してHTMLを生成します。データ(posts)を渡すのも簡単です。__DATA__: ファイルの末尾にテンプレートを埋め込む機能です。1ファイルで完結できます。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」で自分専用環境
モダン開発スキルを年収に
「ITエンジニア転職」

コメント