web-dev-qa-db-ja.com

同じサーバー上のApacheとNode.js

NodeはSwiftであり、クライアント側で使用しているのと同じ言語を使用しているため、Nodeを使用したいのですが、定義上ブロックされていません。しかし、私がファイル処理(保存、編集、名前変更、ダウンロード、ファイルのアップロードなど)のためにプログラムを書くために雇った人は、Apacheを使いたがっています。だから、私はする必要があります:

  1. Nodeを使うように彼に納得させる(彼はそれについて少しの理由をあきらめている)

  2. ノードでファイルをアップロード、ダウンロード、名前変更、保存などする方法を考え出す。

  3. 私はApacheとnodeを同じサーバーにインストールしなければなりません。

これは最も好ましい状況ですが、どのようにしてそれを実装しますか?

330
Matt

すばらしい質問です!

PHPには、Apache上で動作する多数のWebサイトや無料のWebアプリが実装されています。多くの人がそれを使用するので、簡単にマッシュアップできます。 Nodeは、高速で強力、エレガント、そしてV8の生の力を備えたセクシーなツールと、組み込みの依存関係のないフラットスタックです。

私はまたApacheの容易さ/柔軟性、そしてNode.JSの巧妙さと優雅さを望んでいます、なぜ私は両方を持つことができないのですか?

幸い、Apacheのhttpd.confProxyPass ディレクティブを使用すると、特定のURLのすべての要求をNode.JSアプリケーションにパイプすることはそれほど難しくありません。

ProxyPass /node http://localhost:8000

また、次の行がコメントアウトされていないことを確認して、httpリクエストを再ルーティングするための適切なプロキシとサブモジュールを取得します。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

その後、ポート8000​​でNodeアプリを実行します。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Apache!\n');
}).listen(8000, '127.0.0.1');

URLに/node/パスを使用してすべてのNode.JSロジックにアクセスできます。残りのWebサイトは、既存のPHPページをホストするためにApacheに任せることができます。

enter image description here

今残っている唯一のことはあなたのホスティング会社があなたにこの設定で走らせることを納得させることです!

671
Steven de Salas

この質問は Server Fault の詳細ですが、FWIW Node.jsの前でApacheを実行するのは、ほとんどの場合良い方法ではありません。

ApacheのProxyPassは(Tomcatベースのサービスをサイトの一部として公開するなど)多くのことに優れています。また、Node.jsアプリケーションが特定の小さな役割を果たしている場合、または限られた数のユーザーしかいない内部ツールです。それで、それを使用して先に進むことができるようにそれを使用することがより簡単であるかもしれません、しかしそれはここの場合のように聞こえません。

パフォーマンスとスケールを活用したい場合、特にNode.jsを使用したい場合は - そしてWebソケットのような持続的接続を維持することを含むものを使用したい場合 - 、ApacheとNodeの両方を実行する方が得策です。他のポートでjs(localhost:8080上のApache、localhost:3000上のNode.jsなど)を実行してから、nginx、Varnish、またはHAプロキシのようなものを前面で実行し、そのようにトラフィックをルーティングします。

ニスやnginxのようなものでは、パスやホストに基づいてトラフィックをルーティングできます。どちらもシステムリソースの使用量がはるかに少なく、同じことを行うためにApacheを使用するよりもはるかにスケーラブルです。

55
Iain Collins


Apache2(v2.4.xx) serverに沿ってnode serverを実行するための指示:

特定のURLに対するすべてのリクエストをNode.JSアプリケーションに渡すために、CUSTOM.confディレクトリ内に/etc/Apache2/conf-availableファイルを作成し、作成したファイルに次の行を追加します。

ProxyPass /node http://localhost:8000/

8000をnode serverの優先ポート番号に変更します。
次のコマンドでカスタム設定を有効にします。

$> Sudo a2enconf CUSTOM

CUSTOMはあなたが新しく作成した拡張子なしのファイル名です。そして、次のコマンドでproxy_httpを有効にします。

$> Sudo a2enmod proxy_http

proxyモジュールとproxy_httpモジュールの両方を有効にします。モジュールが有効になっているかどうかは、次の方法で確認できます。

$> Sudo a2query -m MODULE_NAME

設定とモジュールを有効にしたら、Apacheサーバーを再起動する必要があります。

$> Sudo service Apache2 restart

これでノードサーバーを実行できます。 URL/nodeに対するすべての要求は、ノードサーバーによって処理されます。

30
krmld

1つのサーバー上でNodeとApacheを実行するのは矛盾しないので簡単です。 NodeJSはJavaScriptサーバー側を実行するための単なる方法です。本当のジレンマは、外部からNodeとApacheの両方にアクセスすることに由来します。お分かりのように、あなたには2つの選択肢があります。

  1. 一致するすべての要求をNodeJSに代行するようにApacheを設定します。これにより、ファイルのアップロードおよびノー​​ド内のその他すべての処理が行われます。

  2. ApacheとNodeを異なるIP:ポートの組み合わせに設定します(サーバーに2つのIPがある場合は、一方をノードリスナーに、もう一方をApacheにバインドできます)。

私はまたこれがあなたが実際に探しているものではないかもしれないということを疑い始めています。あなたの最終目標がNodejsであなたがあなたのアプリケーションロジックを書くことであり、そしてあなたが請負業者に負担をかける「ファイル処理」部分であるならば、それは実際にはWebサーバーではなく言語の選択です。

14
Yarek T

あなたはApacheと他のすべてのnodejsアプリの両方を代理するためにnodejsを持つリバースプロキシサーバーを書くなどの異なるアプローチを使うことができます。

apacheをポート80以外の別のポートで動作させる必要があるのではないか。例:ポート8080

その後、nodejsを使ってリバースプロキシスクリプトを書くことができます。

var proxy = require('redbird')({port: 80, xfwd: false);

proxy.register("mydomain.me/blog", "http://mydomain.me:8080/blog");
proxy.register("mydomain.me", "http://mydomain.me:3000");

次の記事では、これを行う全体のプロセスについて説明しています。

http://wathmal.xyz/run-Apache-with-node-js-reverse-proxy/

8
wathmal
ProxyPass /node http://localhost:8000/     
  • これは、httpd.confではなくhttpd-vhosts.confに上記のエントリを作成したときに機能しました
  • 私の環境にXAMPPがインストールされており、8080ポートで実行されているNodeJSアプリケーションを使用して、ポート80のApacheですべてのトラフィックをヒットしようとしていました。つまり、 http:// localhost/[name_of_the_node_application]
0
rahul shukla