Para subir una aplicación de Next en el IIS, puedes seguir estos pasos:
1- Instalar los siguientes módulos
IIS NODE
https://github.com/Azure/iisnode/releases/tag/v0.2.26
URL REWRITE
https://www.iis.net/downloads/microsoft/url-rewrite
Application Request Routing
https://www.iis.net/downloads/microsoft/application-request-routing
2- Crear una carpeta en tu disco C y pasar lo siguiente:
La carpeta .next que la obtienes al hacer npm run build.
La carpeta public
los node_modules
3- Crea un archivo server.js en tu carpeta con la siguiente información.
const { createServer } = require("http");
const { parse } = require("url");
const next = require("next");
const dev = process.env.NODE_ENV !== "production";
const port = process.env.PORT ;
const hostname = "localhost";
const app = next({ dev, hostname, port });
const handle = app.getRequestHandler();
app.prepare().then(() => {
createServer(async (req, res) => {
try {
const parsedUrl = parse(req.url, true);
const { pathname, query } = parsedUrl;
if (pathname === "/a") {
await app.render(req, res, "/a", query);
} else if (pathname === "/b") {
await app.render(req, res, "/b", query);
} else {
await handle(req, res, parsedUrl);
}
} catch (err) {
console.error("Error occurred handling", req.url, err);
res.statusCode = 500;
res.end("internal server error");
}
})
.once("error", (err) => {
console.error(err);
process.exit(1);
})
.listen(port, async () => {
console.log(`> Ready on http://localhost:${port}`);
});
});
4- Configuración en el IIS
Verificamos si tenemos instalados nuestros módulos; eso lo hacemos dando click en nuestro servidor del IIS.
Luego damos clic en módulos para ver el IIS NODE.
Luego de eso seleccionamos delegación de características.
y verificamos que las asignaciones de controlador estén en lectura y escritura.
luego creamos nuestro sitio web en el IIS y referenciamos la carpeta que creamos, damos click en el sitio web y entramos en asignaciones de controlador
una vez dentro le damos click en agregar asignaciones de modulo, en Ruta de acceso de solicitud ponemos el nombre del archivo js en este caso "server.js", en modulo seleccionamos iisnode y en nombre colocamos iisnode.
Le damos en aceptar; esto nos creará un archivo de configuración en nuestra carpeta llamado "web". Lo abrimos y colocamos esto:
<!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
<rule name="StaticContent">
<action type="Rewrite" url="public{REQUEST_URI}"/>
</rule>
<!-- All other URLs are mapped to the node.js site entry point -->
<rule name="DynamicContent">
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
</conditions>
<action type="Rewrite" url="server.js"/>
</rule>
</rules>
</rewrite>
<!-- 'bin' directory has no special meaning in node.js and apps can be placed in it -->
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules"/>
</hiddenSegments>
</requestFiltering>
</security>
<!-- Make sure error responses are left untouched -->
<httpErrors existingResponse="PassThrough" />
<iisnode node_env="production"/>
<!--
You can control how Node is hosted within IIS using the following options:
* watchedFiles: semi-colon separated list of files that will be watched for changes to restart the server
* node_env: will be propagated to node as NODE_ENV environment variable
* debuggingEnabled - controls whether the built-in debugger is enabled
See https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config for a full list of options
-->
<!--<iisnode watchedFiles="web.config;*.js"/>-->
</system.webServer>
Detenemos nuestro sitio en el IIS actualizamos y subimos el sitio.