部署一个使用Nuxt.js构建的应用程序

34 min read

部署一个使用Nuxt.js构建的应用程序

Nuxt.js在构建后会生成一个.output文件夹,其中包含用于生产的服务器端代码

Nuxt.js 3或更高版本该文件夹会包含一个名为index.mjs的模块化JavaScript文件

下面是您可以用来部署Nuxt.js应用程序的步骤:

  1. 确保Nuxt.js应用已经构建。

    npm run build
    
  2. 项目根目录中创建ecosystem.config.mjs

    module.exports = {
      apps: [
        {
          name: 'NuxtAppName',
          port: '3000',
          exec_mode: 'cluster',
          instances: 'max',
          script: './.output/server/index.mjs'
        }
      ]
    }
    
  3. 启动您的应用程序。 使用以下命令来启动或重新启动应用程序:

    pm2 start ecosystem.config.js
    

    或者,如果您已经启动过应用程序并做了更改:

    pm2 reload ecosystem.config.js
    
  4. 保存PM2进程列表。 如果希望在服务器重启后自动重启您的应用程序,请执行:

    pm2 save
    
  5. 设置PM2自启动。 使用PM2的startup命令来生成一个启动脚本:

    pm2 startup
    

    然后根据提示执行生成的命令。

PM2的配置文件解释

PM2的配置文件是用于定义如何运行和管理Node.js应用程序的设置

PM2是一个流行的Node.js应用程序进程管理器,可以用来在生产环境中运行和维护应用程序。下面我会解释这段代码的每个部分:

apps:
apps 是一个数组,其中的每个对象代表一个应用程序的配置。在这个例子中,数组只有一个对象,表示只配置了一个应用程序。

name: 'NuxtAppName':
name 属性用于指定应用程序的名称。这在PM2仪表板或命令行界面中用来标识应用程序。

port: '3000':
port 属性定义了应用程序监听的端口。在这个配置中,应用程序被设置为在端口3000上运行。

xec_mode: 'cluster':
exec_mode 设置应用程序的执行模式。'cluster' 模式允许应用程序在多个CPU核心上运行,提高性能和可用性。这对于提高大型应用程序的效率和容错能力非常有用。

instances: 'max':
instances 属性定义了要启动的应用实例数。'max' 表示PM2会根据可用的CPU核心数自动最大化实例数。这在'cluster'模式下是常见设置。

script: './.output/server/index.mjs':
script 属性指定了应用程序的启动脚本或入口文件。在这个例子中,它指向Nuxt.js构建的服务器端代码,这通常位于.output/server/index.mjs

通过这些步骤,Nuxt.js应用程序应该在服务器上以集群模式运行,使用PM2进行管理。

这会提高可用性和负载均衡,使您的应用程序能够更好地处理大量流量。

如何重启Nuxt.js应用程序服务?

  1. 重启指定的应用程序:
    如果已经知道应用程序的名称(在例子中是 'NuxtAppName'),可以使用以下命令来重启它:

    pm2 restart NuxtAppName
    

    这会停止并重新启动名为 'NuxtAppName' 的应用程序。

  2. 重载应用程序:
    如果想要平滑重启(零停机时间),可以使用重载命令:

    pm2 reload NuxtAppName
    

    重载命令适用于集群模式,它会逐个重启实例,确保服务不会中断。

  3. 重新加载所有应用程序:
    如果在ecosystem.config.js中配置了多个应用程序,可以使用以下命令重新加载所有应用程序:

    pm2 reload all
    

    这会逐个重启所有应用程序,以确保服务连续性。

  4. 重启使用特定配置文件的所有应用程序:
    也可以通过引用配置文件来重启所有相关应用程序。这对于刚刚修改配置文件并希望应用新设置时特别有用:

    pm2 restart ecosystem.config.js
    

使用docker 进行部署

Docker-compose.yaml 文件

version: '3.8'
services:
  nuxt-app:
    build:
      context: .
    ports:
      - "3000:3000"

对应的 dockerfile文件

FROM node:18

WORKDIR /app

COPY package*.json ./

RUN npm install pm2 -g

RUN npm install

COPY . .

RUN npm run build

EXPOSE 3000

CMD ["pm2-runtime", "start", "ecosystem.config.cjs"]