ちょっと話題の記事

ALB経由で公開するAPサーバに(リバースプロキシ用の)Webサーバーを利用する意味はあるのか?立ち止まって考えてみた

2019.10.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

まずは、リフト&シフトのリフトだ。オンプレ環境の構成を変えずにAWSでリプレイスするぜ。
静的コンテンツの処理はWebサーバーに任せてアプリケーションサーバーの負担を減らす構成だな。

次はシフトだ。だが大きくは変えない。静的コンテンツを外だしするところから始めよう。

あれ?Webサーバー(Nginx)っているんだっけ??ALBではログも取れるし最近はでできることも多いよね?

待てよ待てよ。将来的にはSPAで実装する方法も検討しているんだった。その場合はいらないでいいよね?

ということを社内チャットで呟きました。いくつか意見が出てきたのでこのブログにまとめます。

先に結論

  • コンテンツ(html)をAppサーバーで作成する場合、あったほうが良さそう
  • コンテンツ(html)をAppサーバーで作成しない場合、なくても良さそう

※アプリケーション特性もあるため、一概にどっちが良いとは言えない。

言葉のおさらい

Webサーバとは

wikipediaより抜粋します。

Webサーバ(ウェブサーバ、英:Web server)は、HTTPに則り、クライアントソフトウェアのウェブブラウザに対して、HTMLやオブジェクト(画像など)の表示を提供するサービスプログラム及び、そのサービスが動作するサーバコンピュータを指す。 広義には、クライアントソフトウェアとHTTPによる通信を行うプログラム及びコンピュータ。

httpのリクエスト処理し適切なコンテンツを返却するサーバーです。必要に応じてアプリケーションサーバーへリクエストを送信します。NginxやApacheが代表的なWebサーバーです。

アプリケーションサーバとは

wikipediaより抜粋します。

アプリケーションサーバ(英: Application Server)は、ビジネスロジックなどを実装したアプリケーションソフトウェアを実行することを専門とするコンピュータネットワーク上のサーバコンピュータ、もしくはそのようなコンピュータ上でのアプリケーションの実行を管理補助するミドルウェアのこと。

実装したコードを実行するためのサーバーです。JavaでいうとTomcatやJBossなどが該当します。Tomcatは簡易的なWebサーバとしての機能も有しています。

なぜいらないと思ったのか

いらないと思った理由は以下の通り。

  • CF+S3を利用することで、アプリケーションサーバの負荷を軽減するという役割は不要になった(静的コンテンツを配信するということに関して)
  • ALBの機能も充実してきた

それでも導入した方が良い理由

コンテンツ(html)をAppサーバーで作成する場合

  • 複雑なルーティングをしたい場合、ALBだけでは辛い
  • Nginxでキャッシュコントロールをしたい(コンテンツを圧縮したい)
  • ALBのログで良いんじゃね?という意見に対して
    • ALBのアクセスログには5分程度のタイムラグがあり、リアルタイムでログを拾いたい場合はWebサーバーがあった方が良い
    • ALBのアクセスログでは、クッキーやヘッダ等回収できないログ項目がいくつか存在する
    • Appサーバー側でうまくログ出力できるようであれば、考慮不要
  • 望まないリクエストの門前払いや、メンテ時のリダイレクト、ゆるくBasic認証を導入など、あると便利なケースが多い

ただ、上記の予定もなく、全てバックエンドに流すだけであれば撤去できる可能性もあると思います。

以下のようにNginxを導入することで問題解決できる例もあります。

導入しなくても良いかも?

コンテンツ(html)をAppサーバーで作成しない場合

  • そもそも複雑なルーティングが発生しにくい
  • 望まないリクエストの門前払いはWAFで代替可能
  • コンテンツ(html)がないため、Nginxでキャッシュコントロールするほどでもない
  • APIとして提供するコンテンツ(JSON)を圧縮したい場合はCloudFrontで代替可能

まとめ

アプリケーション特性にもよりますが、多くの場合NginxなどのWebサーバーを導入しておいたほうが無難なのかなと思います。いやいやそれは間違えているなど、別の意見がある場合は、はてブやTwitterなどでご指摘いただけると嬉しいです。