『 Software Design 2026年5月号』
ネットワークを通じてSaaSやSNSなどさまざまなITサービスを提供するために、サーバーは欠かせない存在です。本章では、ITインフラの基本であるサーバーが、どのような要素で構成されているかしっかり押さえます。そして、近年欠かせない仮想化とコンテナの技術によるサーバー構築を体験してみましょう。
サーバーとは
サーバーとは、ネットワークを通じて他のコンピュータにサービスを提供するコンピュータやプログラムのことを指します。サービスの利用者をクライアントと呼び、クライアントの要求に応じてサーバーがサービスを提供します。
提供するサービスによってサーバーを分類できます。たとえば、Webブラウザへコンテンツを提供するサーバーのことを
サーバー内ではサービスを提供するためにプログラムを常時起動させ、クライアントの要求を待ち受けます。どのクライアントからいつ、どのような要求があるかわからないためです。
サーバーはコンピュータなので、私たちが普段使用するPCと同じ構成です。ただ、クライアントからの要求を多数・
ユーザーが快適にITサービスを利用できるかは、サービス提供元であるサーバーがいかに安定稼働できるかにかかっています。その意味でサーバーがITインフラの中核を担っていると言えるでしょう。
サーバーの構成要素
サーバーはさまざまなパーツによって構成されています。ハードウェアとソフトウェアの両面から、サーバーを構成する要素を見ていきましょう。
ハードウェア面での構成要素
ハードウェアとしてサーバーを構成している要素は図1のとおりです。1つずつ解説します。
マザーボード
マザーボードはサーバーを構成するパーツが接続される主要な回路基板です。CPU、メモリ、ストレージ、NICなどのサーバーに必要なすべてのパーツを接続する役割を担っています。
CPU
CPU
現代のCPUは複数の
GPU
GPU
GPUは大量の小さなコアを備えており、これにより同時に多くのデータを処理できます。通常のCPUは数個から数十個のコアを持つことが一般的ですが、GPUは数百から数千のコアを搭載しており、特に定型的かつ膨大な計算をする場合、CPUよりも優れたパフォーマンスを発揮します。
メモリ
メモリ
メモリの最大の特徴は
サーバー向けのメモリには、データの誤りを自動的に検出・
ストレージ
ストレージはデータを永続的に保存し、必要なときに取り出すための装置です。
- HDD
(ハードディスクドライブ:Hard Disk Drive) - SSD
(ソリッドステートドライブ:Solid State Drive)
HDDは磁気ディスク上にデータを格納し、データを読み書きする際に回転するディスクと、ディスクからデータを読み取る磁気ヘッドがあります。大容量で低コストですが、機械的な構造のためアクセス速度が遅く、耐障害性に劣る特徴があります。
SSDはフラッシュメモリ
サーバー向けのストレージには、RAID
NIC
NIC
ソフトウェア面での構成要素
これまでハードウェア面でのサーバーの構成要素を説明してきましたが、ソフトウェア面でもサーバーはさまざまな構成要素から成り立っています。ソフトウェアをうまく組み合わせることで、サーバーはさまざまなサービスを提供できるようになります。
ソフトウェアはファームウェア、OS、ミドルウェア、アプリケーションの4層に分類できます
BIOS、UEFI
BIOS
BIOSはハードウェアを初期化し、OSを読み出して起動する役割を担っています。電源投入後、マザーボード上のROMからBIOSが読み込まれ、ハードウェアの初期化やPOST
BIOSは古くから使われてきたファームウェアですが、現在ではBIOSの後継として開発されたUEFIが主流となっています。
OS
OSはOperating Systemの略で、コンピュータのハードウェアを管理し、ユーザーやアプリケーションがハードウェアを利用できるようにするソフトウェアのことを指します。OSは、ハードウェアリソースの管理
カーネル
カーネルはOSの中核をなす部分です。ハードウェアとソフトウェアの橋渡しをする役割を担っています。カーネルは、プロセス管理
ハードウェアの制御をカーネルが担うことで、アプリケーションは簡単にハードウェアを利用できるようになります。
ミドルウェア
アプリケーション開発において、開発者は本来、独自のビジネスロジックの実装に集中したいものです。しかし実際には、ユーザーのログイン処理やログの記録など、ビジネスロジックとは直接関係のない、どのアプリケーションにも共通する処理が数多く存在します。こうした処理をあらかじめ用意されたミドルウェアに任せることで、開発者はビジネスロジックに集中でき、開発効率を大きく向上させることができます。
代表的なミドルウェアとしては、Webサーバー、アプリケーションサーバー、データベースサーバーなどが挙げられます。
Webサーバー
Webサーバーは、HTTPプロトコルを使用してクライアントからのリクエストを受け取り、適切なレスポンスを返すミドルウェアです。Webサーバーは、静的なコンテンツ
代表的なWebサーバーには、Apache HTTP ServerやNginxがあります。
アプリケーションサーバー(APサーバー)
アプリケーションサーバーはアプリケーションの実行環境を提供するミドルウェアです。Webサーバーからのリクエストを受け取り、アプリケーションコードを実行して、レスポンスを動的に生成します。
アプリケーションサーバーの構成要素として、次の2つがあります。
- アプリケーションサーバーソフトウェア:Webアプリケーションの実行環境を提供する
- Webアプリケーションフレームワーク:Webアプリケーションの構築を支援する
Webアプリケーションフレームワークは、アプリケーションを実装するプログラミング言語によってさまざまなものが存在します。たとえば、言語がPythonであればGunicorn+Django/
データベースサーバー
データベースサーバーは、データベース管理システム
Web三層アーキテクチャ
Webシステムを設計するとき、すべての処理を1ヵ所に詰め込んでしまうと、システムが大きくなるにつれて修正や拡張が非常に難しくなります。そこで広く採用されているのが、システムを次の3つの層に分ける
- プレゼンテーション層:ユーザーの目に触れる
- アプリケーション層:ビジネスロジックを担う
- データ層:データを蓄える
プレゼンテーション層は、ユーザーが直接操作する画面そのものです。ブラウザに表示される画面、スマートフォンのアプリ画面などがこれにあたります。
アプリケーション層は、システムの頭脳とも言える部分です。サービスの提供に必要なビジネスロジックはすべてここで処理されます。プレゼンテーション層からのリクエストを受け取り、必要に応じてデータ層に問い合わせて結果を返す、その橋渡し役を担います。
データ層は、アプリケーション層から受け取ったデータを管理する部分です。データの保存や、リクエストに応じたデータの検索・
この三層に分ける最大の恩恵は、機能改修によって生じる変更の影響範囲を局所化できることです。たとえば、見た目を変えたい場合にはプレゼンテーション層だけを変更すればよく、ビジネスロジックやデータ管理の部分にはいっさい手を加える必要がありません。Webシステムの開発ではフロントエンドとバックエンドで分業体制を組むことも多いですが、それが可能なのはWeb三層アーキテクチャのおかげでもあるのです。
自身のPCの構成要素を確認してみる
fastfetchを使うと、これまでに紹介したCPU、メモリ、ストレージなどの構成情報を一度に確認できます。同様のツールとしてneofetchが有名ですが、現在は開発が終了しており[4]、fastfetchはその後継ツールに位置付けられています。インストール方法はfastfetchのGitHubリポジトリ[5]のREADME.
$ fastfetch -c all.jsonc
筆者のMacBook Air
| 項目 | 値 |
|---|---|
| CPU | Apple M1 |
| GPU | Apple M1 |
| メモリ | 8. |
| ストレージ | 465. |
| OS | macOS Sequoia 15. |
| BIOS | iBoot 11881. |
| カーネル | Darwin 24. |
| NIC | Wi-Fi 6 |
サーバーの仮想化
仮想化とは?
仮想化とは、1台の物理マシン上で複数の仮想的なマシンを作成・
- 複数の仮想的なマシンを立ち上げることで、物理マシンのリソースを効率的に活用できる
- 仮想マシンの作成や削除が容易で、開発環境やテスト環境の構築が迅速に行える
仮想化には大きく分けて
仮想マシン型仮想化
仮想マシン型仮想化とは、物理マシン上に複数の仮想マシンを作成し、それぞれが独立したOSを持ち、完全に分離された環境で動作する仮想化技術のことを指します。仮想マシン型仮想化にも
ホスト型仮想化
ホスト型仮想化は、ホストOS上で仮想マシンを実行する仮想化技術のことを指します。ホストOSが仮想マシンの管理を行い、仮想マシンはホストOSが提供する仮想化されたハードウェアを利用して動作します。
メリットとしては、ホストOSが提供するドライバーや機能を利用できるため、仮想マシンの構築や管理が比較的簡単であることが挙げられます。一方デメリットとしては、ホストOSを介して仮想マシンがハードウェアにアクセスするため、パフォーマンスが劣ることが挙げられます。
代表的なホスト型仮想化のツールには、VirtualBoxやVMware Workstationがあります。
ハイパーバイザー型仮想化
ハイパーバイザー型仮想化は、物理マシンのハードウェア上で直接仮想マシンを実行する仮想化技術のことを指します。ハイパーバイザーが仮想マシンの管理を行い、仮想マシンはハイパーバイザーが提供する仮想化されたハードウェアを利用して動作します。
メリットとしては、ホストOSを介さずに仮想マシンがハードウェアにアクセスするため、パフォーマンスが向上することが挙げられます。デメリットとしては、ハイパーバイザーの管理が必要であるため、仮想マシンの構築や管理がホスト型仮想化と比べて複雑になることが挙げられます。
代表的なハイパーバイザー型仮想化のツールには、VMware ESXiやMicrosoft Hyper-Vがあります。
コンテナ型仮想化
コンテナ型仮想化とは、ホストOSのカーネルを共有しながら複数のコンテナを実行する仮想化技術のことを指します。コンテナは、アプリケーションとその実行に必要なリソースを1つにまとめたもので、ホストOSのカーネルを共有して動作します
メリットとしては、ホストOS上で通常のプロセスを起動するのとほとんど同じ感覚でコンテナを起動できるため、仮想マシン型仮想化と比べて軽量で高速に動作し、リソースの効率的な利用が可能であることが挙げらます。デメリットとしては、カーネルを共有しているため、カーネルが異なるコンテナを起動できないこと[7]、仮想マシン型仮想化と比べてセキュリティ面でのリスクが高いことが挙げられます。
コンテナ型仮想化の代表的なツールにはDockerがあります。
実践:アプリケーションサーバーを構築する
仮想マシン型仮想化とコンテナ型仮想化によるサーバーを構築してみましょう。最初に仮想マシン型仮想化を使ったVirtualBoxによるサーバー構築、次にコンテナ型仮想化を使ったDockerによるサーバー構築を試してみます。
今回構築するPhotoprismについて説明します。Photoprismは写真の管理や閲覧を行うためのアプリケーションです。類似のサービスにGoogleフォトやAmazon Photosなどがありますが、Photoprismはオープンソースで提供されており、ユーザーが自分のサーバーにインストールして利用できます。
Photoprismの説明に
実践①:仮想マシン編
VagrantとVirtualBoxを使用して仮想マシンを作成し、Photoprismを構築してみましょう。
必要なソフトウェアのインストール
VirtualBoxのインストール
仮想マシン
Vagrantのインストール
VagrantはHashiCorp社が開発した仮想マシン管理ツールです。設定ファイル
HashiCorp社の公式サイト[9]からVagrantのインストーラをダウンロード後、インストールします。
インストール後、コマンドラインでVagrantが利用できることを確認しましょう。
$ vagrant --version
サンプルコードの取得
本節で使用するVagrantfileはGitHubリポジトリで公開しています。図8のコマンドでcloneしてください。
$ git clone https://github.com/Penpen7/software-design-202605-chap2-sample-code
仮想マシンの起動
Vagrantfileが準備できたら、次のコマンドで仮想マシンを起動します。
$ vagrant up
このコマンドを実行すると、Vagrantfileの記述に基づいて仮想マシンが立ち上げられます。具体的には次の処理が自動的に順次実行されます。
- Ubuntuの仮想マシンイメージをダウンロード
- VirtualBox上で仮想マシンを作成・
起動 - システムパッケージの更新
- Photoprismの依存パッケージをインストール
- Photoprism本体のダウンロード、インストール
- 設定ファイルの作成
- Photoprismをsystemdサービスとして起動
初回実行時は仮想マシンイメージのダウンロードとセットアップに10~20分程度かかるので気長に待ちましょう。
仮想マシンを起動した場合、図9のような構成になっています。ホスト上の2342番ポートへの通信が、Photoprismが通信を待ち受けている仮想マシン上の2342番ポートへ転送されます。
Photoprismの動作確認
仮想マシンが正常に起動したら、Webブラウザから http://
ログイン画面ではNameに
うまくアクセスできない場合は、vagrant up時のログや次のコマンドでphotoprismサービスの起動状況を確認してみてください。
$ vagrant ssh $ journalctl -u photoprism | less
このコマンドを実行することで、vagrant sshで仮想マシンにSSH接続し、Photoprismサービスのログを確認できます。
デフォルトの言語設定は英語のためサイドバーから
初回起動時は写真がサーバー上にないため、写真の閲覧ができません。写真をアップロードするには、サイドバーから
アップロードすると写真の内容を分析し、検索結果に写真が表示されるようになります。一部の写真が検索結果に表示されないことがありますが、Photoprismでは写真の品質が低いと判断されると検索結果に表示されない仕様になっています[10]。サイドバーから
仮想マシンの停止と再起動
仮想マシンを再起動して起動にどれくらい時間がかかるか、次のコマンドで確認してみましょう。
# 仮想マシンの停止 $ vagrant halt # 仮想マシンの起動 $ vagrant up
筆者の環境では、停止から起動までの時間はおよそ20秒でした
$ time vagrant up
(..略..)
vagrant up 1.75s user 1.45s system 15% cpu 20.570 total
仮想マシンの起動にはゲストOSの起動が必要となるため、起動が完了するまでに時間がかかるとされています。次節の
お片付け
仮想マシンは次のコマンドで削除できます。
$ vagrant destroy
実践②:コンテナ編
必要なソフトウェアのインストール
コンテナ仮想化を体験するため、今回はDocker Desktopを使います。Docker DesktopはDocker社が開発した、Docker Engine、Docker CLI等のDockerコンテナの実行に必要なリソースをまとめて提供するプロダクトです。公式サイト[11]からインストーラをダウンロード・
Docker Desktopがインストールできたら、dockerコマンドが使用できるか確認しましょう。
$ docker version
コンテナの起動
Dockerがインストールされたことを確認したらいよいよコンテナを起動してみます。コンテナを起動するには図12のようにdocker runコマンドを使います。
$ docker run -d \ --name photoprism \ --security-opt seccomp=unconfined \ --security-opt apparmor=unconfined \ -p 2343:2342 \ -e PHOTOPRISM_UPLOAD_NSFW="true" \ -e PHOTOPRISM_ADMIN_PASSWORD="insecure" \ -v /photoprism/storage \ photoprism/photoprism:251130
各オプションの効果は次のとおりです。
-d:バックグラウンドで起動-p 2343:2342:ホストの2343番ポートをコンテナの2342番に転送-e PHOTOPRISM_:環境変数ADMIN_ PASSWORD="insecure" (管理者パスワード) を設定 -v /photoprism/:コンテナを削除してもデータが残るように永続化storage
コンテナが正常に起動すると、コンテナIDが表示されます。
起動に失敗すると何らかのエラーメッセージが表示されます。失敗する典型的な原因としては次が挙げられます。
- 「Cannot connect to the Docker daemon」
エラーに対してはDocker Desktopが起動しているか確認し、起動していなければ起動する - 「port is already allocated」
エラーに対しては、他のプロセスとポート番号が重複しているため、-pオプションの2343を別の数字に書き換える
コンテナを起動した場合、図13のような構成になっています。ホスト上の2343番ポートへの通信が、Photoprismが通信を待ち受けているコンテナ上の2342番ポートへ転送されます。
コンテナの状態確認
コンテナが正常に起動したかを次のコマンドで確認しましょう。
$ docker ps
このコマンドで実行中のコンテナ一覧が表示され、photoprismコンテナが動いていることが確認できます。
Photoprismにアクセスする
コンテナが起動したら、Webブラウザから http://
$ docker logs photoprism
ログイン方法や写真のアップロード操作は仮想マシン編で解説した手順と同様です。
コンテナの起動の速さを体感する
コンテナを停止して再度起動するまでの時間を次のコマンドで確認してみましょう。
# コンテナを停止 $ docker stop photoprism # コンテナを起動 $ docker start photoprism
筆者の環境では、停止から起動までの時間はおよそ2秒でした
$ time docker start photoprism photoprism docker start photoprism 0.03s user 0.02s system 2% cpu 2.105 total
仮想マシンが20秒かかったのに対し、コンテナはわずか2秒で起動しました。これほど速く起動できるのは、コンテナがホストOSのカーネルを利用しているためOSのブートプロセスが不要なためです。
コンテナの停止と削除
作業が終わったら、作成したコンテナを次のコマンドでお片付けしましょう。
# コンテナを停止 $ docker stop photoprism # コンテナを削除 $ docker rm photoprism
まとめ
サーバーはITインフラの中核を担う存在ですが、同じ
この章で得た知識を土台に、ぜひ目的に合ったサーバー構築にチャレンジしてみてください。
参考情報
- 鶴長鎮一、山本尚明、山根武信、北崎恵凡 著
『図解即戦力 ITインフラのしくみと技術がこれ1冊でしっかりわかる教科書』 技術評論社 (2024) - 野口健一郎、光来健一、品川高廣 著
『IT Text オペレーティングシステム (改訂2版)』オーム社 (2018) - 中島康彦 編著
『OHM大学テキスト コンピュータアーキテクチャ』 オーム社 (2012) - 井上直也、村山公保、竹下隆史、荒井透、苅田幸雄 著
『マスタリングTCP/ IP 入門編 (第6版)』オーム社 (2019) - 清野克行 著
『必携ICTガイドブック』 ラトルズ (2015) - Michael Hausenblas 著、武内覚、大岩尚宏 訳
『入門 モダンLinux ―オンプレミスからクラウドまで、幅広い知識を会得する』 オライリー・ ジャパン (2023) - 鈴木雅暢、滝伸次、DOS/
V Power Report編集部 著 『BIOS/ UEFI完全攻略読本 Skylake&Windows 10対応版』 インプレス (2016)