node.js - instalar - node js production server windows
IIS, Node.js y la aplicaciĆ³n web con IISNode no configurados correctamente con el directorio virtual (2)
Tengo la siguiente configuración en IIS:
- Sitio web predeterminado (www.foo.com) sitio html estándar de alojamiento
- Aplicación web debajo del sitio web predeterminado (www.foo.com/bar) con el nodo IIS
- Proyecto de nodo está utilizando expreso
No puedo, por mi vida, configurar esto correctamente, así que cuando presiono la aplicación web, se sirve la aplicación del nodo correctamente. Creo que mi problema radica en el web.config. ¿Alguien puede ayudarme a escribir un web.config correcto para que esto funcione correctamente? La versión actual de mi configuración me servirá una respuesta de nodo que dice que no puede obtener el recurso en cualquier URL que escriba.
Aquí está la versión actual de mi configuración:
<configuration>
<system.webServer>
<handlers>
<add name="iisnode" path="app.js" verb="*" modules="iisnode" />
</handlers>
<rewrite>
<rules>
<rule name="bar">
<match url="bar/*" />
<action type="Rewrite" url="app.js" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Me encontré con este mismo problema .
En definitiva, lo que funcionó fue arreglar la url de solicitud en mi aplicación. Cambiamos de express a hapi, por lo que he convertido este código de hapi a express sin probarlo primero, pero debería ponerlo en el estadio.
app.use(function (req, res, next) {
if(!settings.serverPath) return next();
console.log(req.url);
var regex = new RegExp(''('' + settings.serverPath + '')(/.+)'', "i");
req.url = req.url.replace(regex, "$2");
console.log(req.url);
return reply.continue();
});
//set up your routes here...
Me encontré con el mismo problema hace un tiempo, ejecutando mi aplicación en un directorio virtual.
Después de mucho tiempo perdido y luchando, pude juntar todas las piezas para que mis aplicaciones funcionaran en un directorio virtual, esto incluía aplicaciones usando Socket.io
Como no hay mucha documentación disponible para este escenario en particular y los recursos disponibles, que he encontrado, solo se describe parcialmente cómo resolver este problema. Aquí hay un tutorial sobre cómo hacer que todo esto funcione. Personalmente, tengo varios servicios web Node.js que implementan una API REST o Socket.io usando esta configuración.
Recomiendo utilizar la plantilla Web.config a continuación para que funcione.
Plantilla IISNode Web.config
https://gist.github.com/pbaio/f63918181d8d7f8ee1d2
La configuración en el enlace de arriba tiene algunos comentarios que puse allí para ayudar con la facilidad de uso. Está configurado para usar app.js como el archivo principal, pero si su archivo tiene un nombre diferente, simplemente cambie el valor para usar ese archivo.
Para que esta configuración funcione, necesitará el Módulo de reescritura de URL para IIS si aún no lo tiene instalado.
Configuración por defecto
De forma predeterminada, esta plantilla está configurada para funcionar en una aplicación web estándar que se ejecuta en IIS y no en el entorno de directorio virtual. Sin embargo, con algunos ajustes menores, puede usar este mismo Web.config para ejecutar una aplicación Node.js en un directorio virtual.
Obtenga Express para usar su directorio virtual
IISNode hace que todas las claves se declaren en tus variables de entorno <appSettings>
. Podemos utilizar esto para nuestra ventaja al configurar nuestra ruta de directorio virtual y exponerlo a nuestro archivo principal. En la plantilla de arriba, nuestro archivo principal es app.js
Obtén nuestra ruta de directorio virtual
Necesitamos obtener la ruta desde la que se enrutará nuestra aplicación en nuestro archivo Web.config. Hacemos esto accediendo a nuestras variables de entorno en nuestro objeto de proceso. Agregue la siguiente línea a nuestro archivo app.js
var virtualDirPath = process.env.virtualDirPath || '''';
Esto recupera nuestro VirtualDirPath de nuestro Web.config y le da un valor predeterminado de cadena vacía.
Páginas de enrutamiento
Entonces podemos anteponer el VirtualDirPath a nuestras rutas y si está utilizando un motor de visualización como Jade o EJS podemos pasar nuestra ruta de directorio virtual para hipervínculos y tal a la vista:
var app = require(''express'')();
app.get(virtualDirPath + ''/'', function(req, res) {
res.render(''index'', { virtualDirPath: virtualDirPath });
});
Contenido estático
Podemos servir esto fácilmente de la siguiente manera:
app.use(express.static(path.join(virtualDirPath, ''public'')));
Lo mismo si está utilizando Bower.io:
app.use(''/bower_components'', express.static(path.join(virtualDirPath,''bower_components'')));
Uso de directorios virtuales con Express & Socket.io
Cuando usemos Virtual Directories con Socket.io, necesitamos hacer cambios a la configuración tanto para el Servidor como para el Cliente.
Lado del servidor
Necesitamos configurar nuestro Servidor Socket.io ligeramente diferente de lo que normalmente haría.
var app = require(''express'')();
var virtualDirPath = process.env.virtualDirPath || '''';
var server = require(''http'').Server(app);
var io = require(''socket.io'')(server, { path: virtualDirPath + ''/socket.io'' });
// Get the port that we should be listening on
server.listen(process.env.PORT || 8080);
En el código anterior estamos modificando nuestro servidor Socket.io para que funcione en nuestro virtualDirpath y no en la ruta predeterminada ( ''/socket.io''
es la ruta predeterminada).
Para que IISNode funcione correctamente con socket.io, también debemos agregar algunas URL adicionales para volver a escribir y cambiar nuestro controlador. Dentro del archivo de configuración de plantilla desde arriba, podemos ver el controlador Socket.io en la línea 57, que está comentado en la plantilla.
<add name="iisnode-socket.io" path="app.js" verb="*" modules="iisnode" />
Luego tenemos que agregar nuestra url reescribiendo para las rutas de Socket.io
<rule name="SocketIO" patternSyntax="ECMAScript">
<match url="socket.io.+" />
<action type="Rewrite" url="app.js"/>
</rule>
Lado del cliente
En el lado del cliente solo tenemos que especificar la ruta que está escuchando el servidor Socket.io en lugar de su ruta predeterminada.
var socket = io.connect(''http://example.com:port'', { path: ''/virtualDirPath/socket.io'' });
A esta altura, todo debería ser bueno para ir con su aplicación Socket.io ejecutándose en un directorio virtual con IISNode.
Información del entorno
Las aplicaciones que usan esta configuración se construyeron con Node.js, Express 4.12.3 y se ejecutan en IIS 7.5 con IISNode instalado. Además, al cambiar el controlador en el archivo conifg, Socket.io se puede utilizar también en un directorio virtual. La versión de Socket.io utilizada en el ejemplo anterior era 1.3.5