これだけは知っておきたいApacheとNginx

`Apache`や`Nginx`という名前を耳にしたことがあるでしょうか？

おそらくウェブサイトの公開をしたことがある方なら、`.htaccess`をいじってアクセス制限をしたり、Xserverなどでサイトがうまく公開されなかった際にNginxのエラー文がでてきてなんとなく見たり聞いたことある人も多いのではないでしょうか？

サービスのデプロイでレンタルサーバーを利用する場合、サーバー設定の多くがサーバー会社側で既に行われているため、公開作業が非常にシンプルです。そのため、サーバーの裏側の処理を詳しく理解していなくても、初心者でもサービスを公開することができます。

ApacheやNginxはそんなサーバーに密接に関わる『ウェブサーバー』と呼ばれるミドルウェアの２大巨頭であり、実はこれらウェブサーバーがWebサービス公開の裏側で大活躍してくれています。
今回はそんなApacheとNginxについて、ウェブエンジニアとして脱初心者を目指したい方向けに『最低限これだけは知っておきたい！』という観点でざっくりとまとめました。

<br />

## ミドルウェアとは？

ミドルウェアとは、オペレーティングシステム（OS）とアプリケーションの間に位置するソフトウェアのことを指します。簡単にいうと、**アプリケーションが動作するための土台を作ってくれるツール**です。
例えば、データベースへのアクセスをサポートするものや、ネットワーク通信を補助するものなど、様々な用途のミドルウェアがあります。

![Development tools.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/2b79a730-b9ee-d8e0-64e7-b0be5b4d9371.jpeg)
画像引用: https://it-trend.jp/development_tools/article/32-0044

:::note info
Apache・Nginxも様々な用途がありますが、例えばクライアント側（ブラウザ側）からのリクエストを適切なファイルにルーティングしたり、クライアント側からのリクエストを複数のアプリケーションサーバーに分散してサーバーへの負荷を分散するなどの目的があります。
:::
<br />

## ウェブサーバーとは？

ウェブサーバーは、インターネットを通じてウェブページをユーザーに提供する役割を持つソフトウェアです。
例えば、あなたがブラウザでウェブサイトを開くと、そのリクエストがウェブサーバーに送られます。そしてウェブサーバーがそのリクエストに応じてウェブページを返すという仕組みです。
ウェブサーバーには、今回のテーマであるApacheやNginxのほかにも`LiteSpeed`や`IIS`などいくつかの種類があります。

<br />

## Apache

![foundation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/e35b0896-5397-0d9e-068f-607b498d6501.png)
画像引用: https://www.apache.org/

### 概要

Apacheは、最も歴史のあるウェブサーバーの一つで、ウェブサーバーのデファクトスタンダードとなっています。正式名称は「Apache HTTP Server」で、オープンソースのプロジェクトとして開発されています。

### 特徴

- **モジュールベースで必要な機能だけを選んで使えるので、細かく柔軟なカスタマイズが可能**
- **.htaccessファイルを利用してディレクトリごとに機能を設定できる**
- **歴史が長いため、ドキュメントやコミュニティが充実しており、エラーメッセージの対処法などの情報を見つけやすい**
- **マルチプロセスの動作モードを使う場合が多いため、メモリを大量に消費する**
　※workerやeventモードにするなど設定次第では軽量化も可能
- **重い処理は得意だが、同時接続数が多くなる場合が苦手**


### 基本的な設定ファイル

Apacheの設定は、主に`httpd.conf`というテキストファイルで行います。設定ファイルでは、モジュールのロード、リクエストの処理方法、ログの設定など、多岐にわたる設定が可能です。  

設定例:
```bash:httpd.conf
# 使用するポート番号
Listen 80
# Apacheのインストールディレクトリ（環境により適宜変更）
ServerRoot "/etc/httpd"
# ドキュメントルート（公開するデータを格納するディレクトリ）を指定
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
    # ディレクトリ内のデフォルトファイルとしてindex.htmlを指定
    DirectoryIndex index.html
    # .htaccessファイルの設定を無視。
    AllowOverride None
    # ディレクトリへの全アクセスを許可
    Require all granted
</Directory>
# ログファイルの設定
# エラーログの出力先
ErrorLog "/var/log/httpd/error_log"
# アクセスログの出力先とフォーマット
CustomLog "/var/log/httpd/access_log" combined
```

設定の変更を反映させるには以下のコマンドを実行して、Apacheを再起動する必要があります。


#### Debian系（Ubuntuなど）

```bash:bash
sudo systemctl restart apache2
```

#### Red Hat系（CentOSなど）

```bash:bash
sudo systemctl restart httpd
```

<br />





## Nginx

![Nginx logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/6268cf35-5c01-cf53-0a0e-58362bc60784.png)
画像引用: https://nginx.org/en/

### 概要

Nginxは、2004年に登場した比較的新しいウェブサーバーで、高パフォーマンス、スケーラビリティ、軽量性を重視して設計されており、近年シェアを急速に拡大しています。リバースプロキシやロードバランサーとしてもよく利用されます。

:::note info
「リバースプロキシ」
→クライアントからのリクエストを受けて、内部のサーバーに転送し、サーバーからの返答をクライアントに届ける橋渡し役のサーバー
「ロードバランサー」
→複数のサーバーにリクエストを均等に振り分けて、各サーバーの負荷を分散させる仕分け役のサーバー
:::

### 特徴

- **非同期処理により、高い同時接続数を処理できる**
- **リソースの消費が少なく応答が速いなど高パフォーマンス**
- **リバースプロキシとしても利用可能**
- **設定ファイルが比較的シンプルで、直感的に理解しやすい**
- **シングルスレッドのため、メモリ消費が少ない**
- **多量の同時接続数をさばくのは得意だが、重い処理が苦手**

### 基本的な設定ファイル

Nginxの設定は、`nginx.conf`ファイルで行います。この設定ファイルでは、ワーカーの数、リクエストの処理方法、プロキシ設定などを行います。

:::note info
「ワーカープロセス」
→Nginxがリクエストを処理するための実際の作業を行うプロセス
:::

設定例:
```nginx:nginx.conf
# ワーカープロセスの数
worker_processes auto;
# HTTPサーバー設定
http {
    # サーバーごとの設定
    server {
        # 使用するポート番号
        listen 80;
        # 使用するドメインを指定
        server_name example.com;
        # ドキュメントルート（公開するデータを格納するディレクトリ）を指定
        root /var/www/html;
        # デフォルトのインデックスファイル
        location / {
            index index.html;
        }
    }
}
```

設定ファイルを変更したら、nginxをリロードして変更を反映させます。

```bash:bash
nginx -s reload
``` 

<br />

## 両者のシェア率

Apacheよりも後に公開されたNginxですが、2024年1月現在、日本、世界共にApacheのシェアを抜きトップに君臨しています。

![webserver-share-rate-japan-202401.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/d09409d9-49e0-5ff0-972c-4f64c4df6b64.jpeg)
![Webserver Share Rate 2024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/fd9912e0-9b44-04cf-4fe6-134786113bda.jpeg)
画像引用: https://wp-search.org/ja/blog/webserver-share-ranking/

<br />

## 両者の使いどころ

### Apache

-   少量の同時接続で重い処理が必要な場合
-   .htaccessを利用して、ディレクトリごとに細かい設定をしたい場合
-   ウェブサーバーにあまり慣れていない場合（ドキュメントやネット情報が比較的多い）
-   動的コンテンツを配信したい場合

### Nginx

-   多量の同時接続をさばくなどの高いパフォーマンスが求められる場合
-   特に静的データの多量の同時接続を処理し、高速でコンテンツを提供したい場合
- 「リバースプロキシ」「ロードバランサー」として使用したい場合（Apacheでも利用できるが、Nginxの方が得意な場合が多い）
-   サーバーのメモリ使用量を抑えたい場合

※両者のウェブサーバーは必ずしもどちらかのみでしか使用できないわけではなく、両者の特性を生かして共存する場合もあります
例）Nginxをフロントエンドプロキシとして使い、静的コンテンツの配信や負荷分散を担当し、Apacheをアプリケーションサーバーとして動的コンテンツを処理

<br />

## まとめ

ApacheとNginxは、それぞれ処理に得意不得意があるので、ウェブサーバーを選択する必要がある場合はプロジェクトの特性に合わせて選択すると良いと思います。
今回はウェブサーバーの基本的な部分しか触れていないので、公式ドキュメントなどを参考にもっと掘り下げて、開発の知見を深めていきたいと思います。

<br />

## 採用拡大中！

アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドのエンジニア仲間を大募集しています！
少しでも興味ある方は、カジュアル面談からでもぜひお気軽にお話ししましょう！
お問い合わせはこちらから↓
[https://official.assisteng.co.jp/contact/](https://official.assisteng.co.jp/contact/)

<br />

## 参考資料

-   [Apache HTTP Server 公式ドキュメント](https://httpd.apache.org/docs/current/configuring.html)
-   [Nginx公式ドキュメント](https://nginx.org/en/docs/)
-   [NginxとApacheをわかりやすく比較、Nginxが「絶対王者」のApacheを超えたワケ](https://www.sbbit.jp/article/cont1/65256)
-   [【2024調査】Webサーバーの人気シェアランキング【日本/海外、Nginx/Apache】](https://wp-search.org/ja/blog/webserver-share-ranking/)