98

単一の IP がバインドされた Linux サーバーがあります。この IP 上のこのサーバーで複数の Node.js サイトをホストしたいと考えています。それぞれに (明らかに) 一意のドメインまたはサブドメインがあります。それらをすべてポート 80 にします。

これを行うためのオプションは何ですか?

明らかな解決策は、プロキシとして機能し、一意のポートで実行されている他の node.js アプリへのパススルーを行う node.js Web アプリによってすべてのドメインにサービスを提供することです。

4

13 に答える 13

89

次のいずれかを選択します。

于 2013-10-08T17:53:13.050 に答える
56

Diet.jsには、同じサーバー インスタンスで複数のドメインをホストする非常に優れたシンプルな方法があります。server()ドメインごとにnew を呼び出すだけです

簡単な例

// Require diet
var server = require('diet');

// Main domain
var app = server()
app.listen('http://example.com/')
app.get('/', function($){
    $.end('hello world ')
})

// Sub domain
var sub = server()
sub.listen('http://subdomain.example.com/')
sub.get('/', function($){
    $.end('hello world at sub domain!')
})

// Other domain
var other = server()
other.listen('http://other.com/')
other.get('/', function($){
    $.end('hello world at other domain')
})

アプリの分離

アプリ用に別のフォルダーが必要な場合は、次のようなフォルダー構造にすることができます。

/server
   /yourApp
       /node_modules
       index.js
   /yourOtherApp
       /node_modules
       index.js
   /node_modules
   index.js

では/server/index.js、各アプリがそのフォルダーごとに必要になります。

require('./yourApp')
require('./yourOtherApp')

次のような最初のドメイン/server/yourApp/index.jsを設定します。

// Require diet
var server = require('diet')

// Create app
var app = server()
app.listen('http://example.com/')
app.get('/', function($){
    $.end('hello world ')
})

そして、次のような2 番目のドメイン/server/yourOtherApp/index.jsをセットアップします。

// Require diet
var server = require('diet')

// Create app
var app = server()
app.listen('http://other.com/')
app.get('/', function($){
    $.end('hello world at other.com ')
});

続きを読む:

于 2014-08-17T18:58:06.603 に答える
22

うーん... nodejsがプロキシとして機能する必要があると思うのはなぜですか。異なるポートでリッスンしているいくつかのノード アプリを実行することをお勧めします。次に、nginx を使用して、リクエストを正しいポートに転送します。単一の nodejs を使用すると、単一障害点も発生します。そのアプリがクラッシュすると、すべてのサイトがダウンします。

于 2013-10-08T18:54:05.217 に答える
13

nginx をリバース プロキシとして使用します。

http://www.nginxtips.com/how-to-setup-nginx-as-proxy-for-nodejs/

Nginx は、キャッシング、静的ファイル処理、ssl、および負荷分散の形で、アプリケーションに多くの利点をもたらします。

于 2013-10-08T17:48:02.657 に答える
7

connect/express サーバーを使用している場合は、vhostミドルウェアが表示されます。サーバーアドレスに複数のドメイン(サブドメイン)を使用できるようになります。

hereの例に従うことができます。これは、必要なものとまったく同じように見えます。

于 2013-10-08T17:53:02.370 に答える
6

バニラ Node.js を使用してそれを行う方法は次のとおりです。

const http = require('http')
const url = require('url')
const port = 5555
const sites = {
  exampleSite1: 544,
  exampleSite2: 543
}

const proxy = http.createServer( (req, res) => {
  const { pathname:path } = url.parse(req.url)
  const { method, headers } = req
  const hostname = headers.host.split(':')[0].replace('www.', '')
  if (!sites.hasOwnProperty(hostname)) throw new Error(`invalid hostname ${hostname}`)

  const proxiedRequest = http.request({
    hostname,
    path,
    port: sites[hostname],
    method,
    headers 
  })

  proxiedRequest.on('response', remoteRes => {
    res.writeHead(remoteRes.statusCode, remoteRes.headers)  
    remoteRes.pipe(res)
  })
  proxiedRequest.on('error', () => {
    res.writeHead(500)
    res.end()
  })

  req.pipe(proxiedRequest)
})

proxy.listen(port, () => {
  console.log(`reverse proxy listening on port ${port}`)
})

かなり単純ですね。

于 2018-08-07T22:38:34.623 に答える
4

最初に永遠弾むようにインストールします。

次に起動スクリプトを書きます。このスクリプトでは、iptables ファイアウォール ユーティリティにルールを追加して、ポート 80 のトラフィックをポート 8000 (または選択したその他のもの) に転送するように指示します。私の例では、8000 は弾むように実行する場所です。

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000

forever を使用して、ポート 8000 で bouncy を実行するようにスクリプトに指示しましょう

forever start --spinSleepTime 10000 /path/to/bouncy /path/to/bouncy/routes.json 8000

routes.json は次のようになります

{
    “subdomain1.domain.com" : 5000,
    “subdomain2.domain.com" : 5001,
    “subdomain3.domain.com" : 5002
}

NodeJS application1、application2、および application3 は、それぞれポート 5000、5001、および 5002 で実行されます。

私の場合に使用するスクリプトはここにあります。環境に合わせて少し変更する必要があるかもしれません。

これについても詳しく書いています。ここで見つけることができます。

于 2015-03-01T08:15:36.763 に答える
0

デジタルオーシャンからのこのガイドは優れた方法です. アプリをデーモン化する (サービスとして実行する) pm2 モジュールを使用します。アプリがクラッシュした場合にアプリが自動的に再起動されるため、Forever のような追加モジュールは必要ありません。サーバーで実行されているさまざまなアプリケーションを監視するのに役立つ多くの機能があります。それはかなり素晴らしいです!

于 2016-09-13T14:42:52.593 に答える