Learn Nuxt with a Collection of 100+ Tips!

Deployment

Learn how to deploy your Nuxt application to any hosting provider.

A Nuxt application can be deployed on a Node.js server, pre-rendered for static hosting, or deployed to serverless or edge (CDN) environments.

If you are looking for a list of cloud providers that support Nuxt 3, see the Hosting providers section.

Node.js Server

Discover the Node.js server preset with Nitro to deploy on any Node hosting.

  • Default output format if none is specified or auto-detected
  • Loads only the required chunks to render the request for optimal cold start timing
  • Useful for deploying Nuxt apps to any Node.js hosting

Entry Point

When running nuxt build with the Node server preset, the result will be an entry point that launches a ready-to-run Node server.

Terminal
node .output/server/index.mjs

This will launch your production Nuxt server that listens on port 3000 by default.

It respects the following runtime environment variables:

  • NITRO_PORT or PORT (defaults to 3000)
  • NITRO_HOST or HOST (defaults to '0.0.0.0')
  • NITRO_SSL_CERT and NITRO_SSL_KEY - if both are present, this will launch the server in HTTPS mode. In the vast majority of cases, this should not be used other than for testing, and the Nitro server should be run behind a reverse proxy like nginx or Cloudflare which terminates SSL.

PM2

PM2 (Process Manager 2) is a fast and easy solution for hosting your Nuxt application on your server or VM.

To use pm2, use an ecosystem.config.cjs:

ecosystem.config.cjs
module.exports = {
  apps: [
    {
      name: 'NuxtAppName',
      port: '3000',
      exec_mode: 'cluster',
      instances: 'max',
      script: './.output/server/index.mjs'
    }
  ]
}

Cluster Mode

You can use NITRO_PRESET=node_cluster in order to leverage multi-process performance using Node.js cluster module.

By default, the workload gets distributed to the workers with the round robin strategy.

Learn More

Read more in the Nitro documentation for node-server preset.

Static Hosting

There are two ways to deploy a Nuxt application to any static hosting services:

  • Static site generation (SSG) with ssr: true pre-renders routes of your application at build time. (This is the default behavior when running nuxi generate.) It will also generate /200.html and /404.html single-page app fallback pages, which can render dynamic routes or 404 errors on the client (though you may need to configure this on your static host).
  • Alternatively, you can prerender your site with ssr: false (static single-page app). This will produce HTML pages with an empty <div id="__nuxt"></div> where your Vue app would normally be rendered. You will lose many SEO benefits of prerendering your site, so it is suggested instead to use <ClientOnly> to wrap the portions of your site that cannot be server rendered (if any).
Read more in Nuxt prerendering.

Client-side Only Rendering

If you don't want to pre-render your routes, another way of using static hosting is to set the ssr property to false in the nuxt.config file. The nuxi generate command will then output an .output/public/index.html entrypoint and JavaScript bundles like a classic client-side Vue.js application.

nuxt.config.ts
export default 
defineNuxtConfig
({
ssr
: false
})

Hosting Providers

Nuxt can be deployed to several cloud providers with a minimal amount of configuration:

Read more in Deploy.

Presets

In addition to Node.js servers and static hosting services, a Nuxt project can be deployed with several well-tested presets and minimal amount of configuration.

You can explicitly set the desired preset in the nuxt.config.ts file:

nuxt.config.ts
export default 
defineNuxtConfig
({
nitro
: {
preset
: 'node-server'
} })

... or use the NITRO_PRESET environment variable when running nuxt build:

Terminal
NITRO_PRESET=node-server nuxt build

🔎 Check the Nitro deployment for all possible deployment presets and providers.

CDN Proxy

In most cases, Nuxt can work with third-party content that is not generated or created by Nuxt itself. But sometimes such content can cause problems, especially Cloudflare's "Minification and Security Options".

Accordingly, you should make sure that the following options are unchecked / disabled in Cloudflare. Otherwise, unnecessary re-rendering or hydration errors could impact your production application.

  1. Speed > Optimization > Content Optimization > Auto Minify: Uncheck JavaScript, CSS and HTML
  2. Speed > Optimization > Content Optimization > Disable "Rocket Loader™"
  3. Speed > Optimization > Image Optimization > Disable "Mirage"
  4. Scrape Shield > Disable "Email Address Obfuscation"

With these settings, you can be sure that Cloudflare won't inject scripts into your Nuxt application that may cause unwanted side effects.

Their location on the Cloudflare dashboard sometimes changes so don't hesitate to look around.