先月号のWeb+DBプレスの記事でNode.jsの記事を読み勉強し始めました。
http://nodejs.jp/
の記事を上から順にざっとよんで、
今はThe Node Beginner Bookを読んでいるところです。
Nodeの最初の印象としては、
nodeコマンドでJavaScriptがサーバ上のスクリプト言語として使えるといったことで、
JavaScriptでコマンドラインツールを書いたりできるんだなぁということでした。
その延長で考えていたんでWebアプリを作るとしたらnodeスクリプトをCGIとして
動かすのかなぁと思っていたんですが、いろんな導入記事などをよむと
Webサーバとしての機能から作るものが多く、先ほどの小堤さまのメールを読むと
むしろWebサーバの機能から作ることが普通という印象を受けました。
そこで質問なんですが、NodeをApache上でCGIとして動かすのはナンセンスなんでしょうか?
Nodeという世界において筋が悪い考えかたなのかなぁ、と思い始めました。
まだまだAPIなどもろくに覚えていない新参者で、もしおかしなことを言っていたり、
話にならないということであれば申し訳ありません。
勉強したいので、参考になる記事などを教えていただけると助かります。
JavaScriptについては一応オライリーの5版を一通り読んで(マスターしたとは言えませんが。。)
jQueryをユーザとして使える程度の勉強はしています。
以上、よろしくお願いいたします。
僕もJxckの意見に同意します。CGIで動かすならNodeであるメリットがないですね。
ちなみに、FastCGIなら https://github.com/billywhizz/node-fastcgi-parser とかもあったりします。
また、ちょっと前に話題になった https://www.fluxflex.com/ も、
Node.jsを動かす際には Apache + FastCGI で動かす仕組みであり、
そのためにかなりイレギュラーなことをしなくてはなりません。
2011/9/10 Jxck <block.rxc...@gmail.com>:
--
Toshihiro Shimizu / @meso
敢えてApache+Node(CGI)という構成のメリットを挙げるならば、既にPHPやPerlなどで構築されているシステムに、最小限の修正でNodeを導入できることでしょうか。
ただ、他の方々が仰る通り、そのようなことをするとNodeのメリットが失われてしまうのでNode導入の意味はなく、結局元も子もないのですが。
個人的に、WebSocketなどでコネクションを張り続けるようなプログラムを動かせなくなるのはとても大きな損失だと思います。
余談ですが、CGIとしてJavaScriptを動かしたいのであれば、fcgi-v8というものがあった気がします。
2011年9月10日13:40 Toshihiro Shimizu <shimizu....@gmail.com>:
Jxck さま
meso さま
KOBA789 さま
ご回答ありがとうございました。
質問の意図としては、「実際にCGIやApacheでNodeを動かしてみたい」
ということではなく、Nodeが何者なのか?何がこれまでと違うのか?何が面白いのか?
ということを考えていくなかで、今私の中にあるわかりやすい概念と比較することで
Nodeに迫っていけるのではないかということでした。
皆様のご回答を読むとサーバ上で動くJavaScriptスクリプトを単体のプロセスとして
動かし、Perlスクリプトやシェルスクリプト同様標準入出力をインターフェースとして
プログラミングできるプログラミング環境だということだということは
言えるのかなぁと思いました。
そして、node スクリプトをApacheで動かすのは可能だが筋の悪いことなんですね。
この辺はもっとNodeが何者なのかがつかめてくるまでは私にはわからないこと
だと思います。
質問の後、ウェブ検索したりしてなんとなく把握したのは、ご回答の中にもあるように
特定の問題領域でNodeが提供する環境が役に立つということなのかなぁという事です。
まだまだその問題領域についての理解が浅く、そういう意味でNodeのメリットを
理解し切れていません。
perl コマンドなどの従来のプログラミング環境と比べると、node コマンドが
提供するプログラミング環境はイベント駆動プログラミング環境を手軽に
(標準で)利用できる環境であり、IOがブロックしない環境であり、
そういった環境が強力に後押しできる問題領域があるってことなんですよね。
そこをちゃんと理解できたら、Webアプリケーションに限らず日々の業務を
効率化するスクリプティングにnode コマンドを活用することもできるんだろうなぁ
と思いました。
もう少し勉強続けてみます。
ありがとうございました。
こんにちは、加藤(xkyoji)です
内村さんと一緒で、割と最近になってからNode.jsを知ったので、わたしの理解が参考になればと思って横から書くと、ご質問にある意図というのは、おそらくPerlやシェルなど他言語と比較するのではなく、Node.jsをApacheと比べられた方が、先に書かかれているJxckさん、mesoさん、KOBA789さんの内容、それにノンブロッキングI/Oといった特定分野の理解も進み易そうな印象があります。
例ですが、ここのページではベンチマークをApache+PHPとNode.jsでとっています。
http://code.google.com/p/node-js-vs-apache-php-benchmark/wiki/Tests
それと、Node.jsを理解するため私の場合は検索エンジン経由でいろいろな方のブログなどを見て公開されている記事を読んだり、あとGithubなどで公開しているソースや、nodeknockoutのアプリなどをいじったりしながら少しづつ理解をしていってます。
以上、ご参考になれば幸いです。
nodeはサーバを作るためのフレームワークなので、perlだとcatalyst、rubyだとrailsやeventmachine、pythonだとtwistedなんかがnodeの比較対象としては相応だと思います。サーバを作るためのフレームワークで、尚且つ非同期APIを提供しているものとなると、eventmachineとtwistedがよりよい比較対象になると思います。
nodeをapache httpserverのcgiを経由して走らせるのは、passengerを使ってrailsをapache
httpserverで走らせるのが、より近い比較対象になると思います。
- 高木
2011/9/11 Kyoji KATO <mpdm....@googlemail.com>:
内村です。
ご意見ありがとうございました!
Nodeとよくサンプルになっている、Webアプリケーションの実装までを、
apache+ApacheAPIアプリ,apache+mod_perl(+catalyst),apache+mod_php
などを同列に考える、そのうえで比較するということはわかるんですが、
Nodeはサーバを作るためのフレームワークというのは言い過ぎのような気がしました。
単にapacheとapache上の他のプログラミング言語で作成したWebアプリ
では困難な問題がNodeでそのまま作るWebアプリなら解決可能で、
そこに多くの方の興味が向いているということであって、
(まあ、もっともそれがほとんどの人がフォーカスしているという事なのかもしれませんが、
まだそこまで理解できていません。。)
NodeをWebアプリと必ずしも紐付ける必要はないと思っています。
あくまでも、JavaScript実行環境の実装の一つですよね。
Perlでも非同期IOの実装がありますし、Webサーバ実装もあるんで、
非同期IOを使うということとWebサーバを作るということは可能だと思います。
それらを組み合わせた実装があれば、それとの比較がNode+Webアプリ
のよくあるサンプルとの比較になるのかなぁと思いました。
Perl非同期Webアプリを作る上での困難とNode非同期Webアプリでのそれ、
Perl非同期Webアプリでの性能上の問題とNodeでのそれ、
といった比較をするとよくわかるのかなぁ。
ちょっと今ググった感じでは、AnyEvent(Perl)とNodeを置き換えるというような
こともあるみたいなんで、何かAnyEventで問題があってNodeだと解決する、
みたいなことがあるんでしょうね。
ということは、イベント駆動プログラミング環境を提供する各実装において、
Nodeが他の環境ではなしえていないことをしていて、
そこにたいしてNodeアプリケーション(Webアプリに限らず)を開発する
っていう考え方をしていけばいいんだろうか。
まとまりがなくてすみません、なんか変なこといってたらご指摘ください。
--
2011年9月12日8:20 atsuya <asoft...@gmail.com>:
はじめまして、波多野と申します。
実は node.js 初心者ですが、自分なりの理解の仕方も何かの
ご参考になればと思いレスさせて頂きます。
多数のリクエストを同時にハンドリングするのに向いている
非同期 I/O のサーバーは、より前面に出ることで真価を
発揮すると考えれば、理解しやすいのかなと私なりに
考えています。なので node.js = Web サーバーだと。
さらに言えば、静的なファイルは nginx にまかせて、
動的なところを node にするとか、いい所を集めると、
そういう構成になってくるのかと思います。
一方 Apache 配下のスクリプト実行エンジンとして node.js を
見た場合、せっかくの利点を活かしにくいので評価するのが
難しいかと思います。実際、単体で階乗計算などの数値計算を
させた場合(私の組み方が悪いような気もしますが)
Rhino の方が処理が若干速いようです。
波多野
2011/9/12 内村幸一郎 <koichiro...@gmail.com>:
内村です。
> 非同期 I/O のサーバーは、より前面に出ることで真価を
> 発揮すると考えれば、理解しやすいのかなと私なりに
前面に出るというのは受信するところからイベント駆動の
環境で処理するということですよね。
それができないApache+nodeスクリプト真価が発揮できない
ということは、これまでの皆様のご意見とも合わせましても納得いたしました。
> 考えています。なので node.js = Web サーバーだと。
ごめんなさい、ここはどうしてもまだ納得できません。
イベント駆動、ブロックしないIOというプログラミング環境=Node
という理解です、今のところ。
ちなみに、不勉強で申し訳ありませんが、
nginxっていのは、イベント駆動のWebサーバなんですよね?
そこにもし、mod_nodeみたいなのがあったら、
いいのかな。あ、でもIOがブロックしたりするのかな。
webサーバとしてポート80で何かが立ち上がっているとして、
そこでいろいろなものを提供しないといけないときって、
Nodeだとどうするんですかね。
当初の疑問も、そういう観点から出てきたんだと思います。
Nodeにルーティングするモジュールがやっぱりあるんでしょうね、きっと。
そうなると、リバースプロキシで受けて、Nodeサーバと通常のWebサーバ
に振り分けるみたいなことになるんですかね。
なんかまとまりなくってすみません。
いろいろなご意見いただいて、Node脳を形成するいい刺激になってます。
--
2011年9月12日16:20 Nobu Hatano <nobuh...@gmail.com>:
どうも波多野です。牧さまや、他の方々からの色々な情報興味深いですよね。こうしてやり取りしてみると、私にとってもとても勉強になると感謝しています。
私も今まで仕入れた情報から、Node.js は Web サーバーで使う、リクエストをルーティングさせる、WebSocket みたいにリアルタイムで接続する、のが定石みたいな考えが有りました。しかし良く考えてみると、非同期 I/O は複数のDBや外部サイトへ同時アクセスしながら何かやる場合にも有益かもしれません。普通に作ると PHP とかの方が性能が良さそうですが、あえて CGI 的なバックエンドで node を使うのも新たな発見があるかもしれません。
"なんでも Node.js" でやって見るのがもしかしたら一番面白いのかもしれませんね。
波多野
内村です。
AnyEventとnode.jsの比較大変わかりやすかったです。
あるパラダイムを後押しする環境が違うってことなんですね。
「なんでもnode.js」ですか。
まあ、実装コストうんぬんとかをそれほどシビアに考える必要のない
自分プロジェクトで遊んでみます。
それ以外もいろいろと教えていただきありがとうございました。
2011年9月13日22:11 Maki-Daisuke <maki.d...@gmail.com>: