ApacheとNginxを徹底比較!両者の違いや、それぞれのメリット・デメリットまで、分かりやすく解説します

数多くあるWebサーバの中でも根強い人気がある「Apache(アパッチ)」と人気急上昇中の「Nginx(エンジンエックス)」。Webサーバはシステムの基盤の重要な部分です。理解せずに使うとクライアントへのレスポンスにも影響を与えます。本記事では「Apache」と「Nginx」のWebサーバを比較しながらメリット・デメリットを紹介します。

 

ApacheとNginxの基本情報

 

Apacheとは?

 

 

ApacheはApacheソフトウェア財団によって開発されたOSSです。元々は米国立スーパーコンピュータ応用研究所 (NCSA) が開発したNCSA HTTPdに改良という形で開発が行われていました。

その後、2000年頃にBrian Behlendorf(ブライアン・ベレンドルフ)の手によってソースコードは完全に書き換えられました。彼はApacheの基盤を作成した主要開発者です。

Apacheの正式名称はApache HTTP Server(アパッチ エイチティーティーピー サーバ)。

名前の由来はアメリカインディアンの一民族であるアパッチ族への尊敬の念を込めて付けられたのことです。

 

Nginxとは?

 

 

NginxはNginx,Inc.のCTOのIgor Vladimirovich Sysoev(イーゴリ・ウラジーミロヴィチ・シソエフ)によって開発されたOSSです。2002年に開発が始まり、2004年に初公開されました。

その頃もApacheのWebサーバが絶大な人気がありました。しかし、Apacheの仕組み上どうしても発生しうる問題がありました。それがC10K問題です。

その問題をきっかけにNginxが開発され始めました。

 

C10K問題とは?

 

「C10K問題」(クライアント1万台問題)とは、同時接続するクライアントが多すぎるとソフトウェア上の問題によりサーバーがパンクしてしまうことです。

例えば想定されるのがプロセス番号です。

UNIX系のOSの場合、メモリ上でプログラムに与えられるプロセス番号は符号付き16ビット整数と決まっています。言い換えるとプロセスは1~32767までの番号が割り付けられます。つまり、1リクエストに対して1つのプロセスを生成するWebサーバ(Apache)の場合、約3万リクエストが最大の同時接続数となります。

ハードウェアの性能上問題がなくてもアーキテクチャ(設計)によってはソフトウェアで上限が決まっているということです。

 

ApacheとNginxを比較

 

Webサーバのアーキテクチャ

 

 

上述しましたが、Apacheでは1リクエストに対して1プロセスが処理されます。

例えば100の同時接続があれば、100のプロセスが必要となります。数多くのプロセスが立ち上がるとプロセス番号の限界やメモリが大量に消費されてしまうという問題があります。

対してNginxでは1プロセスで複数のリクエストに対応します。

同時接続数の上限が設定可能で、具体的な設定パラメータを挙げると「プロセス数」と「プロセス内で最大の同時処理数」の乗算で上限が決まります。

例えば「プロセス数」を2つ、「プロセス内で最大の同時処理数」を1000に設定すると最大同時接続数は2×1000=2000となります。

 

処理能力

 

軽量なコンテンツの同時接続100アクセス状況下の実験結果、ApacheよりもNginxの方が1.2倍~1.5倍ほど高いという情報が出ています。更に同時接続数が増えれば増えるほど処理能力差が顕著に出てきます。

 

同時接続数

 

 

マルチプロセス(Apache)とシングルスレッド(Nginx)の違いからNginxはApacheの10~100倍ほど対応できると言われています。

 

適したコンテンツ

 

マルチプロセス(Apache)は動的コンテンツのような重たい処理が得意ですが、シングルスレッド(Nginx)は向いていません。

軽量なコンテンツはどちらも得意と言えますが、同時処理数が増えるとシングルスレッド(Nginx)が有利になります。

 

メモリ消費量

 

シングルスレッド(Nginx)は同時処理数が増えてもそれほどメモリ使用量は変わりませんが、マルチプロセス(Apache)はリクエストの量に応じてメモリが消費されます。同時処理数が少ない場合には両者にあまり違いはありません。

 

Geekly Media ライター

バスコ

2+

【Reactとは?】その特徴から将来性まで徹底解説!

昨今のWebコンテンツ制作に関してWebデザイナーとコーダーを兼任するというケースは珍しくありません。そのため、Webデザインおよびコーディングの時間が切迫されています。そこでコーディングコストや学習コストが極力少ないライブラリが求められています。そんな要望に応えうるJavaScriptライブラリの1つであるReact。本記事でReactにどのような特徴・将来性があるのかを確認しましょう!

 

Reactとは何か?

 

 

Reactとは一言で言うとUIを作るためのJavaScript用ライブラリです。Facebookが開発元でFacebook,Yahoo,ATOM,Airbnbなど有名な企業で採用されています。

ではなぜReactにそれほどまでの実績があるのかというと、Reactのコンセプトに大きな魅力があると考えられます。

Reactの公式ページで3つのコンセプトが挙げられています。

 

・Declarative

・Component-Based

・Learn Once, Write Anywhere

 

これらがReactの中核といえる考え方ですので次で詳しく紹介します。

 

Declarative(宣言的である)

 

 

「宣言的」であることが従来のJavaScriptと大きく異なり、Reactの最大の特徴でもあります。

 

「宣言的」というのは条件と結果が明確にコードに記載されている状態であり、他の人がソースコードを読んでも理解がしやすい仕組みとなっています。

その結果、問題点を洗い出しやすくなりデバッグやテストが容易になります。

 

フロントエンジニアならご存知の”jQuery”はイベントに対して手続き的に処理を書く必要があるため、デバッグもしにくく、どうしても読みにくいソースコードになってしまいます。

 

Component-Based(コンポーネント指向である)

 

 

アプリケーションの構成要素を小さい部品(コンポーネント)の集合として考えて設計されています。

機能を小さい部品に分割して持たせているため、状態の管理もしやすく拡張性があるので再利用も容易にできます。

 

Learn Once, Write Anywhere(一度の学習で何度でも書ける)

 

 

Reactを習得するとWebアプリケーションだけでなく他の分野にも適応することができます。

例えば、モバイルアプリ開発ではReact NativeというReactの概念を基盤としたクロスプラットフォームが使用できます。

 

簡単なモバイルアプリであればSwift(iOS開発言語)やJava(Android開発言語)を使うことなく、JavaScirptとReactの概念だけで作成することができます。

また、同様にVR開発もReact VRというフレームワークで開発することができます。

 

大きな利点としては開発スタイルをReactに統一さえすれば一度の学習で多くの分野で知識を再利用できることです。

 

Reactの特徴① レンダリングが高速

 

ここでのレンダリングとはWebページを描画することを意味します。Reactでは仮想DOM(Document Of Model)という技術が使われています。これはWebページ内の一部を更新したいときに全てページをまるっと更新するのではなく、更新された一部のみを変更するという効率的な仕組みです。

この仕組みのおかげでレンダリングする箇所は一部に留まり、高速で表示の切り替えが可能です。

 

Reactの特徴② 大規模なアプリケーションほど向いている

 

大規模なアプリケーションを運用するにあたって最も大切なことは管理です。ページ数が膨大になれば可能な限り同じようなコンテンツの共通化を図らなければ作成する時間やテストする時間が膨大になります。

更にコンテンツ間の多岐にわたるページ遷移や条件などの複雑な処理が増加するため、それに耐えられる柔軟性も必要になります。

Reactはこれらの課題を解決する可能性を秘めています。

そして以下の特徴から大規模なアプリケーションに向いていると考えられます。

 

管理しやすい設計である

 

 

Reactのコンセプトでもあるコンポーネントとして小さい部品する設計方針は多数のコンポーネントの再利用化へとつながり、コンポーネントごとに状態も把握できるので管理がしやすくなります。

jQueryやBackbone.js、Angular.jsは大規模になった際には管理が難しくなってしまいます。

 

複雑な条件も組み込むことも可能

 

ReactはJavaScriptで書けるため複雑な条件も組み込むことも可能です。JavaScript自体が関数がオブジェクトだったり、コールバック関数が使えたり関数は引数の数を問わなかったりと比較的柔軟な言語でもあります。

 

コードの複雑性を避け、見やすい設計

 

Reactでは「データ」から「画面」という方向でしかデータが流れません。(単方向バインディング)これによりコードの複雑性を避け見やすい設計となります。

モジュールの分割による長期の運用も可能

 

中核の機能であるレンダリングとその他の機能が別々のモジュールとして開発されています。(コンポーネント指向であるため)そのため、アプリケーションに応じて必要なモジュールのみを追加や削除することができるの長期運用に向いた構成になっています。

 

カスタマイズ性が高い

 

自分で選択したツール、ビルドツール、フォルダ構造を最大限に活かせることです。例えばテストはFacebookのJestフレームワークを利用して、フォルダはプロジェクトごとに自由に変更して、という使い方ができます。

大規模なプロジェクトほどこの恩恵を感じられます。

 

Geekly Media ライター

バスコ

1+

『Docker』のメリット・デメリットを徹底解説!気になる使い方もわかりやすく解説します!

開発を進める上で『OSや環境によってプログラムが動作しないことがある』問題は必ずついてきます。Dockerはアプリケーション作成・デプロイ・実行を簡単にするツールのため、上記の問題を解決するのに役に立ちます。Dockerのメリット・デメリットを抑えてしっかりと理解しましょう!またWindowsでの使い方も紹介します!

 

Dockerについて

 

クジラのアイコンが特徴のソフトウェアDocker はコンテナ型の仮想化サービスです。

コンテナ型の特徴・Dockerと仮想マシンの違いを簡単に紹介します。

 

Dockerとは?

 

 

コンテナとは一般的な意味では『(内部に物を納めるための)容器』ですが、ここでのコンテナ型とは『ソースコードやそのすべての依存関係をパッケージ化するソフトウェア』を示します。

つまり、ユーザが作成したコンテナ(ソースコードや環境)をDockerという移送手段を用いて他のパソコンにまるっと展開することができます。

コンテナ内はDockerの管理下に存在しており、その中ではアプリケーションやライブラリ、ミドルウェアなどをそれぞれ管理します。

 

どんなときにDockerを使うのか

 

 

リリース当初はアプリケーション開発時に使用する用途がほとんどでした。

その理由はOSやバージョン違いの動作に素早く対応できデプロイの速度を上げられるからです。

しかし最近ではDockerの実用性に高い評価があり、開発時だけではなくコンテナの環境をそのままテストや本番環境として利用されるケースが増えています。

 

仮想マシンとの違いは?

 

 

よく比較されるサービスとしてVMwareやVirtualBoxなどの仮想マシンが挙げられます。

大きな違いとしてDockerが仮想化するのは『コンテナ』で仮想マシンは『OS』を仮想化します。

Dockerは1つのOSに対して多数のコンテナを管理するため多数のOSを管理する仮想マシンと比較して軽量で速いです。

また、コンテナ作成に必要なリソースは少ないため導入が簡単ですぐに開始することができるので開発の密度を高めることができ、同じハードウェアでより多くのサービスを実行できるためコストを削減できます。

しかし、同じカーネル上で実行することの副作用として仮想マシンよりも分離度が低くなります。

要は実行しているOSに依存度が高いということです。

 

Dockerのメリット①  簡単に環境構築

 

 

今までの開発は同じ環境を別のマシンで再現するためには多数の手順があり、操作ミスや手順の記憶違いなどのヒューマンエラーで開発を遅延する可能性がありました。

Dockerは環境がまるっと提供されるので少ない手順で同じ環境が構築できるためよりスピーディーで正確に同じ環境を再現することができます。

 

Dockerのメリット②  軽量でスピーディーな開発

 

 

コンテナは軽量のため、立ち上げる速度は一瞬です。

それと比較して仮想マシンはOSをいくつも立ち上げる必要があり、処理自体がかなり重いです。

コンテナはメモリやディスクの消費量を少なく抑えた状態で仮想化できます。

これにより、立ち上げるスピードも圧倒的に早くなり開発に集中できます

 

Dockerのメリット③ ハードウェアの資源削減

 

 

コンテナのサイズは非常に小さく、一つの物理サーバに多数のコンテナを稼働させることができます。

その結果、物理サーバを購入するコストが削減されます。

 

Dockerのメリット④ 共有化されたシステム

 

 

Dockerの特徴はコンテナだけでなく、共有化サービスの『Docker Hub』があります。

『Docker Hub』を通してインターネットを通じて世界中の開発者の成果物を入手したり、成果物をアップロードすることができます。

優れたプログラマが作成したイメージを効率よく、活用する仕組みが整えられています。

 

Geekly Media ライター

バスコ

4+

『Swift』のメリット・デメリットを徹底解説!プログラミング言語としての特徴から気になる評判までご紹介します!

SwiftがWWDC(Worldwide Developers Conference)で発表されてからはや5年が立ちました。Swiftは「モダン・安全・高速・表現力豊か」というコンセプトの言語として発表されましたが、実際のところどういった特徴があるの?Objective-Cとどう違うの?と思われる方も多いです。本記事でメリット・デメリットを抑えてしっかりとSwiftの特徴を理解しましょう!

 

Swiftのコンセプト①  モダン

 

 

モダンとは「現代的」という意味になりますが、プログラミング言語におけるモダンとは流行りの書き方や新しく普及された機能などを主として指しています(ちなみにモダンの対義語はレガシーです。)。

それではSwiftのどこがモダンかというと、公式サイトにて6つの事例が挙げられています。

 

・Variables are always initialized before use.

・Array indices are checked for out-of-bounds errors.

・Integers are checked for overflow.

・Optionals ensure that nil values are handled explicitly.

・Memory is managed automatically.

・Error handling allows controlled recovery from unexpected failures.

引用元:https://docs.swift.org/swift-book/

 

これらを和訳すると以下のように書き換えられます。

 

・変数は使用する前に常に初期化する

・配列インデックスは範囲外エラーもチェックする

・整数のオーバーフローをチェックする

・Optional型を使用することでnilを明示的に扱える

・メモリは自動的に管理される

・予期しない障害でもエラー処理の制御により回復できる

 

ここで注目したいのはOptional型のnilについてです。Objective-Cにおけるnilと扱いは似ていますが別物です。

Objective-Cで使用されるnilは「存在しないオブジェクトへのポインタ」ですがSwiftでは「型に対する存在しない値」を意味します。

Objective-Cでは参照したオブジェクトが存在しない場合にnilが返り値として使用できますがSwiftではIntやStringなどのすべての型に対してnilを使用できます。

型に対してnilを使うメリットは明示的にnilを定義することで隠れたエラーを事前に気づくことができるということです。

 

安全



 

ここでの安全とは「誤って異なるメモリにアクセスすることは決してない」という意味です。

「クラッシュしない」という意味ではありません。具体的に何が対策されているのかというと型の誤りや未定義をコンパイル時に検出するので、予期せぬ型による実行時エラーが発生しません

Optional型も安全性の向上として取り入れられています。

 

高速


 

Swiftは、C言語ベースで作られていたObjective-Cに代用できるよう設計されています。つまり、C言語と同等のパフォーマンスを発揮しなければなりません。

では実際にObjective-Cと比較するとどちらが早いのか?それはプログラミングしたソースコードによります。

例えば構造体を使ったSwiftの場合は、C言語に近いスピードになりObjective-Cよりもかなり速くなると言われています。

 

表現力豊か

 

 

Swiftは楽しい言語として位置付けるために数々の工夫がなされており、例えば次のような機能です。

 

・Closures unified with function pointers

・Tuples and multiple return values

・Generics

・Fast and concise iteration over a range or collection

・Structs that support methods, extensions, and protocols

・Functional programming patterns, e.g., map and filter

・Powerful error handling built-in

・Advanced control flow with do, guard, defer, and repeat keywords

引用元:https://swift.org/about/

 

これらを和訳すると以下のように書き換えられます。

 

・クロージャは関数ポインタとして使用できる

・タプルの戻り値を複数に設定できる

・型を柔軟に読み取ってくれるジェネリックスがある

・rangeまたはcollectionに対して高速で簡潔にイタレーションされる

・メソッド、拡張機能、およびプロトコルをサポートする構造体がある

・関数型プログラミングとして使用できる

・強力なエラー処理機能がある

・do、guard、defer、repeatのような高度な制御フローが使える

 

ジェネリクスが使えるのはとても便利ですね。

 

Swiftのメリット①  処理が早い


 

Swiftは速さも売りにしており、Arrayの処理が特に速いとされています。

Appleの公式サイトの検証結果では深さ優先探索アルゴリズムを使って1つの

グラフ内で10,000個の整数を検索した場合、Objective-Cの最大2.6倍、Pythonの最大8.4倍の速度が出ると発表しています。

 

Geekly Media ライター

バスコ

3+