मैं अलग-अलग डोमेन के साथ एक ही आईपी / सर्वर पर कई Node.js साइटों की मेजबानी कैसे करूं?


92

मेरे पास एक एकल आईपी सर्वर है जिसके साथ एक एकल आईपी बाध्य है। मैं इस आईपी पर इस सर्वर पर कई Node.js साइटों की मेजबानी करना चाहता हूं, प्रत्येक (जाहिर है) एक अद्वितीय डोमेन या उपडोमेन के साथ। मैं उन सभी को पोर्ट 80 पर चाहता हूं।

ऐसा करने के लिए मेरे विकल्प क्या हैं?

एक स्पष्ट समाधान लगता है कि सभी डोमेन नोड.जेएस वेब ऐप द्वारा सेवित हैं जो एक प्रॉक्सी के रूप में कार्य करता है और अनूठे बंदरगाहों पर चलने वाले अन्य नोड.जेएस ऐप से गुजरता है।


4
मैं यह करता हूं और nginx के साथ अपस्ट्रीम करता हूं, नाम आधारित वर्चुअल होस्टिंग। के रूप में एक बोनस nginx स्थिर फ़ाइलों की सेवा करने के लिए कॉन्फ़िगर किया जा सकता है, अनुमति पुनर्निर्देशन, आदि
नंबर 1311407

जवाबों:


83

इनमें से कोई एक चुनें:

  • रिवर्स प्रॉक्सी के रूप में कुछ अन्य सर्वर ( जैसे नेग्नेक्स ) का उपयोग करें ।
  • रिवर्स प्रॉक्सी के रूप में नोड-http-प्रॉक्सी का उपयोग करें ।
  • यदि प्रत्येक डोमेन को एक ही कनेक्ट / एक्सप्रेस कोडबेस और नोड.जेएस उदाहरण से परोसा जा सकता है, तो vhost मिडिलवेयर का उपयोग करें ।

3
उन विकल्पों की एक बहुत अच्छी और संक्षिप्त सूची जो मैंने कहीं और पढ़ी है। क्या आप इन समाधानों में से प्रत्येक के लिए जानते हैं कि एक नया डोमेन जोड़ने पर किन प्रक्रियाओं को फिर से शुरू करना होगा? 1 के लिए) कोई नहीं। 2 के लिए) केवल नोड- http- प्रॉक्सी। 3 के लिए) सभी साइटों के पूरे धागे को फिर से शुरू करने की आवश्यकता होगी। क्या ये सही है?
फ्लिअन

1
@Flion: आप नोड-आधारित प्रॉक्सी को इस तरह से लिख सकते हैं कि आप एक प्रक्रिया पुनरारंभ की आवश्यकता के बिना डोमेन कॉन्फ़िगरेशन को फिर से लोड कर सकते हैं। यह वास्तव में आपके ऐप की सटीक आवश्यकताओं पर निर्भर करता है।
josh3736

जो नहीं पूछा गया था।
पैट्रिक स्टर्म

52

Diet.js के पास एक ही सर्वर उदाहरण के साथ कई डोमेन होस्ट करने का बहुत अच्छा और सरल तरीका है। आप बसserver()अपने प्रत्येक डोमेन के लिएएक नया कॉल कर सकतेहैं।

एक सरल उदाहरण

// 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 ')
})

और /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 ')
});

अधिक पढ़ें:


इस टिप्पणी ने मेरी सभी समस्याओं को बचा लिया :) ... 2016 में भी
myTerminal

क्या यह पुनः लोड होगा? मैंने PM2 का उपयोग करना शुरू कर दिया, लेकिन यह मुझे कई डोमेन होस्ट करने और प्रॉक्सी को रिवर्स करने की अनुमति नहीं देता है
Pini Cheyni

क्या यह एक्सप्रेस को प्रतिस्थापित करता है, या इसके साथ काम करता है? मेरा अनुमान या तो है। लेकिन मैं एक फ्रैंकनस्टाइन बनाने से पहले निश्चित होना चाहता हूं।
मर्दोक

1
FYI करें जुलाई 2019 तक - dietjs.com अब ऊपर नहीं है और ~ 2 वर्षों में जीथब कोडबेस का अपडेट नहीं आया है।
सर्किलेसम

20

हम्म ... क्यों आपको लगता है कि नोडज को एक प्रॉक्सी के रूप में कार्य करना चाहिए। मैं विभिन्न बंदरगाहों पर कई नोड ऐप्स को सुनने का सुझाव दूंगा। फिर अनुरोध को सही पोर्ट पर अग्रेषित करने के लिए nginx का उपयोग करें। यदि आप एक ही नोडज का उपयोग करते हैं तो आपके पास विफलता का एकल बिंदु भी होगा। अगर वह ऐप क्रैश हो जाता है तो सभी साइट डाउन हो जाती हैं।


13

नंगेक्स को रिवर्स प्रॉक्सी के रूप में उपयोग करें।

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

Nginx कैशिंग, स्टेटिक फाइल हैंडलिंग, एसएसएल और लोड बैलेंसिंग के रूप में आपके अनुप्रयोगों के लिए लाभों की एक पूरी मेजबानी लाता है।


12

मेरे पास एक एपीआई है जो मैं एक साइट पर उपयोग करता हूं और नीचे मेरा कॉन्फ़िगरेशन है। मेरे पास यह SSL और GZIP के साथ भी है, अगर किसी को इसकी आवश्यकता है, तो मुझे टिप्पणी करें।

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

var proxy_web = new httpProxy.createProxyServer({
        target: {
            host: 'localhost',
            port: 8080
        }
    });

    var proxy_api = new httpProxy.createProxyServer({
        target: {
            host: 'localhost',
            port: 8081
        }
    });

    http.createServer(function(req, res) {
        if (req.headers.host === 'http://www.domain.com') {
            proxy_web.proxyRequest(req, res);
            proxy_web.on('error', function(err, req, res) {
                if (err) console.log(err);
                res.writeHead(500);
                res.end('Oops, something went very wrong...');
            });
        } else if (req.headers.host === 'http://api.domain.com') {
            proxy_api.proxyRequest(req, res);
            proxy_api.on('error', function(err, req, res) {
                if (err) console.log(err);
                res.writeHead(500);
                res.end('Oops, something went very wrong...');
            });
        }
    }).listen(80);

7

यदि आप कनेक्ट / एक्सप्रेस सर्वर का उपयोग कर रहे हैं, तो आप vhostमिडलवेयर देख सकते हैं । यह सर्वर पते के लिए कई डोमेन (उप-डोमेन) का उपयोग करने की अनुमति देगा।

आप यहां दिए गए उदाहरण का अनुसरण कर सकते हैं , जो बिल्कुल वैसा ही दिखता है जैसा आपको चाहिए।



3

यह बिना किसी मिडलवेयर या प्रॉक्सी के मेरा सबसे सरल डेमो प्रोजेक्ट है।
इसके लिए केवल कुछ कोड की आवश्यकता होती है, और यह पर्याप्त है।

https://github.com/hitokun-s/node-express-multiapp-demo

इस संरचना के साथ, आप आसानी से प्रत्येक ऐप को स्वतंत्र रूप से सेट और रखरखाव कर सकते हैं।
मुझे उम्मीद है कि यह आपके लिए एक मदद होगी।


3

पहले हमेशा के लिए और उछालभरी स्थापित करें ।

फिर एक स्टार्टअप स्क्रिप्ट लिखें। इस स्क्रिप्ट में, iptables फ़ायरवॉल उपयोगिता में एक नियम जोड़कर इसे पोर्ट 80 से पोर्ट 8000 (या आपके द्वारा चुनी गई किसी भी चीज़) पर ट्रैफ़िक को अग्रेषित करने के लिए बताएं। मेरे उदाहरण में, 8000 वह जगह है जहां मैं बाउंसी चलाता हूं

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

हमेशा के लिए उपयोग करते हुए, आइए हम 8000 बंदरगाह पर उछाल चलाने के लिए स्क्रिप्ट बताएं

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

मार्गों.जसन कुछ इस तरह होगा

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

NodeJS application1, application2 और Application3 क्रमशः पोर्ट 5000, 5001 और 5002 पर चलते हैं।

मेरे मामले में मेरे द्वारा उपयोग की जाने वाली स्क्रिप्ट यहां मिल सकती है और आपको अपने वातावरण में फिट होने के लिए थोड़ा बदलना पड़ सकता है।

मैंने इसके बारे में और विवरण में भी लिखा है और आप इसे यहां पा सकते हैं ।


आपको PM2
Pini Cheyni

ठीक है यह बहुत अच्छा है, लेकिन मैं उछाल में http-> https कैसे मजबूर कर सकता हूं ??

2

यहाँ यह कैसे करना है वेनिला 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}`)
})

बहुत सरल, हुह?


1

जब आप अनुरोध और प्रतिक्रिया ऑब्जेक्ट प्राप्त करते हैं, तो आप "request.headers.host" के माध्यम से डोमेन प्राप्त कर सकते हैं ... (आईपी नहीं, वास्तव में डोमेन)


0

डिजिटल महासागर से यह गाइड एक उत्कृष्ट तरीका है। यह pm2 मॉड्यूल का उपयोग करता है जो आपके ऐप को निष्क्रिय करता है (उन्हें एक सेवा के रूप में चलाता है)। फॉरएवर जैसे अतिरिक्त मॉड्यूल की कोई आवश्यकता नहीं है, क्योंकि यह क्रैश होने पर आपके ऐप को स्वचालित रूप से पुनरारंभ करेगा। इसमें कई विशेषताएं हैं जो आपके सर्वर पर चल रहे विभिन्न अनुप्रयोगों की निगरानी करने में आपकी सहायता करती हैं। यह बहुत बढ़िया है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.