質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • サーバ

    771questions

    サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

  • Tomcat

    560questions

  • Go

    502questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • Java EE

    373questions

    Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

  • unicorn

    98questions

    Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Node.jsやGo言語でアプリケーションサーバー必要でないのはなぜでしょうか?

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,598

jimyo

score 215

普段Java EEを使ってアプリケーションを書いています。
Javaで書かれたサーバープログラムの場合Tomcatなど、Java EEだとWebSphereやGlassfishなどのアプリケーション・サーバー上にデプロイして動かすことになると思います。
RubyにもUnicornやThinなどがあると思います。

不勉強で申し訳ないのですが、私はずっと「サーバープログラムを動かすためにはアプリケーションサーバーが必要」だとばかり思っていました。
先日Node.jsの勉強を初めたのですが、Node.jsやGo言語にはアプリケーションサーバーがなく、ポートのlistenなどの処理を自分で書いて実行するものだと知りとても驚きました。

これを知ったとき、「デプロイが簡単そうだ」「処理が追いやすくてわかりやすい」など良い印象ばかり感じたのですが、同時に、「アプリケーションサーバーがなくて大丈夫なんだろうか」と疑問に思っています。

なんとなく自分の中で「アプリケーションサーバーがいい感じに処理していてくれている」という安心感があるため、いままでアプリケーション・サーバーが担当していた部分を自分で書くということに(この認識があっているのか心配ですが・・・)不安を感じています。(リッスンの仕方やメソッドの呼び方など)

なぜNode.jsやGo言語にはアプリケーション・サーバーが必要ではないのか、あるいは、なぜJavaやRubyではアプリケーション・サーバーが必要なのか教えていただきたいです。

また、アプリケーション・サーバーが存在することのメリット・デメリットもわかる方がいたら教えてほしいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+6

時代が変わって来て変化への対応が求められる様になってきたからです。

Java のアプリケーションサーバが流行り始めた 1990 年代後半から 2000 年前半にかけては、リッチなマシンリソースを手に入れるのも難しく、それに加えて Java はリソース食いと悪評もありました(今でも変わりませんが)。アプリケーションサーバを導入するのは今でこそ簡単になりましたが昔は手間で、マシンリソースが足らなくなったら別のサーバを用意してアプリケーションサーバをインストールし、Java アプリケーションをデプロイして来ました。勿論サーバが起動した後もこまごまとしたチューニングも必要でした。しかし時代も変わりリッチなリソースのマシンを手に入れやすくなったと同時に、即時性も求められる事になりました。

 環境構築のしやすさ

アプリケーションーサーバが持っていなかった物を Go や node は持っています。Go であればアプリケーションのバイナリ1つをコピーすれば良いですし、node であれば node のランタイムこそ必要ですが、アプリケーションが格納されたフォルダをそのまま別の環境に持っていけば動くのです(さすがに同じOSに限ります)。もちろん Java にも war という仕組みはありますが、その引っ越し先のサーバにもアプリケーションサーバが構築されている必要があります。

Java はマルチプラットフォームをウリにしていましたが、Go であれば Windows から Linux の実行バイナリを生成する事も出来ます。

 標準ライブラリ

Java は Servlet API という仕様だけを策定し、サーバやミドルウェア自体はサードパーティが実装するという方法を取りました。それはそれで良いデザインなのですが、サードパーティの実装差異により開発者が苦しめられる事もしばしばありました(今でもありますし先日もありました)。またアプリケーションサーバのバージョンが上がると、そのアプリケーションサーバで動くアプリケーション全てに影響が出る事もありました。非推奨の API を使っていた事で対応を同調しないといけないといった事もしばしばありました。Go や node はオフィシャルから標準ライブラリとしてウェブサーバを提供する事で、こういった問題を回避しています。

 スケールアウトのしやすさ

最近のウェブサービスではマイクロサービスという、システムを複数のサービスの集合として作る事が一般的になってきました。いざユーザ数が増えてきたり負荷が増大してきた時に、小さく分けられたサービスを新しく増やしてスケールアウトする事で、変化に対応しやすい様にする為です。始めは小さく、後に大きくといった事を行うのがマイクロサービスです。アプリケーションサーバの場合はスケールアップが一般的で、コストも掛かります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

単純にNode.jsとGo言語はシンプルな設計思想だからだと思いますよ。
Node.jsはJS譲りのイベントループを利用した怠惰なリクエスト待ちを実現してくれますし、
Go言語はGoルーチンという低コストでスレッドを発行出来る機能で並列処理が書きやすいです。

この辺が追い風になってC10K問題をあっさり解決してくれます。
超エコで超高速なやつらの性能比較: Go vs Node.js (vs Vert.x) - Qiita

不安を感じています。

当然Node.jsやGo言語も書き捨てるのではなく、
ある程度責任を持ったサーバーを運用するのであればどうしても行数が必要になります。

フレームワークがあるのでその辺は誤差だよ誤差。
Javaでサーバ建てる時もフルスクラッチで書いたりしないでしょ!

アプリケーション・サーバーが存在することのメリット

ApacheやNginXは静的コンテンツ配信やリバプロ目的でまだまだ使われるでしょう。
それ目的の為に作られたアプリは強いので餅は餅屋です。
1行たりとも書かなくても高速に動くのに、動作を保証してくれるのは強すぎるでしょう。


マイクロサービス的な思想が最近強いですね。
Docker等の登場でコンテナ運用に関して皆目を向けているのも追い風でしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    capistranoでのデプロイの準備

    capistranoでリモートサーバにデプロイする場合、すべてのリモートサーバにcapistranoがインストールされている必要がありますか。

  • 解決済

    Capistranoを用いたAWSへのデプロイの基本知識に関して

    Capistranoを用いたAWSへのデプロイの基本知識に関して、   どうしようもなくわからなくなったので質問させていただきます。   環境は、以下になります。   Ruby:

  • 受付中

    herokuデプロイ時のApplication Error

    前提・実現したいこと 半年ぶりにサイトを修正し、デプロイしたらサイトを表示することが出来なくなりました。サイトの修正内容はview がメインでローカル環境では問題なく動いていま

  • 解決済

    capistranoデプロイでエラー

    当然のエラー 普段capistrano + nginx + unicorn でデプロイを行っているのですが、以下のエラーが出て対処に困っています。 発生している問題・エラー

  • 解決済

    herokuへのデプロイ

    前提・実現したいこと herokuにデプロイしたいのですが、上手くいきません。 データベース情報をmysql2に上書きした後、「git push heroku master」をGi

  • 解決済

    デプロイの仕組みについて

    デプロイの仕組みについて知りたい ・ デプロイについて javaでWebアプリを開発していますが、 デプロイとは何なのか、何のために必要で、何をするのかを明確に理解できていないので

  • 解決済

    rails デプロイ お名前.com

    お名前.comの共用サーバ(SDー11)とドメインをとったのはいいのですがデプロイの仕方わかりませんw 教えてください

  • 解決済

    Herokuでrailsアプリのデプロイでエラー

    rails初心者です。 HEROKUでrailsアプリのデプロイを試みているのですがエラーが出てしまいデプロイができません。 色々調べて試したのですが原因がわかりません。 出て

同じタグがついた質問を見る

  • サーバ

    771questions

    サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

  • Tomcat

    560questions

  • Go

    502questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • Java EE

    373questions

    Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

  • unicorn

    98questions

    Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。