Open14

nginxについて学ぶ

NozomuNozomu

携わっている開発でnginxを使っているが、知識が全然ないので勉強する。単純な興味もある。

やること

  • nginxについて調べてメモ
  • nginxを実際に使ってみて学ぶ
NozomuNozomu

nginxの概要

  • nginx (エンジンエックス)は、HTTPおよびリバースプロキシサーバ、メールプロキシサーバ、および汎用TCP/UDPプロキシサーバ。
  • 初版は2004年に出ている。
  • DropboxやNetflixでも使われているらしい。

初見読み方わからなくて、無理矢理「ネグイネクス」とか読んでた記憶。

http://nginx.org/en/

NozomuNozomu

webサーバとアプリケーションサーバの違い(たまに忘れるのでメモ)

  • webサーバ
    • HTTPプロトコルを通じて、静的なWebコンテンツ(HTMLページ、ファイル、画像、動画など)をクライアントに提供
  • アプリケーションサーバ
    • 動的なコンテンツを生成するためのアプリケーションの実行環境を提供

https://www.nginx.co.jp/resources/glossary/application-server-vs-web-server/
https://www.ibm.com/jp-ja/topics/web-server-application-server

NozomuNozomu

nginxの特徴

メリット・デメリット

  • 大規模な処理や並列処理が得意で高速
  • メモリ消費量が少ない
  • 静的コンテンツに向いていて、動的コンテンツの処理が苦手

主な用途

  • 静的コンテンツのwebサーバ
  • リバースプロキシ
  • ロードバランサー

https://www.sbbit.jp/article/cont1/65256
https://cn.teldevice.co.jp/column/38275/

NozomuNozomu

Apacheとの比較

比較項目 Nginx Apache
動的コンテンツの配信 外部のアプリケーションサーバと連携 モジュールによる直接処理が可能
静的コンテンツの配信 高速 大量接続時の性能は劣る
メモリ消費量 大量接続時は多い
並列処理性能 高(イベント駆動型) 中程度(プロセス/スレッドベース)
NozomuNozomu

並列処理の戦略

イベント駆動型

  • 各接続に対して独立したプロセスやスレッドを生成する必要がないため、CPUとメモリの使用が抑えられ、大量の同時接続を効率的に処理できる。
  • 同じスレッドで実行される異なるタスク間でエラーが伝播する可能性がある

プロセス/スレッドベース

  • 各タスクが独立しているため、理解や開発が容易でエラーが発生しても他のプロセス/スレッドには影響しない
  • 大量のプロセス/スレッドを生成すると、それに伴うリソース(CPU、メモリ等)の消費が大きくなる

https://qiita.com/kamihork/items/296ee689a8d48c2bebcd

NozomuNozomu

プロキシについて

プロキシ(フォーワードプロキシ)

  • クライアント側に設置
  • クライアント(ユーザー)のリクエストを代理でインターネットに送り、結果をクライアントに返す
  • プロキシ(proxy)は代理という意味

リバースプロキシ

  • サーバー側に設置
  • インターネットからのリクエストを内部のサーバーに転送し、その結果をインターネットに返す
  • 一般的なプロキシとは逆方向(リバース)に働くのでリバースプロキシ

https://www.softbanktech.co.jp/special/blog/it-keyword/2022/0030
https://www.nginx.co.jp/resources/glossary/reverse-proxy-server
https://www.winserver.ne.jp/column/about_reverse-proxy/

NozomuNozomu

プロキシを使う理由

  • セキュリティ強化
  • キャッシュによるパフォーマンス改善

リバースプロキシはこれに加えて、負荷分散やSSL/TLS終端なども

負荷分散

  • 外部のクライアントによるアクセスをうまく分散させて負荷が集中しないようにする

SSL/TLS終端

  • リバースプロキシはSSL/TLS終端の役割を果たすことができ、アプリケーションサーバーの負荷を軽減できる

https://pfs.nifcloud.com/navi/words/ssl_accelerator.htm
https://www.ntt.com/bizon/glossary/j-r/load-balancer.html

NozomuNozomu

nginx実践

開発でもDockerを使っていて、管理がしやすいので学習にもDockerを使う

https://hub.docker.com/_/nginx

NozomuNozomu

簡単な表示まで

簡単にDockerflieとdocker-compose.ymlを記述。

ディレクトリ構造
root
|── nginx
│   └── Dockerfile
└── docker-compose.yml
Dockerfile
# ベースとなるDockerイメージを指定
FROM nginx

https://docs.docker.jp/engine/reference/builder.html

docker-compose.yml
version: "3" # 使用するdocker-composeのバージョン
services: # 定義するサービス(コンテナ)を列挙
  nginx: # サービス名
    build: # Dockerfileからイメージをビルドする
      context: ./nginx # Dockerfileがあるディレクトリのパス
      dockerfile: Dockerfile # ビルドに使用するDockerfileの名前
    ports: # ポートのマッピングを指定
      - "80:80" # ホストの80番ポートとコンテナの80番ポートをつなぐ

https://docs.docker.jp/v1.12/compose/compose-file.html

docker-compose upを実行して、localhostにアクセスしたら「welcome to nginx」が表示された

nginxのコンテナをビルドして起動すると、デフォルトで「Welcome to nginx!」というメッセージを表示するウェブページが配信される