Nginx +サーバーサイドJavaScript

...またはPHP + JavaScriptからJavaScript + JavaScriptに切り替える方法



サーバーサイドJavaScriptでプロジェクトを実装するというアイデアは、かなり前のことです。 問題は、適切なサーバーソフトウェアの不足でした。 既存のオープンソースプロジェクトは、さまざまな理由で適合しませんでした。 Apache用のアドオンモジュールをインストールするのは良い考えではありません。パフォーマンスとメモリ使用量の最適化が限界に達しているためです。 jslibを使用してFastCGIを構成できますが、「502 Bad Gateway」の可能性を最小限にしたくはありませんでした。ngx_http_js_moduleプロジェクトはまだ初期段階であり、 ngxv8は実際のアプリケーション向けに十分に開発されていません。 そのため、サーバーサイドjavascriptを独自に実装することにしました。 そして、すべての基本機能をすぐにプログラムして、現実に近い条件でテストできるようにしてください。



nginxをメインWebサーバーとして使用し、TraceMonkey( Mozilla Firefoxの javascriptエンジン、以前のSpiderMonkey)をjavascriptの「エンジン」として使用し、nginxのモジュールを「接着」することにしました。 一見複雑なことはありませんが、特定の機能が必要でした(そして機能しました!)。 ちなみに、ほとんどのアイデアはPHPから借用しています さらに、いくつかの他の機能(標準化、構成ファイルの作成などのためのツール)が、メインリストには含まれていませんでした-TraceMonkeyの言語機能で実行できます。



言葉から行動へ! コンパイルと構成の方法、テストと比較の方法...



アセンブリの詳細については詳しく説明しません。そうしないと、テキストのサイズが非常に大きくなります。 Linuxの「ビルド」プログラムの経験があるユーザーは非常に快適に感じるでしょうが、他のすべての人には、 バイナリアセンブリとセルフコンパイルのプロセスをスキップする機能を提供できます。



あなたが必要になります: 組み立て順序は次のとおりです。



最新バージョンの最初のNSPR(執筆時点-4.8.2):



wget ftp://ftp.mozilla.org/pub/mozilla.org/nspr/releases/v4.8.2/src/nspr-4.8.2.tar.gz<br/>tar -xzf nspr-4.8.2.tar.gz<br/>cd nspr-4.8.2/mozilla/nsprpub<br/>./configure --prefix=/usr/local --with-pthreads<br/>make<br/>sudo make install<br/>





次に、リポジトリからTraceMonkeyを作成します(執筆時点では、リポジトリバージョン1.8.5で、1.7.0のソースコードのみでファイルをダウンロードできます)。



hg clone http://hg.mozilla.org/tracemonkey/<br/>cd tracemonkey/js/src<br/>autoconf2.13<br/>./configure --prefix=/usr/local --with-nspr-prefix=/usr/local --with-system-nspr --with-pthreads --enable-threadsafe<br/>make<br/>sudo make install<br/>





このステップには、いくつかの理由で問題があります。 まず、誰もがhg



コマンドを持っているわけではありません。 次に、すべてのMozilla Firefoxソースがリポジトリからダウンロードされます。 したがって、コードの最初の行を置き換えて、ソースのみTraceMonkeyをダウンロードできます。



# hg clone http://hg.mozilla.org/tracemonkey/<br/>wget http://js.nnov.ru/files/tracemonkey-20100119.tar.gz<br/>tar -xzf tracemonkey-20100119.tar.gz<br/>





そして、すでにコンパイルしています。



次に、nginx(0.8.32)とjavascriptモジュールがあります。



wget http://sysoev.ru/nginx/nginx-0.8.32.tar.gz<br/>tar -xzf nginx-0.8.32.tar.gz<br/>cd nginx-0.8.32/src/http/modules<br/>svn co http://nginx-javascript.googlecode.com/svn/trunk/ javascript<br/>cd ../../..<br/>./configure --prefix=/usr/local/nginx-javascript --add-module=src/http/modules/javascript<br/>make<br/>sudo make install<br/>





すべてがうまくいった場合は、セットアップに進みます。 バイナリアセンブリの幸せな所有者は、構成が既に完了していることを発見しますが、もう一度チェックしても問題はありません。 次の手順に従うだけで十分です。 javascriptサーバーが機能するようになったので、このソリューションは標準のApache + PHPよりもはるかに収益性が高いと思いました。 TraceMonkeyとPHPの内部最適化の問題の心配は少なかったので(たとえば、どのインタープリターが100万ステップのサイクルを高速に実行しますか?違いは小さいと思われます)、スクリプト "Hello、people!"が最初にテストされました。



関係する比較: テスト環境は、2GBのRAMとDebian Etchを備えた4コアXeonです。 すべてのトラフィックはローカルです。 ハードウェアの詳細には触れませんが、構成の詳細も多かれ少なかれ標準です。



最初に、1000クエリのテストサイクルを次々に実行します。



# Apache 2.2.14 (prefork) + PHP 5.2.12 (module)<br/>ab -n 1000 http://localhost:8085/hello.php<br/>Time per request: 5.278 [ms] (mean, across all concurrent requests)<br/># nginx (1 worker) + javascript<br/>ab -n 1000 http://localhost:8081/hello.jsx<br/>Time per request: 1.298 [ms] (mean, across all concurrent requests)<br/># nginx (8 workers) + javascript<br/>ab -n 1000 http://localhost:8088/hello.jsx<br/>Time per request: 1.322 [ms] (mean, across all concurrent requests)<br/>





100の同時接続を作成するときに、1000リクエストのテストサイクルになりました。



# Apache 2.2 (prefork) + PHP 5.2 (module)<br/>ab -n 1000 -c 100 http://localhost:8085/hello.php<br/>Time per request: 1.648 [ms] (mean, across all concurrent requests)<br/># nginx (1 worker) + javascript<br/>ab -n 1000 -c 100 http://localhost:8081/hello.jsx<br/>Time per request: 1.277 [ms] (mean, across all concurrent requests)<br/># nginx (8 workers) + javascript<br/>ab -n 1000 -c 100 http://localhost:8088/hello.jsx<br/>Time per request: 0.544 [ms] (mean, across all concurrent requests)<br/>





テスト結果: このようなサーバーサイドjavascriptの実装により、従来のPHPと比較して生産性が向上するという事実に加えて、javascriptでは非常に巧妙な言語構成を使用できます。



// id GET, POST cookies:<br/>print($request.get['id'], " ", $request.post['id'], " ", $request.cookie['id']);<br/>// Content-Type:<br/>$result.headers.push("Content-Type: text/html; charset=UTF-8");<br/>// , SELECT , GET, :<br/>var row = (new SQLite("database")).query("SELECT * FROM `table` WHERE `id`=?", $request.get['id']).fetch();<br/>// :<br/>print(File.open("index.html").getChars());<br/>// IP- , :<br/>print({$server.remoteAddr});<br/>





最後の例には構文エラーはありません; XMLドキュメントは実際にスクリプト内で使用できます。 同時に、変数呼び出しと関数呼び出しをそれらに挿入して、それらを中括弧で囲むことができます。 このテクノロジーE4Xは 、テンプレートの作成に非常に便利です。 他の多くの例は、 http://js.nnov.ru/nginx/examples.htmlにあります。



もちろん、次第に解決する必要がある多くの問題があります。 ただし、一般的には使用できます。 ちなみに、小さなサイトhttp://js.nnov.ruがJavaScriptで作成されています。 フォールトトレランスのハードテストはまだ行わないでください:-)



ZY>招待してくれたFTMに感謝します。そのおかげで、トピックはサンドボックスにありません

UPD>テーマをすぐに公開しますが、カルマに問題がありました。 関係者全員に感謝します!




All Articles