16

Nodejs と Apache を並行して実行しています。

node-http-proxy はポート 80 でリッスンし、リクエストを Apache(:9000) または Express(:8000) に転送します。

Apache の仮想ホストは次のようになります。

<VirtualHost 127.0.0.1>
    DocumentRoot "/localhost/myVhost"
    ServerName myVhost
</VirtualHost>

私の質問は、Express/Nodejs 側で vhost のような機能を持つ「正しい」方法は何ですか? ここで提案されているように、各 Nodejs アプリを独自のポートに配置する必要はありません。

https://github.com/nodejitsu/node-http-proxy (「「ホスト名のみ」の ProxyTable を使用したプロキシ リクエスト」というタイトルのセクション)

Connect(私が理解しているように、Expressにバンドルされています)にはいくつかの仮想ホスト機能があることに気付きました。私はそれを使うべきですか?もしそうなら、node-http-proxy と一緒にそれを実行する正しい方法は何でしょうか?

http://www.senchalabs.org/connect/middleware-vhost.html

「Cluster」と呼ばれるこの他のモジュールにも気付きました。関連しているようですが、方法がわかりません。

http://learnboost.github.com/cluster/

圧倒したくないのですが、「Haibu」と呼ばれるものにも出くわしました。これは関連しているようですが、仮想ホストを使用するための完全な代替になるかどうかはわかりません。

https://github.com/nodejitsu/haibu

注: 私はフロントエンドの専門家なので、多くのサーバー用語に精通していません。

4

4 に答える 4

11

HaibuもClusterもわからなかった。しかし、私の問題に対処する良い解決策を見つけました。驚いたことに、実際には非常に簡単でした。ただし、サーバーについてはよく知らないので、これは機能しますが、最適ではない可能性があります。

Apache で通常のように仮想ホストをセットアップしました (http://httpd.apache.org/docs/2.0/vhosts/examples.html)

Nodeに以下をインストールしました

  • エクスプレス (http://expressjs.com/)
  • node-http-proxy (https://github.com/nodejitsu/node-http-proxy)

次に、個人的なスタイルの問題として、すべての仮想ホストを共通のディレクトリ (/localhost) に配置しました。

次に、ポート 80 以外のポートでリッスンするように Apache を切り替えました。たまたまポート 9000 を選択したのは、それがどこかで使用されているのを見たからです。(httpd.conf で、"Listen 80" を "Listen 9000" に変更)。また、extra/httpd-vhosts.conf で定義されているすべての仮想ホストが、ポート (*:80) を使用する代わりに、IP ベースの nameVirtualHost (127.0.0.1) に設定されていることを確認する必要がありました。

ノード側では、ポート 8000 でリッスンするアプリ/サーバー (別名ノード仮想ホスト) を作成しました (ポート番号の任意の選択) 。 html

/localhost ディレクトリに、「nodeHttpProxy.js」というファイルを作成しました。

次に、nodeHttpProxy.js で node-http-proxy を使用して、ポート 80 でリッスンするプロキシ サーバーを作成しました。connect (http://www.senchalabs.org/connect/) をラップする Express を使用して、仮想ホストを作成しました。

nodeHttpProxy.js ファイルは次のようになります。

// Module dependancies
var httpProxy = require('/usr/local/lib/node_modules/http-proxy/lib/node-http-proxy')
, express = require('/usr/local/lib/node_modules/express/lib/express');

// Http proxy-server
httpProxy.createServer(function (req, res, proxy) {

    // Array of node host names
    var nodeVhosts = [
        'vhost1'
        , 'vhost2'
    ]
    , host = req.header('host')
    , port = nodeVhosts.indexOf(host) > -1
        ? 8000
        : 9000;

    // Now proxy the request
    proxy.proxyRequest(req, res, {
        host: host
        , port: port
    });
})
.listen(80);

// Vhosts server
express.createServer()
.use(express.vhost('vhost1', require('./vhost1/app')))
.use(express.vhost('vhost2', require('./vhost2/app')))
.app.listen(8000);

ご覧のとおり、新しい Node 仮想ホストを作成するたびに、次の 2 つのことを行う必要があります。

  1. 仮想ホスト名を「nodeVhosts」配列に追加します
  2. .set メソッドを使用して新しい高速仮想ホストを定義する

もちろん、/localhost ディレクトリに実際のホスト パス/ファイルを作成する必要もあります。

これがすべて完了したら、nodeHttpProxy.js を実行するだけです。

node nodeHttpProxy.js

奇妙な「EACCESS」エラーが発生する場合があります。その場合は、sudo として実行してください。

ポート 80 でリッスンし、ホストが nodeVhosts 配列内の名前の 1 つと一致する場合は、ポート 8000 でそのホストにリクエストを転送します。それ以外の場合は、ポート 9000 でそのホストにリクエストを転送します。

于 2012-03-10T08:42:29.363 に答える
6

最近、個人的なテスト環境で同じ問題に取り組んでいるので、これについて考えていました。各ノード アプリケーションを独自のポートで実行することを回避することはできませんが、そのプロセスの苦痛を抽象化することはできます。これが私が現在使用しているものですが、将来的にはこれを簡素化するために npm パッケージを構築したいと考えています。

各 node.js アプリケーションには、アプリケーションがリッスンしているポートを含むマップ ファイルと、アプリケーションが提供されている予想されるパスを示すマ​​ップがあります。ファイルの内容は次のようになります。

{"path": "domain.com/path", "port": 3001}

アプリケーションを起動すると、map.json ファイルからポートが読み取られ、指定されたポートがリッスンされます。

var map = fs.readFileSync('map.json', 'ascii');
app.listen(map.port);

次に、プロキシ設定で、各 node.js アプリケーション ディレクトリを繰り返し処理し、ポート 80 トラフィックをこのアプリケーションにプロキシする必要があることを示す map.json ファイルを確認します。

ほぼ同じ方法を使用して、Apache でホストされているアプリケーションのプロキシもセットアップします。サービスを提供している PHP Web サイトではフォルダー ベースの規則を使用しており、次の構成を使用しています。

VirtualDocumentRoot /var/www/%-2.0.%-1/%-3+/
VirtualScriptAlias /var/www/%-2.0.%-1/%-3+/cgi-bin/

これにより、基本的に、次の構造を使用してドメインをフォルダーにマップできます。

http://sub.domain.com/ = /var/www/domain.com/sub/

サイトを追加または削除するために必要な追加の構成はありません。これは、Apache サイトとノード サイトの両方をプロキシするために現在使用しているものに非常に近いものです。このプロキシ アプリケーションを変更せずに、新しいノードと新しい Apache サイトを追加できます。

proxy.js

var fs = require('fs');
var httpProxy = require('http-proxy');

var proxyTable = [];

// Map apache proxies
fs.readdirSync('/var/www/').forEach(function(domain) {
    fs.readdirSync('/var/www/' + domain).forEach(function(path) {
        var fqd = domain + '/' + path;
        var port = fs.readFileSync('port', 'ascii');
        proxyTable[fqd] = fqd + ':' + 8080;
    });
});    

// Map node proxies
fs.readdirSync('/var/www-node/').forEach(function(domain) {
        var map = fs.readFileSync('map.json', 'ascii');
        proxyTable.[map.path] = '127.0.0.1:' + map.port;
});

var options = {
    router: proxyTable
};

var proxyServer = httpProxy.createServer(options);
proxyServer.listen(80);

将来的には、アプリケーションがリッスンしているポートからパスを分離する可能性がありますが、この構成により、ほとんど作業を行わずにプロキシ マップを自動的に構築できます。うまくいけば、これが役に立ちます。

于 2012-02-20T23:38:24.580 に答える
0

@uglymunky からインスピレーションを得て、Ubuntu でこれを行うためのシェフ スクリプトを作成しました。

このスクリプトを使用すると、github からシェフのプロジェクトをプルダウンした後、1 行を使用して vhost をサポートする Express と Apache を単一のサーバーにインストールできます。

https://github.com/toranb/ubuntu-web-server

gitがインストールされていて、それをプルダウンすると、次のように開始できます...

sudo ./install.sh configuration.json

これには、Ubuntu 12.04 以降が必要です。これは、マシンの再起動時にノードを起動するために upstart スクリプトを利用したためです。

スクリプトが完了すると、設定した任意のノード アプリを実行するための Express を備えた動作中の ubuntu Web サーバーと、設定した任意の wsgi アプリを実行するための apache が用意されます。

于 2012-07-26T10:59:23.787 に答える
0

私は、プロジェクトから完全に分離できる、非常に最小限で要点のライブラリに取り組んでいます。基本的に、アイデアはサーバー上でこれを独立して実行し、接続する方法でこれをプロジェクトにバンドルする必要があることを心配する必要はありません。

config.json ファイルを見て、実際にセットアップがいかに簡単かを確認してください。

私はこれを探していて、いくつか見つけましたが、特に HTTPS、WS、WSS など、必要なものすべてをサポートしていませんでした。

現在、私が書いたライブラリは HTTP でしか動作しません。しかし、今後数日でそれが完成し、HTTPS、WS、および WSS でも動作するようになることを願っています。

于 2013-06-08T09:22:18.667 に答える