Nuxt's server is Nitro. It was originally created for Nuxt but is now part of UnJS and open for other frameworks - and can even be used on its own.
Using Nitro gives Nuxt superpowers:
Nitro is internally using h3, a minimal H(TTP) framework built for high performance and portability.
You can easily manage the server-only part of your Nuxt app, from API endpoints to middleware.
Both endpoints and middleware can be defined like this:
export default defineEventHandler(async (event) => {
  // ... Do whatever you want here
})
And you can directly return text, json, html or even a stream.
Out-of-the-box, it supports hot module replacement and auto-import like the other parts of your Nuxt application.
Nitro offers the ability to deploy your Nuxt app anywhere, from a bare metal server to the edge network, with a start time of just a few milliseconds. That's fast!
There are more than 15 presets to build your Nuxt app for different cloud providers and servers, including:
Or for other runtimes:
Nitro has a powerful feature called routeRules which allows you to define a set of rules to customize how each route of your Nuxt app is rendered (and more).
export default defineNuxtConfig({
  routeRules: {
    // Generated at build time for SEO purpose
    '/': { prerender: true },
    // Cached for 1 hour
    '/api/*': { cache: { maxAge: 60 * 60 } },
    // Redirection to avoid 404
    '/old-page': {
      redirect: { to: '/new-page', statusCode: 302 },
    },
    // ...
  },
})
In addition, there are some route rules (for example, ssr, appMiddleware, and noScripts) that are Nuxt specific to change the behavior when rendering your pages to HTML.
Some route rules (appMiddleware, redirect and prerender) also affect client-side behavior.
Nitro is used to build the app for server side rendering, as well as pre-rendering.