はじめに
Web開発をしてると nginx や Apache という単語が出てきます。これらが何なのか、そしてRailwayやHerokuみたいな「ホスティングサービス」とはどう違うのかを、自分用の備忘録として整理しておきます。
Webサーバーソフトウェアとは
Webサーバーソフトウェアっていうのは、ブラウザなどから送られてくるHTTP通信を受け取るプログラムのことです。受け取ったあと、リクエストの内容によって処理を振り分けます。
- 画像やHTMLなどの静的ファイルであれば、そのまま返す
- PHPなど動的な処理が必要な場合は、その言語の実行環境に処理を渡して、返ってきた結果をレスポンスとして返す
というのが基本的な役割です。つまり、Webアプリ本体(PHPなどで書かれたコード)の手前に立って、通信の窓口になっているプログラム、というイメージです。
実際の通信の流れ(CRUDの例)
たとえば「ユーザーを新規作成する」というCRUD処理(Create)を例に、実際の通信の流れを追ってみます。
- ブラウザが
POST /usersのようなHTTPリクエストを送信する - Webサーバーソフトウェア(Nginx/Apache)がそのリクエストを受け取る
-
/usersへのリクエストは動的処理が必要なので、PHPの実行環境(PHP-FPMなど)に処理を渡す - PHP側でリクエストの中身を見て、DBにユーザーを登録する処理を実行する
- 処理結果(作成したユーザー情報など)をPHPがWebサーバーソフトウェアに返す
- Webサーバーソフトウェアが、その結果をHTTPレスポンスとしてブラウザに返す
図にするとこんな感じです。
そもそもNginxやApacheって何なのか
Nginx や Apache は、その「窓口」の代表格です。どっちも「Webサーバーソフトウェア」というジャンルの、具体的な製品名(実装)です。
- Apache: 歴史が長くて実績も豊富
- Nginx: 大量アクセスを軽量に捌けるのが売りで、最近よく使われている
- Caddy: HTTPS周りの設定が簡単
細かい特徴の違いはありますが、「HTTPリクエストを受け取って処理するプログラム」という点はどれも共通しています。設定ファイルで「このURLに来たリクエストはこう処理する」みたいなルールを定義して使います。
Node.js(JS/TS)の場合はどう違うのか
PHPは、自分自身ではHTTPリクエストを直接受け取れません。なので上の流れのように、Nginx/Apacheが窓口になって処理を渡してあげる必要があります。
一方Node.jsは、標準のhttpモジュールを使って自分自身でHTTPリクエストを直接受け取れます。Express などのフレームワークもこの仕組みの上に乗っているので、理論上はNginxやApacheがなくても動きます。TypeScriptもコンパイルすればただのJSなので同じです。
とはいえ実務では、Node.jsの前段にもNginxを置くことが多いです。理由は、
- HTTPS(SSL証明書)まわりの処理をまとめる
- 複数のNodeプロセスへの振り分け(ロードバランシング)
- 静的ファイル配信をNode本体にやらせず軽量なNginxに任せる
といったことをやらせたいからで、「必須ではないけど、あると便利だから置く」というのがPHPとの違いです。
「Webサーバーのホスティング」と「Webサーバーソフトウェア」の違い
Railway, Heroku, Render, Vercelとかも、なんとなく「Webサーバー」って呼ばれがちですが、これらはNginxやApacheそのものではありません。
- Webサーバーソフトウェア(Nginx, Apacheとか): リクエストを処理する「プログラム」そのもの。自分で機械に入れて、自分で設定する
- ホスティングサービス(Railway, Heroku, Render, Vercelとか): 機械の用意やWebサーバーソフトウェアの設定を、自分で意識しなくていいように肩代わりしてくれる「サービス」
具体的には、
- 機械を借りる契約をしなくていい
- NginxやApacheの設定ファイルを自分で書かなくていい
-
git pushするだけで裏側をよしなに用意してくれる
というのが、ホスティングサービスの役割です。内部では裏側でNginxのようなソフトウェアが動いていますが、そこはユーザーからは隠されています。
ホスティングの種類(IaaSとPaaS)
ホスティングサービスの中にも、「どこまで肩代わりしてくれるか」で種類が分かれます。
-
IaaS(Infrastructure as a Service): 機械(インフラ)だけ貸してくれるタイプ。NginxやApacheのインストール・設定は自分でやる必要がある
- 例: AWS EC2, GCP Compute Engine, さくらのVPSとか
-
PaaS(Platform as a Service): コードを置くだけで動かしてくれるタイプ。Webサーバーソフトウェアの設定はサービス側にお任せできる
- 例: Heroku, Railway, Render
Vercelはこの中だとPaaSに近く、フロントエンドやサーバーレス関数寄りの立ち位置です。
余談(S3やR2、SESとの違い)
似たような文脈でよく出てくるサービスとして、S3やR2、SESもあります。これらはIaaS/PaaSとは少し違うカテゴリです。
- S3(AWS)/ R2(Cloudflare): オブジェクトストレージ。ファイルの保存・配信が役割で、HTML/CSS/JSだけの静的サイトなら配信先として使える。ただし、PHPやNode.jsのようにサーバー側でコードを実行する機能は持っていない
- SES(AWS): メール送信専用のサービスで、Webサイトのホスティングとは無関係
目的ごとに整理すると、こんな感じです。
- 動的な処理を含むWebアプリを動かす → IaaS / PaaS
- 静的ファイルだけ配信したい → S3, R2などのオブジェクトストレージ
- メール送信だけしたい → SESなど
全体像のまとめ
全体像を図にすると、こんな感じです。
普段PaaS系のホスティングサービスを使ってると、Webサーバーソフトウェアの存在自体を意識する機会はあまりありませんが、裏では確かに動いています。IaaSを使う場合は、そこを自分で用意する必要がある、というのが違いです。