非エンジニアにサーバーって何ですか?って聞かれて説明できますかって話。
サーバーって、何者かわかっていますか?
エンジニア同士の会話や今ならChatGPTなどでもいいです。「サーバー」って言葉たくさん出没します。これを一々明確にしなくても話が噛み合うのは文脈から汲み取っているからだと思います。ここに非エンジニアまたは駆け出しのエンジニアを入れてみましょう。完全に置いてけぼりですよ。
はじめに。
私自身、昨年エンジニアになったばかりの其の「駆け出しエンジニア」です。
フロントエンドの開発が主なわけですが、当初はローカルで開発している時の yarn dev くらいしか「サーバー」という言葉を意識することがありませんでした。時は経ち、バックエンド開発もするようになり、この壁に苛まれます。
サーバーって⚪︎種類あんねん。
本題です。皆さんはパッと思いつくだけで何種類の「サーバー」を思い浮かべられますか?
私はもう調べたのでたくさん出てきますよ。
サーバーって7種類あんねん。
- 物理・仮想マシンとしてのサーバー
- OS上で動くプロセスとしてのサーバー
- HTTPリクエストを受ける役割としてのサーバー
- APIを提供するバックエンドとしてのサーバー
- フロントエンドを配信・描画するサーバー
- 開発時だけ使う dev server
- 概念上の client / server のサーバー
今回私が注目したいのは、「物理・仮想マシンとしてのサーバー」・「OS上で動くプロセスとしてのサーバー」これら2つです。さっそく解説です。
まず前提として「サーバー」の定義を。
サーバーとは「要求を受けて応答する側」のことを指します。
Client ---- request ----> Server
Client <--- response ---- Server
この意味では、スマホアプリから見たAPIというのはサーバーです。ブラウザから見たWebサーバーもサーバーです。別のバックエンドサービスから呼ばれるマイクロサービスもサーバーです。つまり、あるプログラムが常にサーバーというわけではなく、通信の中で要求を受ける側ならサーバーということです。
物理・仮想マシンとしてのサーバー
昔ながらの意味では、サーバーは物理的なコンピューターです。
データセンターにある物理マシン
- CPU
- メモリ
- SSD
- ネットワーク
- Linux などのOS
今は物理マシンを直接触らず、AWSなどの仮想マシンを触ることがほとんどです。
「じゃあ、そういうものなんだ。」と納得できないのがエンジニアの性、いや私というひとりの人間の性格上難しい話で。とことん知りたいタチなもんで。先に謝っておきます。このセクションだけ異常に文字多くなります。この後の話は私の中の霧を晴らしてくれた重要な情報、思入れのある話題なので厚めに文章を盛り込ませていただいてます。
話は移りまして。
日常会話でも「クラウド」って言葉割と聞きますよね。私はクラウドについて変な感覚を覚えていました。
スマホを機種変した時、データ移行をクラウドサービスを使って写真を移したりすると思うんですけど、正直こういうものだよなって見て見ぬふりをしていました。ずっと不思議には思っていたのです。「私の写真ってどこにあったの?」って。クラウドっていう言葉のせいで抽象的な雲の中の存在感があって。これはこの仕事をしていても同じ感覚でした。
結論
AWSやiCloud、Google Cloudも、世界のどこかにある巨大なデータセンターの中の大量の物理マシンがせっせこと働いているわけです。私はこれを知って一気にプログラムに精通した感覚が今でも鮮明に思い出されます。
何を伝えたいのかというと、「サーバー」と言うとどこか遠い世界に感じますが、世界のどこかでは結局物理のマシンが頑張って働いているので、HTTPリクエストを飛ばしたときも世界のどこの物理マシンが応答しているということです。
ローカルで開発している時は、ご自身のPCの中でたくさんのアプリケーションプロセスが実行されていて、そのアプリケーション間で通信が行われています。なのでローカル環境こそが世界の縮図なのです。
OS上で動くプロセスとしてのサーバー
OS上で起動して、リクエストを待ち受けているプログラムもサーバーと呼びます。
例えばNode.jsでこれを書くとします。
import http from "http";
const server = http.createServer((req, res) => {
res.end("Hello");
});
server.listen(3000);
Node.jsプロセス
Linux / macOS
└── node プロセス
└── port 3000 でHTTPリクエストを待ち受ける
このNode.jsプロセスは、HTTPリクエストを受けてレスポンスを返すので「サーバー」と呼ばれます。
つまり、Node.js = サーバー となるのではなく、
Node.jsでHTTPリクエストを待ち受けているプログラムを書いた場合、そのNode.jsプロセスはサーバーとして振る舞う
という表現が正確です。Node.js自体はJavaScript実行環境ですが、サーバーそのものではありません。以下画像を見るとイメージを掴みやすいと思います。
まとめ
いかがだったでしょうか。この記事は駆け出しエンジニアはもちろんですが、どちらかというと中堅層に該当するエンジニアの方に読んでいただきたいです。
サーバーが何なのかを知っていただくというよりも、過去のインプットや実戦による経験値から何となくで理解が止まってしまっている状況は勿体無いですよというメッセージが本質です。
突き放すような表現になりますが、今ならAIを使えば何でも勉強できる時代です。気になったことはとことん調べてとことんアウトプットしましょう。私もこれを皮切りにアウトプット多めの人生を歩もうと考えています。切磋琢磨しましょう!

