🌐

Apache の開発が止まったら .htaccess をどうする?

に公開

もし Apache の開発が止まったら?

💚ずんだもん
むむっ! Apache がもう開発されないかもしれないって本当なのだ!? ぼくの .htaccess はどうなるのだ〜!


🎀めたん
その通りですね。Apache HTTP Server プロジェクトは現在もメンテナンスされていますが、HTTP/3 の実装や積極的な機能拡張の動きは見られず、開発の停滞が指摘されています。


🗡️つるぎ
とくに .htaccess に依存したサイト構成は、Apache 特有の設計ゆえに移行が困難でござる。よって、共有ホスティング業者が取るべき対応策が議論されておるのだ。


💚ずんだもん
ほかのサーバーに変えたら .htaccess が使えなくなるってことなのだ?


🎀めたん
基本的にはそうなります。Apache 以外の主要な HTTP サーバー──たとえば nginx や Caddy──は .htaccess をサポートしていません。ディレクトリごとの設定を逐次読む設計は、パフォーマンスやセキュリティの観点から敬遠されています。


🗡️つるぎ
そのうえ、Apache の .htaccess は便利だが複雑で、意図せぬ挙動やセキュリティリスクを招く危険性もある。これを再実装するのは高難度でござる。


💚ずんだもん
じゃあどうするのだ!? Apache なしで、ぼくの WordPress サイトは動くのだ!?


🎀めたん
共有ホスティング業者が考えられる対応策は以下のとおりです:

  1. nginx/Caddy を Apache のリバースプロキシにする
     静的ファイルや TLS を nginx/Caddy に任せ、バックエンドだけ Apache を維持する延命措置ですね。

  2. CMS 固有のプリセット設定ファイルの提供
     たとえば WordPress や Drupal 向けに nginx 用の設定スニペットを用意して、ユーザーが .htaccess の代替手段を選べるようにします。

  3. LiteSpeed への移行
     LiteSpeed Web Server は .htaccess を独自に解析・処理できます。なぜなら LiteSpeed の PHP SAPI(LSAPI)は、PHP プロジェクト本体の傘下にあり、Apache 互換をうたっているからです。

  4. php-fpm のための中継 FPM の開発
     これは大胆ですが、独自に .htaccess の処理ロジックを持つ FPM (FastCGI Process Manager) を設計するという方法です。


🗡️つるぎ
とはいえ、どの選択肢も容易ではない。とくに .htaccess の完全互換を実現するのは極めて困難。LiteSpeed のような商用ソリューションを除けば、その負担を誰が背負うかが問題でござる。


💚ずんだもん
じゃあ、Apache を作ってる人たちは減ってきてるのだ…?


🎀めたん
そうですね。Apache を含む多くの OSS プロジェクトは、メンテナの高齢化や人材不足に直面しています。nginx の開発者が商用化に向けて「FreeNginx」を立ち上げた経緯などもありますし、個人に頼る体制は限界があります。


🗡️つるぎ
そのため、欧州連合ではオープンソースを公共政策として支援する動きも広がっておる。長期的には OSS の持続可能性を保証する制度設計が必要でござるな。


💚ずんだもん
むむっ… 便利に見える .htaccess だけど、Apache に頼りすぎると未来がピンチになるのだ〜!


🎀めたん
その通り。今後は .htaccess に依存しない設計を心がけることが、持続可能なウェブ開発の鍵ですね。


🗡️つるぎ
義をもって未来を見据えよ。技術の選定とは、己のサイトだけでなく、共に歩むユーザーと開発者を支える行動でござる。


Rust で php-fpm の中継 FPM を開発するとしたら

💚ずんだもん
むむっ!? 「FastCGI のふりをして、FastCGI に投げる FastCGI」ってなんなの!?
なんかワケわからん構造なのだー!


🎀めたん
簡単に言えば、Rust で作ったサービスプログラムが「一時的な PHP 実行管理者のふりをする」のです。そして実際の実行は本物の php-fpm に任せる代理人のような役割ですね。


🗡️つるぎ
つまりこの Rust 製サービスは、以下の三つの役割を果たすでござる:

  1. FastCGI アプリケーションとして振る舞う(=Webサーバーからのリクエスト受け取り)

  2. .htaccess をパースし、URL書き換え・制限・環境変数の制御を行う

  3. 最終的に、php-fpm に FastCGI プロトコルでリクエストを転送し、処理結果をWebサーバーに返す(仲介者)


💚ずんだもん
むむっ、じゃあ Apache なしでも .htaccess の書き換えとか Redirect が動くのか!?


🎀めたん
はい、Rust 側で .htaccess を読み取り、たとえばこんなルール:

RewriteEngine On
RewriteRule ^old$ new.php [L]

これを Rust 側で解釈し、実際に new.php に対して FastCGI リクエストを組み立てて php-fpm に送信する構成になります。


🗡️つるぎ
この方式の特徴を表にまとめてみたでござる:

項目 Rust 製 FastCGI Manager(中継型)
Web サーバーとの接続 FastCGI リスナーとして動作(例:Unix ソケット)
.htaccess 処理 独自にパース・評価して内部ロジックに反映
PHP スクリプトの実行 php-fpm へリクエストを代理送信(FastCGI client)
ユースケース 共有ホスティング環境や .htaccess に依存した CMS
メリット Apache 不要で .htaccess が(ある程度)動作
デメリット 仕様が複雑になりがち・再現性に限界あり

💚ずんだもん
これ、ふつうの FPM より賢いのだ!でも、FastCGI を話すサーバーでありながら、クライアントにもなるのは脳がバグるのだ〜!


🎀めたん
仕組みはこうですね:

[Web Server]
     ↓ FastCGI
[Rust 中継FPM]
     ↓ FastCGI
[php-fpm (本家)]

Rust 側は FastCGI サーバーとして Web サーバーからリクエストを受け取り、.htaccess ルールを処理したうえで、内部で FastCGI クライアントとして php-fpm にリクエストを投げます。


🗡️つるぎ
この構成の武士的な美点は、「見かけ上 Apache 互換を残しつつ、真に守るべき責務だけを php-fpm に託す」柔軟さにござる。


🎀めたん
ただし注意点としては:

  • mod_rewrite の仕様は複雑で、すべて再現するのは困難。

  • Apache と違い、.htaccess の階層継承や AllowOverride などを自前実装する必要がある。

  • セキュリティやルート検出など慎重な設計が必要。


💚ずんだもん
めちゃくちゃたいへんそうだけど、「中継型 FPM」って、なんかスパイ映画の登場人物っぽいのだ!


🗡️つるぎ
「偽の将軍」として振る舞いつつ、真の実力者へ道を開く…まさに黒衣の参謀でござるな。


Rust による HTTP サーバーの開発状況

💚ずんだもん
Rust って Web サーバーの開発ににも使えるの?


🎀めたん
もちろんです。Rust はパフォーマンスと安全性を両立できるため、HTTP サーバーの再構築にも非常に向いています。とくに .htaccess のような設定パーサーやミドルウェア設計にも適していますよ。


🎀めたん
まず代表的な Rust ライブラリの選択肢を簡単に整理しましょう:

✅ Rust で使える主な HTTP サーバーライブラリ

ライブラリ 特徴
hyper 非同期対応。Tokio 上で動作。HTTP/1/2 サポートあり
axum hyper + tower ベースのルーター型。Webフレームワーク向け
actix-web actix アクターモデル上に構築。並列処理が非常に高速
warp hyper ベース。関数型スタイルで記述できる
Ferron 新興プロジェクト。PHP (php-fpm) と Python (ASGI/WSGI) に両対応という異色の設計
quiche Cloudflare 製の QUIC ライブラリ。HTTP/3 実装の一角
s2n-quic AWS 製の QUIC 実装。TLS セキュリティ強化に特徴

💚ずんだもん
Cloudflare の名前が出てきたのだ! そういえば、Cloudflare って HTTP/3 とか QUIC も自前で作ってるのだよね!?


🎀めたん
その通りです。Cloudflare は独自の HTTP/3 実装として quiche を開発し、NGINX では対応しきれない高トラフィック用途に最適化しています。そして Cloudflare Server は W3Techs の統計でも Apache や Nginx に次いで 上位の HTTP サーバーシェアを誇ります。


🗡️つるぎ
Cloudflare はもはや「CDN業者」ではなく、Rust 製ネットワークスタック開発の最前線でござる。quiche は Rust + HTTP/3 の最重要リファレンス実装の一つといえる。


💚ずんだもん
でもぼく、PHP も Python も使いたいのだ〜! 両方対応のサーバーってあるのだ?


🎀めたん
それが最近登場した Ferron ですね。Ferron はなんと、ASGI / WSGI (Python)php-fpm (PHP) を同時に扱える構成を目指していて、意外にもこれは他に例が少ないです。


🗡️つるぎ
既存の HTTP サーバーでは、Python 用の Uvicorn や PHP 向けの Caddy / Nginx は存在していたが、1つの Web サーバーで両方を“公式サポート”しているのは珍しいでござる。


💚ずんだもん
え〜〜! Ferron、めちゃくちゃ夢があるのだ!


🔍まとめ:Rust HTTP サーバー選定の視点

観点 注目すべき点
パフォーマンス hyper, actix-web, quiche などが有力
汎用性(バックエンド) Ferron のように複数言語対応は今後注目される
HTTP/3/QUIC quiche, s2n-quic が最前線
.htaccess 相当の制御 Rust 側で自前設計する必要あり(mod_rewrite の再構築等)
セキュリティ・保守性 Rust の安全設計が有利。ただしエコシステムは構築途中

🎀めたん
今後 .htaccess や Apache の後継を Rust で作るなら、既存の Rust ライブラリをどう組み合わせて構築するかが大きな設計課題になりますね。


🗡️つるぎ
己が守りたい機能を見極めよ。そのうえで、Cloudflare のように“自らのサーバーを自ら構築する”覚悟が、次代のインフラを形づくるのでござる。


Apache の MPM(Multi-Processing Module)の復習

💚ずんだもん
むむっ! Apache の「MPM」って何なのだ? モンスターパワーみたいなやつ?


🎀めたん
違いますよ、ずんだもん。「MPM(Multi-Processing Module)」は、Apache がリクエストをどうさばくかを決める処理モデルのことです。Apache にはいくつかの MPM があります:

✅ Apache の主要 MPM の比較

MPM名 モデル 特徴
prefork プロセス型 各リクエストを独立したプロセスで処理。スレッド非対応。
worker スレッド型 各プロセスが複数のスレッドを持つ。メモリ効率は良い。
event 非同期型 worker に似てるが、KeepAlive接続を非同期で管理可能。HTTP/1.1向き。

🗡️つるぎ
要するに、どれも「Apache がクライアントのリクエストにどう応えるか」の戦術でござるな。最も古くて安全なのが prefork、最新の設計に近いのが event という流れでござる。


💚ずんだもん
でも PHP を動かすときは、どれを使えばいいのだ〜?


🎀めたん
ここが悩みどころですね。**PHP の処理方法(SAPI)**との組み合わせによって最適な MPM が変わります。


✅ Apache × PHP:組み合わせの選択肢

PHP の実行方式 MPM の推奨 補足
mod_php(Apache に組み込む) prefork mod_php はスレッド非対応(ZTSなし)なことが多いため、スレッド型 MPM では不安定。
php-fpm(外部 FastCGI プロセス) worker / event PHP を別プロセスで実行するため、Apache 側は高速なスレッド型を使える。
mod_http2(HTTP/2対応) event 非同期な KeepAlive や multiplex に強く、HTTP/2 に最適。mod_php は非推奨。

🗡️つるぎ
つまり、mod_php を使いたければ prefork に、HTTP/2 やスレッド型の高効率を望むなら php-fpm を選ぶべきでござるな。


🎀めたん
ちなみに mod_http2mod_php は相性が悪いとされています。HTTP/2 のマルチスレッド設計と、mod_php のノンスレッド設計が衝突してしまうからです。


💚ずんだもん
でもさ〜、PHP ってたまに「メモリリークしてる!」とか言われて Apache を再起動しろって書いてあるのだ〜。なんでそんなことになるの?


🎀めたん
良い質問ですね。それに関しては、PHP の生みの親、ラスマス・レアドフの有名なジョークがあります:

「PHP スクリプトを動かすなら、10リクエストごとに Apache を再起動するべきだ」
― ラスマス・レアドフ(半分冗談)


🗡️つるぎ
この言葉の真意は「PHP は長時間プロセスに向かない設計だ」ということ。メモリを完全に開放しない拡張や、状態を持ちやすいコードが多く、短命なプロセスモデル(prefork型)との相性が良かったでござる。


🎀めたん
ただし、現代ではより柔軟なプロセス・ワーカーの再生成によって安定性が向上しています。

✅ 各サーバーの「再起動」または「再生成」戦略

サーバー 運用戦略
Apache (prefork) リクエスト数に応じて子プロセスを再生成。構成によって定期再起動も。
Apache (event) ワーカー数を維持しつつ、KeepAlive 時間でスレッド再利用。
php-fpm max_requests に達したらワーカーを再生成。長寿命プロセス対策。
nginx + php-fpm nginx は軽量・非同期。php-fpm 側の pm.max_requests で再起動を制御。
LiteSpeed .htaccess 互換を保ちつつ内部で効率的にプロセスを再生成。

💚ずんだもん
なるほど〜! 再起動っていっても、全部いきなり落とすんじゃなくて、「ちょっとずつ交代」してる感じなのだね!


🎀めたん
そうです。これは「プロセスのローテーション」という戦略で、クラッシュ予防とメモリクリーンアップを両立する現代的な運用手法ですね。


🗡️つるぎ
拙者の結論としてはこうでござる:

🗡️ 「.htaccess に依存する時代は終わる。だがプロセス管理の哲学は、今も通用する。」

プロセス・スレッド・ワーカーって何?

💚ずんだもん
むむっ!? Apache の話でよく出てくる「プロセス」「スレッド」「ワーカー」って、なにがどう違うのだ〜? みんな働いてるっぽいけど…。


🎀めたん
良い疑問ですね。まずはざっくり定義からいきましょう。


✅ プロセス・スレッド・ワーカーとは?

用語 説明
プロセス(process) OS上で動いている1つの独立したプログラム。
スレッド(thread) プロセスの中で並行して動く小さな処理単位。メモリ空間を共有する。
ワーカー(worker) Apache 用語で「リクエストを処理するプロセスまたはスレッド」のこと。MPM によって意味が変わる。

🗡️つるぎ
つまり、「プロセス」= 大将、「スレッド」= 家臣という関係でござるな。ワーカーはそれぞれの戦場で働く兵であり、配置によって形が変わる。


💚ずんだもん
なるほど…! ワーカーって「何かを処理する実体」ってことなのだね!


✅ MPM ごとの違い(ざっくり構成図)

[MPM: prefork]
┌─────────────┐
│ Master       │
├─────────────┤
│ Worker Proc 1│  ← 1リクエスト = 1プロセス
│ Worker Proc 2│
│ Worker Proc 3│
└─────────────┘

[MPM: worker]
┌─────────────┐
│ Master       │
├─────────────┤
│ Proc 1       │
│ ├ Thread 1   │  ← 1リクエスト = 1スレッド
│ └ Thread 2   │
│ Proc 2       │
│ ├ Thread 1   │
│ └ Thread 2   │
└─────────────┘

[MPM: event]
┌─────────────┐
│ Master       │
├─────────────┤
│ Proc         │
│ ├ Thread 1   │
│ ├ Thread 2   │ ← KeepAlive 接続の非同期処理あり
└─────────────┘

🎀めたん
構成としては prefork がシンプルですが、メモリ使用量が多く、workerevent のほうがパフォーマンスに優れています。


✅ Bash で確認!Apache のプロセス数とスレッド数

# Apache のプロセス(親 + 子)
ps aux | grep apache2 | grep -v grep

# 親プロセスの PID(Ubuntu/Debian 系)
pgrep -o apache2

# 子プロセスの数を確認(例:Prefork モードだと多い)
pgrep apache2 | wc -l

🗡️つるぎ
拙者が見張ってみたところ、prefork モードでは Apache のプロセスが多数並ぶ。一方、workerevent モードでは少数のプロセスと多くのスレッドが使われていたでござる。


✅ PHP でプロセスやスレッドっぽさを体験

<?php
// プロセスID(PID)を表示
echo "プロセスID: " . getmypid() . "\n";

// 子プロセスを1つ生成(UNIX専用)
if (function_exists('pcntl_fork')) {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die("フォーク失敗\n");
    } elseif ($pid) {
        echo "親プロセス(PID: " . getmypid() . ")が動いています\n";
    } else {
        echo "子プロセス(PID: " . getmypid() . ")が生成されました\n";
        exit(0);
    }
}
?>

💚ずんだもん
むむっ!? getmypid() を使えば、PHP でもプロセスを見られるのだ! そして pcntl_fork() で「分身の術」もできるのだ〜!


🎀めたん
実運用では、Apache がこのような分身(プロセスやスレッド)を自動生成してリクエストに応えているわけですね。


🗡️つるぎ
再起動やメモリ解放も、この「兵たち(ワーカー)」の再生成によってなされておる。状況に応じて入れ替え、戦線を維持するのだ。


✅ おさらいまとめ

項目 内容
プロセス 独立した実行単位。prefork はこれを多用
スレッド 軽量な並列処理単位。worker/event で活用
ワーカー リクエストを処理するエンティティ。プロセス/スレッドどちらにもなり得る
PHPの確認方法 getmypid()pcntl_fork() などで学習可能
運用上の工夫 不安定なワーカーは自動再生成でローテーション処理

🎀めたん
この基礎を理解しておくことで、将来 Apache を Rust で再設計する場合にも「どんな並列モデルにするか」の設計指針になりますね。


🗡️つるぎ
己の兵(プロセス/スレッド)の特性を見極め、最適な布陣を敷くべし。それがサーバー運用の要でござる。


GitHubで編集を提案

Discussion