side - ¿Cómo puedo alojar varios sitios Node.js en la misma IP/servidor con diferentes dominios?
node.js servidor web (11)
Tengo un servidor Linux con una única dirección IP vinculada a él. Quiero alojar varios sitios Node.js en este servidor en esta IP, cada uno (obviamente) con un dominio o subdominio único. Los quiero a todos en el puerto 80.
¿Cuáles son mis opciones para hacer esto?
Una solución obvia parece ser que todos los dominios sean atendidos por una aplicación web de node.js que actúe como un proxy y se transfiera a las otras aplicaciones de node.js que se ejecuten en puertos únicos.
Aquí le indicamos cómo hacerlo usando vanilla 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}`)
})
Bastante simple, ¿eh?
Elige uno de los siguientes:
- Utilice algún otro servidor ( como nginx ) como proxy inverso.
- Utilice node-http-proxy como proxy inverso.
- Utilice el middleware vhost si cada dominio se puede servir desde la misma base de código Connect / Express y node.js.
Esta guide del océano digital es una excelente manera. Utiliza el módulo pm2 que daemoniza tu aplicación (las ejecuta como un servicio). No necesita módulos adicionales como Forever, ya que reiniciará su aplicación automáticamente si se bloquea. Tiene muchas características que lo ayudan a monitorear las diversas aplicaciones que se ejecutan en su servidor. ¡Es bastante impresionante!
Este es mi proyecto de demostración más simple sin ningún middleware o proxy.
Esto requiere solo unos pocos códigos, y es suficiente.
https://github.com/hitokun-s/node-express-multiapp-demo
Con esta estructura, puede configurar y mantener fácilmente cada aplicación de forma independiente.
Espero que esto te sirva de ayuda.
Hm ... por qué crees que nodejs debería actuar como un proxy. Sugeriré ejecutar varias aplicaciones de nodo escuchando en diferentes puertos. Luego use nginx para reenviar la solicitud al puerto correcto. Si usa un solo nodo, también tendrá un único punto de falla. Si esa aplicación falla, todos los sitios bajan.
La mejor manera de hacerlo es usar vhost Middleware de Express. Echa un vistazo a este tutorial para una explicación paso a paso:
http://shamadeh.com/blog/web/nodejs/express/2014/07/20/ExpressMultipleSites.html
Primero instale por forever y bouncy .
Luego escribe un script de inicio. En este script, agregue una regla a la utilidad del servidor de seguridad de iptables para decirle que reenvíe el tráfico en el puerto 80 al puerto 8000 (o cualquier otra cosa que elija). En mi ejemplo, 8000 es donde ejecuto bouncy
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000
Usándolo para siempre, digamos al script que ejecute bouncy en el puerto 8000
forever start --spinSleepTime 10000 /path/to/bouncy /path/to/bouncy/routes.json 8000
Las rutas.json algo como
{
“subdomain1.domain.com" : 5000,
“subdomain2.domain.com" : 5001,
“subdomain3.domain.com" : 5002
}
NodeJS application1, application2 y application3 se ejecutan en los puertos 5000, 5001 y 5002 respectivamente.
El script que uso en mi caso se puede encontrar here y es posible que tenga que cambiar un poco para adaptarse a su entorno.
También escribí sobre esto con más detalle y lo puedes encontrar here .
Si está utilizando el servidor Connect / Express, puede ver el middleware vhost
. Permitirá el uso de múltiples dominios (subdominios) para la dirección del servidor.
Puede seguir el ejemplo dado here , que se ve exactamente como lo que necesita.
Tengo una API que uso en un sitio y a continuación está mi configuración. También lo tengo con SSL y GZIP, si alguien lo necesita, solo comentame.
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);
Utilice nginx como un proxy inverso.
http://www.nginxtips.com/how-to-setup-nginx-as-proxy-for-nodejs/
Nginx ofrece una gran cantidad de beneficios para sus aplicaciones en forma de almacenamiento en caché, manejo de archivos estáticos, ssl y balanceo de carga.
Diet.js tiene una forma muy agradable y sencilla de alojar múltiples dominios con la misma instancia de servidor. Simplemente puede llamar a un nuevo server()
para cada uno de sus dominios.
Un ejemplo simple
// Reuire 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'')
})
Separando sus aplicaciones
Si desea tener diferentes carpetas para sus aplicaciones, entonces podría tener una estructura de carpetas como esta:
/server
/yourApp
/node_modules
index.js
/yourOtherApp
/node_modules
index.js
/node_modules
index.js
En /server/index.js
necesitaría cada aplicación por su carpeta:
require(''./yourApp'')
require(''./yourOtherApp'')
En /server/yourApp/index.js
usted configuraría su primer dominio como:
// Reuire diet
var server = require(''diet'')
// Create app
var app = server()
app.listen(''http://example.com/'')
app.get(''/'', function($){
$.end(''hello world '')
})
Y en /server/yourOtherApp/index.js
configuraría su segundo dominio , como:
// Reuire diet
var server = require(''diet'')
// Create app
var app = server()
app.listen(''http://other.com/'')
app.get(''/'', function($){
$.end(''hello world at other.com '')
});