Webアプリのインフラ構築でこんがらがったサーバーという言葉について

## はじめに
実務でインフラを構築する際、サーバーに関する言葉が多く飛び交い、混乱することがありました。そこで、自分なりに整理してまとめることにしました。インフラ初学者のため、内容に誤りがあるかもしれません。その際はぜひ教えていただけると幸いです。

「物理サーバー」「仮想サーバー」「Webサーバー」「アプリケーションサーバー」「DBサーバー」など、サーバーに関連する言葉が次々に出てくる中で、頭が混乱してしまうことがありました。

今回、実務で動作確認を目的とした低コストな本番環境を構築するために、AWSのLightsailを使って仮想サーバーを立てました。その仮想サーバー上に、Webサーバー、アプリケーションサーバー、DBサーバーを配置する構成を採用しました。しかしその際、「仮想サーバーの中にさらに仮想サーバーを作るのか？」みたいな混乱状態で作業を進めていました。

この経験を通して、「このままではいけない。自分の成長のためにサーバーの仕組みを正しく理解しよう」と決意し、改めてサーバーについて調べ直しました。その学びを整理した内容をここにまとめています。


## まず前提知識としてハードウェアとソフトウェアの違いについては以下の記事で理解しておいてください。
https://www.nippo-co.com/odm-kiban/odm-017/
https://hnavi.co.jp/knowledge/blog/software-description/


## ソフトウェアにおけるサーバーという言葉の意味
「サーバー」という言葉は、文脈によって指す対象が異なります。ここでは、**ソフトウェアとしてのサーバー**と**物理サーバーまたは仮想サーバー**の違いを整理します。

### ソフトウェアとしてのサーバー
- **意味**: 「特定のサービスを提供するプログラム」を指します。
物理的な存在ではなく、コードで構成されたプログラムやプロセスです。
- **動作**: ネットワーク上で「クライアント」からのリクエストを受け取り、それに応じて動作します。
- **例**:
    - Webサーバー: HTTPリクエストを処理するプログラム（例: Nginx, Apache）
    - アプリケーションサーバー: プログラムロジックを実行するプログラム（例: NestJS, Ruby on Rails）
    - データベースサーバー: データの保存とクエリ処理を行うプログラム（例: MySQL, PostgreSQL）

### 物理サーバー
- **意味**: 実際のハードウェア（コンピュータ）のことを指します。
ソフトウェアサーバーが動作する基盤となる機械そのものです。
- **動作**: 一つの物理サーバー上で複数のソフトウェアサーバーが動作することがあります。また、仮想化技術を使って、物理サーバー上に複数の仮想サーバー（後述）を動作させることも可能です。
- **例**: データセンターに設置されたラック型のサーバー機器。

## ソフトウェアサーバーと物理サーバーの違いを表でまとめる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490027/75e2d12d-ef04-4072-354b-b7a295bf8a0f.png)

### 仮想サーバーとの関係性
- **仮想サーバー**: 物理サーバー上で仮想化技術を使い、仮想的に構築されたサーバー環境のこと。
ソフトウェアサーバーは、この仮想サーバーの中で動作することが多いです。
- **例**: AWS LightsailやEC2のインスタンスは、仮想サーバーの一種です。その中で、Nginx（Webサーバー）やMySQL（DBサーバー）などのソフトウェアサーバーが動作します。


## その他
### 仮想サーバーとは
仮想サーバーは、物理的なサーバー（実際のハードウェア）を仮想化技術によって複数の独立したサーバーに分割したものです。それぞれの仮想サーバーは、あたかも独立した1台のサーバーのように動作します。
仮想サーバーと聞いたら物理サーバーみたいなものと思っておけば良い気がする。
https://www.cloudsolution.tokai-com.co.jp/white-paper/2021/0419-230.html

### アプリケーションとソフトウェアの違い
アプリケーションとソフトウェアの違いをひとことで簡単にいうと、カテゴリ範囲の違いらしい。

参考記事
https://rabiloo.co.jp/blog/app-and-software

### サーバーの語源などについての参考記事 自分なりの解釈も
参考記事
https://liginc.co.jp/519811

#### 結論 サーバーは2つの意味を持つ
1. **物体としてのサーバー**（物理サーバー・仮想サーバー）
    - 物理サーバー: 実際のハードウェアとして存在する高性能なコンピュータ
        - 例: データセンターに設置されている専用サーバー機
        - これは明確に「物体」であり、コンピュータそのものを指します

    - 仮想サーバー: 物理サーバーを仮想化技術で分割したもの
        - LightsailやAWS EC2のような「仮想サーバー」は、1つの物理サーバー上に仮想的に作られたコンピュータであり、物体として直接目に見えるものではありません

2. 役割としてのサーバー（ソフトウェアや機能の提供者）
    - サーバーは、「リクエストに応じてなにかを提供する」役割を指します。この場合、物体そのものではなく「機能・役割」を表します
    - 例:
        - Webサーバー（Nginx）: クライアントからのリクエストを受け取り、HTMLや画像などのデータを提供
        - アプリケーションサーバー（NestJS）: ビジネスロジックを処理してクライアントにレスポンスを返す


#### サーバーは「機能・役割」を重視する言葉
- 英語の "server" は、「serve（奉仕・提供する）」から来ています
- このため、「なにかを提供する役割を果たすもの」を指しており、それが 物理的なハードウェア である場合もあれば、単なる ソフトウェアや機能 を指す場合もあります

**例えで説明**
- もし「レストランのサーバー」をイメージすると、次のように役割が分かれます：
    - 「物理的なサーバー」 → レストランの建物全体や厨房（物理的な基盤）
    - 「役割としてのサーバー」 → ウエイターが料理を届けたり、お客さんの注文を受け取る仕事（リクエストに応える役割）

**ITのサーバー**
- 仮想サーバーや物理サーバーは「基盤そのもの」
- Webサーバーやアプリケーションサーバーは、その上で「リクエストに応じてサービスを提供する役割」

文脈に応じて「物体」なのか「役割」なのかを見極める必要があります。サーバーは「リクエストに応じてサービスを提供する」機能を強調した言葉であることを覚えておくと分かりやすいです。

### postgreSQLのデータの保存の仕組みについて気になったので少しメモ程度に書いておきます。
#### 1. ディスク上のファイルシステムに保存
- PostgreSQLはデータを、サーバーがホストしている物理ストレージ（通常はディスク）のファイルシステム上に保存します
- データは、PostgreSQLが管理する特定のディレクトリ（データディレクトリ）内のファイルとして保存されます
    - データディレクトリの例
        - macOS: /usr/local/var/postgres
        - Ubuntu: /var/lib/postgresql/15/main

#### 2. テーブルデータの保存
- 各テーブルのデータは、内部的に1つ以上のファイルとして保存されます
- PostgreSQLのテーブルデータはバイナリファイルで保存されています
- これらのファイルは、直接操作せず、PostgreSQLの標準ツールやSQLを使って安全に管理するのが基本です
- バイナリ形式は、パフォーマンスやデータ整合性を向上させるための重要な設計です