2011-11-14 12 views
10

現在、nginxでプロキシされている接続ノードでnginxとnodejsを試しています。私が持っている問題は、現在のところroot(/)ではなく/ dataの下でnodejsを実行していないということです.nginxは静的な要求を通常のように処理する必要があります。 nodejsは/ dataの下にあることを知る必要はありませんが、必要と思われます。nginxの下でnodejsを実行

つまり、私はnodejsが/で動くと思うようにしたい。それは可能ですか?

nginxの設定ファイル:

upstream app_node { 
    server 127.0.0.1:3000; 
} 

server { 
... 

    location /data { 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header Host $http_host; 
      proxy_set_header X-NginX-Proxy true; 

      proxy_pass http://app_node/data; 
      proxy_redirect off; 
    } 
} 

nodejsコード:

exports.routes = function(app) { 
    // I don't want "data" here. My nodejs app should be able to run under 
    // any folder 
    app.get('/data', function(req, res, params) { 
      res.writeHead(200, { 'Content-type': 'text/plain' }); 
      res.end('app.get /data'); 
    }); 
    // I don't want "data" here either 
    app.get('/data/test', function(req, res, params) { 
      res.writeHead(200, { 'Content-type': 'text/plain' }); 
      res.end('app.get /data/test'); 
    }); 
}; 
+0

良い質問です。私はこれについての解決策をまだ見つけていない。私のアプリケーションには2つのパスがあります。/appはWebアプリケーション用、/ staticはすべての静的ファイル用です。 – andyuk

+0

Fyi。私はconfig.jsを追加し、そこに設定を定義しています。少なくともそれはアプリの一部として1つの場所にあり、スタートアップのconfに広がったり、envを見つけることが困難です。 – Asken

+0

ポート番号の後ろに '/'を置いてみてください。それは私のために働いた。 –

答えて

3

私は(あなたが「ミドルウェア」のロジックを使用してExpressまたは類似した何かのようなものを使用している場合)は、このソリューションは、より良いかもしれないと思う:

ので

のようにURLを変更するミドルウェア機能を追加します。

rewriter.jsあなたのエクスプレスアプリで

はとても好きです。

app.configを

// your configuration 
app.configure(function(){ 
    ... 
    app.use(require('./rewriter.js').temp_rewrite()); 
    ... 
}); 

// here are the routes 
// notice you don't need to write '/data' in front anymore all the time 

app.get('/', function (req, res) { 
    res.send('This is actually site.com/data/'); 
}); 

app.get('/example', function (req, res) { 
    res.send('This is actually site.com/data/example') 
}); 
+1

あなたはもう一度...多分私のアプリを開発することができます:)。書き直しは、私が後にしていたもので、私は接続を使用しているのでうまくいくでしょう。 – Asken

+0

問題はありませんが、Node.jsに関連する質問で他の誰かを助けることができてうれしいです。私はNode&Expressを学んでいて、TJ(Express&Connectの著者)のような人たちが本当に親切で、私の質問すべてに答えるのに十分だったときに自分自身に質問することがたくさんありました。 P.S.確かに、私はあなたのアプリを作ることができます:P – alessioalex

0

一時的な解決策: ない私には理想的な私は、少なくともそれを構成することができますように、今のところ原因する必要があります。私が使用してノード・サーバを起動しています:

node app2.js /data 

コードルートノードを処理するために:

exports.routes = function(app) { 
    var me = this; 

    // get the root path 
    me.proxyRootPath = process.argv[2]; 

    // using the proxyRootPath to answer to the correct request 
    app.get(me.proxyRootPath, function(req, res, params) { 
      res.writeHead(200, { 'Content-type': 'text/plain' }); 
      res.end('app.get /data'); 
    }); 
    // using the proxyRootPath to answer to the correct request 
    app.get(me.proxyRootPath + '/test', function(req, res, params) { 
      res.writeHead(200, { 'Content-type': 'text/plain' }); 
      res.end('app.get /data/test'); 
    }); 
}; 
0

ソリューション:

  • は、コマンド上のディレクトリを探すためにアプリを書きますライン。あなたは、アプリケーションを実行するときにコマンドラインでディレクトリを渡します。

  • アプリケーションを作成して、特定の環境変数でディレクトリを探します。あなたは、アプリケーションを実行するときに最初に環境変数を設定します。

  • 現在のディレクトリが目的のディレクトリであると想定してアプリを書きます。アプリケーションを実行すると、最初にディレクトリに移動します。

  • 既知のファイルを探してディレクトリツリーをステップアップするようにアプリケーションを作成します(たとえば、./app2.jsを探してディレクトリをステップアップし、そのファイルが見つかったディレクトリが目的のディレクトリです)。

+0

私は「より良い」答えを探していましたが、nodejsは特にそれが実行されているコンテキストを認識していないようです。完全なURLは常に解析されます。私はASP.Netからアプリケーションフォルダがルートになってくるのを見て、私の頭を包み込む必要がありました。 3番は私の場合は当てはまりませんが、他のものは完全に有効です。 – Asken

1

私は通常、次の操作を行います。

nginxの設定:

upstream app_node { 
    server 127.0.0.1:3000; 
} 

server { 
    ... 
    location /data/ { 
    ... 
    proxy_pass http://app_node 
    rewrite ^/data/(.*)? /$1 break; 
    } 
} 

ノードを。JSアプリ:

app.get('/something', function(req, res, next) { 
    ... 
}); 

そして、外の世界から私はnginxのは、URLが書き換えただけなので(/something?someKey=someValueとしてそれを見ることができますNode.jsのアプリに渡すであろう、などhttp://my-host-name/data/something?someKey=someValueとして要求を作ることができます)。

私は常に "things that do one thing and do it well"の哲学を尊重しているので、これは唯一のアプローチではないが、より良いものの中には私が知っている。ここで、NginxはURLを書き直すのが得意ですが、Node.jsはリクエスト自体を処理するのには優れています。

関連する問題