こんにちは、steveです。
エンジニアであれば、一度は自己開発に取り組む機会があると思うのですが、自己開発に当たる時は、何かしらのフレームワークを使うと思います。
フレームワークは、簡単にwebアプリケーションを作成させることができるのが強みですが、それゆえに裏側のwebアプリの仕組みがブラックボックス化して、エンジニアリングの知識が抜けていても作れてしまうようです。
実際に、過去に面接で自分の自己開発を紹介した時、djangoを使っていたということもあり、もの珍しさがあったのか「djangoのクライアント、サーバー間の仕組みってどういう感じなんですか」と聞かれ撃沈したのを覚えています。
「djangoはHTTPサーバを内包したwebアプリケーション一体型のアプリケーションであるため、webサーバとの連携が必要にならなくて、規模感を抑えて開発できる」
このような理解があった方が開発もスムーズに進むと思います。
そこで今日は、webアプリケーションの低次元知識と、分類化をしてみたいと思います。
1.webアプリケーションの通信方法
まず、webアプリの通信を「クライアントサイド」と「サーバーサイド」に分類して考えます
1-1.クライアントの構成要素
・HTTPクライアント
→urlを受け取り、httpサーバにリクエストを送信
・レンダリングエンジン
→レスポンスとして帰ってきたhtml,cssを画面に表示させる
・javaScriptエンジン
→ブラウザが唯一読解できる言語javaScriptを読解するためのエンジン、各ブラウザに標準搭載されていて、chromeのV8が有名で、その機能をサーバーサイドに応用しようとしたのがNode.jsである
1-2.サーバーサイドの構成要素
・HTTPサーバ
→HTTPリクエストを捌くサーバ、基本的にWebサーバに内包されている。
・webサーバ
→HTTPサーバを内包しており、静的コンテンツを捌く、nginx,Apacheなどが有名
・アプリケーションサーバ
→動的コンテンツを捌く(本記事の内容)
(クライアントサイドとサーバーサイドをつなくのがインターネット、通信の方式がTCP/IPプロトコル)
2.Webアプリケーションの実行方式
1-2でアプリケーションサーバを紹介させてもらいましたが。その実行方法は多岐に渡ります。
前提として、アプリケーションサーバは、webサーバでは捌けない動的コンテンツを負担します。
HTTPクライアント → (インターネット)→ WEbサーバときたリクエストごとにプロセスを駆動させるのが、最初のwebアプリケーションでした。(プロセス起動型)
(プロセスというのは、cpuの実行単位です)
コレらは、PHP,Laravel等で対応されました。
CGIができたことにより実現した技術です。
ただ、毎回プロセスを駆動させるのは非常に大変です。
新たなアプリケーションの実行方式がモジュール方式です
webサーバの中に、プログラミング言語を読み込めるモジュールを入れる方式です。
都度appを駆動させる必要がないので前述の方式より高速です。
こちらは、perl,PHP,rubyで搭載されました。
ここまでは、比較的古い技術で、モダンではありません。規模的にも大きな規模に対応できません
ここからは、比較的大きな規模の開発向けの方法です
webサーバと、webアプリを分離させつつ、常にapp側を起動させる分離型独立プロセス方式
アプリケーションサーバの中にwebサーバに内包させることで、開発規模を抑えつつ、大きなアプリを作れる一体型独立プロセスです。
djangoはこの後者にあたり、javaのspringbootや、Node.jsもこちらにあたります。
コレらの技術にくわえ、Apacheなどのwebサーバ、DBサーバ、を加えてアプリケーションはできるというわけです