たいきゅんの日記

ITエンジニアの積み上げ日記

プログラミング初学者がまとめる〜webサーバーとアプリケーションサーバーの流れについてまとめてみようと思う。ざっと理解する編〜

*自身の言葉で書いてますので、間違っていることもあるかと思いますが、ご了承ください。訂正のコメントを頂けるとありがたいです。*

 

今回は前回の続きで、webサーバーとアプリケーションサーバーの流れに焦点を絞ってまとめていこうと思います!!railsアプリを前提に書いていくのでご了承ください。

 

◯Rack

今回の話をするにあたり一つ紹介したいのがRackについて知っておいて欲しいです!

Rackは簡単に言うと、アプリケーションサーバーとアプリケーションを橋渡しの役割を果たしているものです。

もっと具体的に言うと、RackはRailsのようなRuby製のwebフレームワークとアプリケーションサーバーの両方が話せる共通言語のようなものだと考えてください。両者は別々の言語で書かれており、直接会話ができません。しかしRackは両者の共通言語を理解できるので、RailsUnicornと話せますし、UnicornRailsと話せるので、railsがアプリとして機能するわけです。

 

 

◯再度流れを確認する

1.webリクエストはwebサーバーが受け取ります。

2.リクエストが静的コンテンツであれば、webサーバーがレスポンスを返す。

3.webサーバーが処理できない場合は、アプリケーションサーバーにリクエストを送る。

4.アプリケーションサーバーからRackを通して、アプリケーションにリクエスト(←NEW)

5.アプリで処理を行った後、Rackを通じてアプリケーションサーバーへレスポンスを返す(←NEW)

6.アプリケーションサーバーからwebサーバーへレスポンス、webサーバーがクライアントにレスポンスを返す

 

◯流れに具体名を入れてみる

1.webリクエストはwebサーバーが受け取ります。(Nginx・Apache

2.リクエストが静的コンテンツであれば、webサーバーがレスポンスを返す。(Nginx・Apache

3.webサーバーが処理できない場合は、アプリケーションサーバーにリクエストを送る。(Nginx・ApacheUnicorn・Puma)

4.アプリケーションサーバーからRackを通して、アプリケーションにリクエスト(Unicorn・Puma→Rack→アプリ)

5.アプリで処理を行った後、Rackを通じてアプリケーションサーバーへレスポンスを返す(アプリ→Rack→Unicorn・Puma)

6.アプリケーションサーバーからwebサーバーへレスポンス、webサーバーがクライアントにレスポンスを返す(Unicorn・Puma→Nginx・Apache

 

 

◯なぜwebサーバーとアプリケーションサーバーを構築する必要があるのか?

これまでを聴いていると万能なRackだけあれば、うまく処理できるように思えるかもしれません。

しかしRackだけだとWebサーバがなく、高速な処理や高負荷に耐えることができなません。nginxやunicornといったwebサーバを用意することでうまく負荷分散をして、大勢のクライアントからのアクセスに対応できるようにしている。

 

◯まとめ

今回はwebサーバーとアプリケーションサーバーの流れについて少し細かくまとめてみました。

普段なんとなくサーバーを立ち上げていますが、裏ではこんなことが起きているんですね!

次回からはwebサーバーやアプリケーションサーバーについて細かく書いてみようと思います!

最後まで読んで頂きありがとうございました!!

プログラミング初学者がまとめる〜webサーバーとアプリケーションサーバーについてまとめてみようと思う。ざっと理解する編〜

*自身の言葉で書いてますので、間違っていることもあるかと思いますが、ご了承ください。訂正のコメントを頂けるとありがたいです。*

 

今回から何回かにわたってwebサーバーとアプリケーションサーバーについてまとめていこうと思う。

初回の今回はwebサーバーとアプリケーションサーバーについてざっくりとまとめてみようと思います。

 

◯webサーバーとは

webサーバーはユーザーから送られてきたリクエストを受け取り、なんらかの処理を加えるプログラムです。webサーバーのみで対応できる内容であればそのままレスポンスを返し、無理なら他のサーバーに橋渡しをしているイメージです。

具体的にはリクエストがHTML、CSS、画像ファイルのような更新しない限り同じ表示コンテンツを表示する静的なwebコンテンツだった場合はwebサーバーがレスポンスを返します。一方で、クライアントごとで表示内容を変化させる処理が必要な動的なwebコンテンツの場合、webサーバーはアプリケーションサーバーへとリクエスト(橋渡し)をします。

 

ex) Nginx・Apache

 

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

アプリケーションサーバーは、Webサーバーを通して受け取ったリクエストを処理し、HTMLなどをウェブサーバーへ返却する役割を果たします。またアプリケーションサーバーはアプリケーションを動かしているそのものと言えます。

アプリケーションサーバーはあなたのコードを読み込み、アプリケーションをメモリに保持します。アプリケーションサーバーはwebサーバーからリクエストを受け取ると、Railsアプリケーションにそのことを知らせます。アプリケーションがリクエストを処理すると、アプリケーションサーバーはそのレスポンスをwebサーバーに返します。

 

ex)Unicorn、Thin、Rainbows、Puma

 

◯それぞれの役割

 

webサーバーは複数のアプリケーションを一度に処理したり、アセットを素早くレンダリングしたり、リクエストごとに発生する多くの処理をさばいたりしてくれます。本番環境ではwebサーバーを置くことが多いです。一方でローカル環境ではwebサーバーを使わずアプリケーションサーバーのみで動かすことができる。

 

◯流れをまとめてみる

1.webリクエストはwebサーバーが受け取ります。

2.リクエストが静的コンテンツであれば、webサーバーがレスポンスを返す。

3.webサーバーが処理できない場合は、アプリケーションサーバーにリクエストを送る。

4.アプリケーションサーバーからアプリにリクエスト・処理を行った後、webサーバーへレスポンスを返す

5.webサーバーがクライアントにレスポンスを返す

 

◯まとめ

今回はwebサーバーとアプリケーションサーバーについてまとめてみました。

自身でも理解がぐちゃぐちゃになっていたので、いい整理ができました!

次回は流れについてもう少し細かく書いてみようと思います。

最後まで読んで頂きありがとうございました!!

プログラミング初学者がまとめる〜docker-composeについてまとめてみようと思う。ざっと理解する編〜

*自身の言葉で書いてますので、間違っていることもあるかと思いますが、ご了承ください。訂正のコメントを頂けるとありがたいです。*

 

◯docker-composeとは

簡単に言うと、複数コンテナの設定ファイルである。

Dockerのベストプラクティスとして1コンテナ1サービスとされている。つまりコンテナ1つでアプリケーションを作ることは推奨されていない=複数コンテナを作成・管理する必要があるということです。

docker-composeでは、複数コンテナからなるサービスを構築・実行する手順を自動的にして、管理を容易にすることができます。docker-composeコマンドでdocker-composeファイルの設定を読み込んで全てのコンテナサービスを起動することが可能です。

Docker Composeでは、Dockerビルドやコンテナ起動のオプションなどを含め、複数のコンテナの定義をyaml(ヤムル)ファイルに書き、それを利用してDockerビルドやコンテナ起動をすることができます。一つの簡単なコマンドで複数のコンテナを管理できるようになります。

 

◯docker-compose.ymlファイルとは

yaml形式でdockerコンテナに関する起動オプションを記述したファイルになリマス。

このファイルに記載されている内容は基本的にdocker build docker runコマンドで指定することができるオプションになるが、yamlファイルにまとめることでサービスを俯瞰的に見ることができます。(細かい情報は今回は省略)

 

(例)

version docker-composeのバージョン

service 管理するコンテナの指定

 

◯使うためのステップ

1.Dockerfileの作成

2.Docker-compose.ymlを作成する

3.docker-compose buildコマンドでイメージをビルド・コンテナを作成する

4.docker-compose up でコンテナを起動する

 

◯まとめ

今回はdocker-composeのアウトラインをまとめてみました。

ymlファイルの記述方法を細かく学習すれば、docker-composeができるようになるはずです!!また別の記事でまとめてみようと思います。

最後まで読んで頂きありがとうございました!!

プログラミング初学者がまとめる〜Dockerfileについてまとめてみようと思う。ざっと理解する編〜

*自身の言葉で書いてますので、間違っていることもあるかと思いますが、ご了承ください。訂正のコメントを頂けるとありがたいです。*

 

◯Dockerfileとは

 

Dockerfileはdockerイメージの設定ファイルのことです。

dockerを使っていくと、公開されているDockerイメージをそのまま使うのではなく、必要なパッケージやアプリ、各種設定を含んだDockerイメージを自分で作成して使用するケースが出てきます。その場合、Dockerfileを作成し、それを使用して必要なDockerイメージを作成することがでてきます。Dockerfileには、ベースとするDockerイメージに対して実行する内容を記述します。また順にコマンドを実行しコンテナ内に環境を整えていきます。

 

◯Dockefileで使うコマンド

 

FROM

 

FROMコマンドは、ベースとするDockerイメージを指定しています。また、事前にDockerイメージを取得(docker pull)していなくても、ローカルにない場合は、Dockerイメージ作成のコマンド実行時に自動で取得してきます。

FROMで指定したDockerイメージをベースにこれから記述するコマンドを実行しますよと言う意味です。

 

 RUN

 

RUNコマンドは、FROMで指定したイメージに対してコマンドを実行するために使うコマンドです。「-y」オプションを付けることで、インストールするかどうか聞かれないように設定することが多いです。

 

ADD

 

ADDコマンドはファイルのコンテナへ設定の上書きを行うコマンドです。Dockerの環境構築はアプリケーション作成前に行うのがベターですが、後からDocker環境を構築する際に利用します(私も多用しました。また、ADDコマンドと似たコマンドとして、COPYコマンドがあります。

 

COPY

 

COPYコマンドは、COPYはローカル環境にあるファイルをイメージ上にコピーします。

 

CMD

 

CMDコマンドは、コンテナ起動時に実行するコマンドを記述します。CMDコマンドと似たコマンドとして、ENTRYPOINTコマンドがあります。

 

◯ENTRYPOINT

 

docker runコマンドで実行する際のコマンドを指定します。

CMDとの違いはdocker run時にENTRYPOINTで指定したコマンドの引数が追加できる。

CMDでも同じことを表現できます。

rails6ではwebpackerが導入されている関係でこちらの導入が必要になりました。

 

*CMDとENTRYPOINTの違いについて自身でも理解しきれていません。違う記事でまとめてみようと思います。*

 

 

◯特徴

 

キャッシュ

 

Dockerビルドをする際、Dockerfileですでに実行済みのコマンドは、キャッシュが使用されます。そのため、あまり変わらない部分については、Dockerfileの最初のほうに書いておくことで、Dockerビルドの時間が短縮できます。ここで言う「あまり変わらない部分」というのは、例えば基本必要となるパッケージのインストールなどです。ADDやCOPYコマンドでビルド媒体などをコンテナ内にコピーする際、コピー元のファイルに変更があった場合は、キャッシュは使用されず、新しい媒体がコンテナ内にコピーされます。それ以降は、キャッシュは使用されずに、再度一つ一つDockerfileのコマンドが実行されます。

 

 

まとめて実行する

 

Dockerfileの各コマンドごとにレイヤーが作成されるので、その分Dockerイメージのサイズが大きくなってしまいます。そのため、なるべく1コマンドで実行できるものは、まとめて実行することがベターです。

 

 

◯メリット

 

OS設定などのインフラ構築部分も含めコード化できる、ということです。

これにより、同じ環境を簡単にミスなく作ることができ、またインフラ構築処理も構成管理することが可能になります。構成管理ツールでDockerfileを管理し、CIツール(Circle CIなど)を使えば、アプリのビルドからDockerビルド(Dockerイメージの作成)、コンテナのデプロイまでを自動化することができます。さらにデプロイした環境に対して自動試験を連携させるのもできるようになるよいでしょう。

 

◯まとめ

今回はDockerfileのアウトラインをざっとまとめてみました。

自身で理解しているつもりでしたが、分からない部分が明確になったので、やはりブログはいいなと思いました!!

最後まで読んで頂きありがとうございました。

プログラミング初学者がまとめる〜Dockerについてまとめてみようと思う。ざっと理解する編〜

*自身の言葉で書いてますので、間違っていることもあるかと思いますが、ご了承ください。訂正のコメントを頂けるとありがたいです。*

 

◯dockerとは

簡単に言うとコンテナを利用して、仮想環境を構築するためのもののことを言います。(後述)

そのため軽量で高速に起動、停止をすることができるのが特徴です。また一台のサーバー上に複数のサーバーとして利用できる仕組も構築できます。

 

◯dockerでよく使う用語

 

コンテナ

Dockerイメージをもとに作られたwebサーバーやDBサーバーなどが動く仮想環境のこと

 

Dockerイメージ

コンテナを立ち上げるための設定ファイルのこと。DockerコンテナはDockerイメージから作成される。

 

Docker Hub

Dockerイメージが公開されているサイトのこと。

個人で作成されているものも含め公開されている。

 

◯Dockerの特徴

 

環境構築の手軽さ

dockerはミドルウィアのインストールや各種環境をコードとして管理します。そのためコード化されたファイルを共有すること、Dockerを使える環境であれば誰でも同じ環境で利用できます。またDockerにてバージョン管理の設定も行うことができます。

そのためシステム構築が容易になり、時間短縮ができます!!

 

スクラップ&ビルドが容易にできる

コンテナはコマンド1つで作成したり、削除することが可能です。

また一度作成したコンテナは他のコンテナの適用のために利用することが可能です。

 

開発環境をそのまま本番環境で利用することもできる

 

 

◯仮想サーバーとの違い

Dockerをはじめとしたコンテナと、仮想マシンの違いはOS部分の仕組みです。

ハードウェアを仮想化し、複数のサーバを構築できる仕組みは変わりません。ただ、コンテナは1つのOSを共有して利用しているのに対し、仮想マシンはサーバごとにOSをインストールし動かしていきます。

 

◯(番外編)なぜDockerをPFに入れようと考えたのですか?

チーム開発にとても有効なツールだと考えたからです。

転職後はチーム開発で仕事をしていくと思うので、その勉強のためにDockerの導入をしてみました。

 

◯まとめ

今回はDockerのアウトラインをざっとまとめてみました!

Dockerfileに関しては次回まとめていこと思います。

最後まで読んで頂きありがとうございました!!

 

 

プログラミング初学者がまとめる〜ECRについてまとめてみようと思う。ざっと理解する編〜

*自身の言葉で書いてますので、間違っていることもあるかと思いますが、ご了承ください。訂正のコメントを頂けるとありがたいです。*

 

 

ECRはAmazon (Elastic Container Registry) の略。

簡単に言うと、AWS上にDocker imageを保存しておく場所のことである。

このレジストリを使うと開発者はDockerイメージを簡単に、保存・管理・デプロイすることができる。ECRはECSに統合されているため、開発から本稼働までを簡略化することができます。

 

◯メリット

・完全マネージド型

コンテナレジストリを宇賀かすための運用が不要になる。そのためインストールや管理が必要なソフトウェア等が不要になり、コンテナイメージをECRにプッシュしデプロイが必要なときにコンテナ管理ツールとして使用してイメージをプルするだけで完了する。

 

セキュリティ面

 

コンテナイメージがHTTPS経由で転送されて、保管時にはイメージが自動的に暗号化されます。IAMユーザーとロールを利用してアクセス制限を行うことができるため、認証情報をEC2インスタンスで直接管理する必要がないです。

 

シンプルに使える

Docker CLIに統合されているため、開発から稼働までのワークフローが簡略化できる。レジストリーにプッシュする時もコマンドが表示される仕組みなっており、非常に使いやすいです!!

 

ECSとの連携

 

ECRは絵cSと連携されているため、ECSで実行中にアプリケーションのコンテナイメージを容易に保存・実行・管理することができます。タスク定義でECRのURIを指定するだけで、ECSがアプリケーションに最適なイメージを取得する仕組みなっています。

 

◯ECR

個人的にECRの使い方に関しては他のサービスに比べるとそんなに難しくなく感じました!

これくらい覚えておけばとりあえず運用できると思うので、読んでもらえると嬉しいです!

最後まで読んで頂き、ありがとうございました!!

プログラミング初学者がまとめる〜S3についてまとめてみようと思う。ざっと理解する編〜

*自身の言葉で書いてますので、間違っていることもあるかと思いますが、ご了承ください。訂正のコメントを頂けるとありがたいです。*

S3はAmazon Simple Storage Service」の略称であり、簡単に言うと、ネット上にデータを保存する箱を借りて利用できるサービスのことです。

イメージをここに画像を保存したり、画像を取得したりすることができるオブジェクトストレージだが、CSSやWebに使う静的なファイルをS3に置くこともできます。そのためビッグデータの保存先として利用されている場合もあるそうです。

話を戻すが、S3を利用することで、データの要領を気にすることなく画像を保存することができます。S3に保存できる画像の量は膨大でアプリに使えるレベルの量なら無料枠で利用可能です!!

 

◯S3でよく使う用語

 

バケット

S3でデータが格納される場所のことである。バケットの名前はアクセスする時のURLに使用されるため英数字でまだ誰も使ったことのない名前をつける必要。バケットは名前とリージョンを決めるだけで簡単に作成できます。

 

・リージョン

バケットが実際存在しているサーバーのありかのこと。

 

◯主な機能

 

ストレージ機能

S3は先に保存要領を決める必要はなく入れた分だけ課金される。つまりストレージが自動的に拡張・縮小されるため、事前に正確な要領を計算する必要や、先行投資をして容量を余すことがないのが特徴になります。

 

・ライフサイクル機能

オブジェクトごとにライフサイクルを設定することで、一定期間経ったら削除したり、低価格なストレージに移動したりすることができます。ユースケースとしては大量のログをS3に保存するが、90日前の物は利用頻度が低いので低価格なストレージに移すなどの設定ができます。

 

・バージョニング機能

オブジェクトごとに世代管理してくれます。

同じファイル名で上書きした際に前のバージョンを残すこともできちゃいます!!

 

他にもログの記録・アクセス制限機能・暗号化機能などがあります。

 

◯特徴

 

・安全である

S3との通信はSSLで暗号化されます。さらに接続元のIPアドレス等でS3にアクセスできる通信を制限することができるため安心したサービスを利用できます。

 

・ 高速に動く

常に安定したレイテンシで専用線でS3にアクセスすることも可能です。

 

AWSの他のサービスとの連携

S3 は AWS のその他の分析サービスである Amazon Athena や Amazon Redshift Spectrum とも互換性がある。(データ分析ツール)これにより、ビックデータの解析もできます!!

 

◯まとめ

S3のアウトラインをざっとまとめてみました。

画像ストレージとしか使ったことがなかったので、静的ファイルが使えることが知らなくていい収穫になりました!

今度は使い方をざっとまとめてみようと思います!!

最後まで読んでいただきありがとうございました!!