ApacheとNginxについて比較

# ミドルウェアとは
- コンピュータを制御するオペレーティングシステム（OS）と、特定の処理を行うアプリケーションソフトウェアとの仲立ちをする**ソフトウェア**のこと
- OSの基本的な機能だけでは、アプリケーションソフトが必要とする機能（サーバやデータベースとのやり取りなど）をカバーできない場合があり、**必要な機能を集約してパッケージとしてまとめたもの**がミドルウェア

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191919/4e1369ea-e74c-fa8b-45da-ba478670382b.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191919/23c39368-4732-53a0-7885-a7fe9ae80c7f.png)

## WEBサーバーソフトウェアとは
- ミドルウェアの一つ
- HTTPリクエストを送った時に、何かしらのレスポンスを返すプログラム

# Apacheとは
![apache.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/d03a4749-1d61-15f9-9856-bf502ff131b2.png)

- 「あぱっち」と読む
- 正式名称は「Apache HTTP Server」
- オープンソースソフトウェア(OSS)で、無償で誰でも利用可能
- **マルチプロセスモデル**（接続ごとにプロセスをフォーク≒コピーする）なのでメモリがいっぱいになりやすい
    - つまり、リクエストを処理するごとにリソースが枯渇していってしまう
- モジュールにより基本機能を拡張可能できるようになっている
    - これを利用すればイベント駆動モデルにもできるが、Nginxの方が性能には及ばないらしい
- CMS(Contents Management System)を利用する際に、比較的簡単な設定で済む
- **約20年間OSSとして公開**され、バージョンアップした結果により信頼性が高い
- 最近ではNginxと同じぐらいのシェア率の様子

## 起動してみる（Mac）
```
$ php -v
$ httpd -v
$ sudo apachectl start[stop]
```
確認 : `localhost:80` にアクセス
設定ファイル : `/etc/apache2/httpd.conf`

# Nginxとは
![nginx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/6d144e9e-8189-f869-d801-e16336d414d2.png)

- 「えんじんえっくす」と読む
- Apacheと同じく、OSS
- Apacheと比較して、Nginxは**高速かつ高負荷に強い**
- **C10K問題をはじめ、大容量のデータ配信や大量同時接続に耐えることを目的に設計**された
    - C10K問題について、「C」は「Client(クライアント)」、「10K」は「1万台」を表し、(ハードウェアやネットワーク性能に問題がなくても)同時クライアント接続数がある一定数を超えるとサーバがパンクしてしまう問題のこと
- ノンブロッキングI/Oと非同期のイベント駆動アーキテクチャを採用することで、**Apacheと比較して同時接続数が10～100倍ぐらい**になる
    - nginxはworkerと呼ばれるシングルスレッドのプロセスを複数利用している
- リバースプロキシ（特定のサーバへの要求を必ず経由するように設置されたプロキシサーバ）やロードバランサ（負荷分散装置）の機能も有している
    - キャッシュ付きのリバースプロキシ機能によって、メインサーバの代理としてコンテンツの送信を行い負荷を分散することができる
- 詳しいアーキテクチャについては**[Nginxのアーキテクチャについて理解する](https://qiita.com/kamihork/items/296ee689a8d48c2bebcd)**の記事を参照

## 起動してみる（Mac）
```
$ brew install nginx
$ nginx
$ nginx -s stop
```
確認 : `localhost:8080` にアクセス
設定ファイル : `/usr/local/etc/nginx/nginx.conf`

# それぞれのメリット/デメリット
- ApacheとNginxの**主な違いは駆動方式**にある
- **Apacheは、マルチプロセスのプロセス駆動アーキテクチャ**
    - 各リクエストをプロセスに割り当てて処理を行うため、リクエストが大量に来た際に、プロセスが同時に起動するのでオーバーヘッド（負荷処理）が非常に大きくなるというデメリットがある
- **Nginxはシングルスレッドモデルのイベント駆動アーキテクチャ**
    - Node.jsと同じく、イベントループ方式（シングルスレッドでループ処理をまわし、キューに溜まったイベントを処理していく処理方式）
    - イベントループ方式を採用することで、少量のプロセスだけで大量のリクエストを処理することが可能
    - これにより、C10K問題を解決できている

# 考察
- **Nginxの方が、処理が軽く大量のリクエストを処理するのに向いていおり、柔軟に設定を行うことが可能**
- 一方、NginxはCPUリソースがたくさん必要な処理には向いていない
    - これは、処理時間が長くなる処理を実行した際、そこでプロセスがブロックされてしまい処理能力が落ちてしまうため
- **処理能力に関して、ApacheよりもNginxの方が1.47倍高い**結果もでている
    - ※ Apacheもモジュール（event_mpm）の設定を正しくチューニングすることで、Nginxに及ばないまでも、かなりのパフォーマンスを期待することができる様子

# 結論

## Nginxを選択する場合
- 負荷が高く、**スケーラビリティが要求されるような場合**
- 静的ページに**同時多数のアクセスが想定されるような場合**

## Apacheを選択する場合
- 負荷が低く、**早期または簡易的なセットアップが必要な場合**
- 同時アクセス数が小さく、単純にリクエスト数が多いような場合

# 参考文献
- ミドルウェアとは : https://thinkit.co.jp/article/11837
- webサーバーとは : https://eng-entrance.com/web-server-mechanism
- ApacheとNginxとPassengerとUnicornの違い : http://fujiike.hateblo.jp/entry/2015/08/20/170751
- Apacheとは : https://www.kagoya.jp/howto/rentalserver/apache/
- Apacheの4つの特徴と基本的なモジュール : https://furien.jp/columns/219/
- Nginxとは : https://www.utali.io/entry/2017/04/24/223721
- NginxとApache HTTP Serverの違いメモ : https://qiita.com/tomoyamachi/items/06b2eca14987a30b8fda
- Apahceとnginxをどちらを採用するべきかメリット・デメリット比較 : https://qiita.com/pink/items/7709218310b5cf11eabe
- ApacheかNginxか迷ったときに見るページ : https://www.out48.com/archives/1576/
- Macでローカルサーバを立ち上げる方法 : https://qiita.com/shuntaro_tamura/items/bdabcb77926dc92617b1
- Macでnginxを使う : https://qiita.com/awakia/items/8aad7b57aead3cf9720d