首页 > 其他分享 >NextJS项目的部署以及多环境的实现

NextJS项目的部署以及多环境的实现

时间:2023-07-01 22:34:40浏览次数:52  
标签:部署 环境 next nginx html NextJS proxy ENV build

背景

开发了个Next项目,将部署过程记录一下。另外由于项目准备了两个服务器分别作为开发自测的开发环境和交付给客户的生产环境使用;因此也介绍一下NextJS项目中多环境的配置。

项目结构

计划是让Nginx根据不同的路径前缀决定请求发给哪个后端;而路径前缀则是由Docker打包镜像的时候传递参数给Next App作为环境变量。

部署过程

设置next.config.js

导出静态文件

我们需要Next项目编译后的文件,这需要我们把next.config.js中加上output: "export"设置,这样我们在运行next build命令后,Next会生成一个静态资源文件夹out ,如图:

⚠️注意事项

output: "export" 模式下无法使用rewrites 或者headers 等设置,官方文档列出的完整不支持的功能如下:

设置环境变量

如上文提到,Nginx需要根据不同的路径前缀来决定请求哪个后端,那么就需要前端去判断当前是什么环境再设定当前的请求的路径前缀。

  1. 根据NODE_ENV判断当前环境【已失败】

    计划是当NODE_ENVproduction的时候,请求前缀为/prod;当NODE_ENVdevelopment的时候则为/dev。实施的时候却发现next buildnext start这两条命令都会默认设置NODE_ENVproduction 。因此当我使用cross-env在运行命令时设置NODE_ENVdevelopment就失败了(如图)。

    这么设置,运行npm run dev后获取到的process.env.NODE_ENV还是production

    后来看到有网友说可以通过webpack的DefinePlugin插件来创建全局变量,从而改变环境。参考链接:使用process.env.NODE_ENV的正确姿势

  2. 自定义环境变量

    发现NODE_ENV会被next buildnext start这两条命令修改的时候,我就决定使用别的环境变量来区别本项目的开发环境与生产环境。

    注意,在这里设置的环境变量API是无法在业务代码中直接访问的。如果此时在业务代码中使用process.env.API会得到undefined的值。
    因此我在next.config.js处添加了环境变量的设置,将scripts这里设置的API变量传递给Next项目里,如图:

    使用方式如下:

这样就成功设置好了环境变量,让项目根据不同环境,请求带上不同的前缀。

next.config.js文件配置示例:

const nextConfig = {
  output: "export", // 打包模式
  reactStrictMode: true,
	images: {
     unoptimized: true,
  },
	env: {
    API_PREFIX: process.env.API,
  },
  // async rewrites() {
  //   return [
  //     {
  //       source: "/api/:path*",
  //       destination: "http://domain:8000/:path*",
  //     },
  //   ];
  // }, // 本地调试时使用
};

module.exports = nextConfig;

设置nginx.conf

Nginx的设置没啥特别的,就是根据不同前缀把请求转发到不同服务器上,下面是我用的配置:

server {
    listen       80;
    server_name  localhost;
    gzip         on;

    access_log  /var/log/nginx/host.access.log  main;
    error_log  /var/log/nginx/error.log  error;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri.html /$uri /index.html;
    }

    location /dev/ {
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $http_host;
        proxy_pass http://domain1:8000/;  # 开发环境
    }

    location /prod/ {
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $http_host;
        proxy_pass http://domain2:8000/;   # 生产环境
    }

    # error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

其中要特别注意try_files $uri $uri.html /$uri /index.html; 这条配置。其他前端项目大部分配置的都是try_files $uri $uri/ /index.html; ,但是Next项目比较特殊,观察它打包后的文件可以发现规律,这里不赘述。

配置Dockerfile

这里用的 Dockerfile也没啥特别的,就是把Next项目编译好的静态文件复制到/usr/share/nginx/html,让Nginx进行静态代理,最后启动Nginx。其中我用了ENV参数来区分前端的两个环境,ENV可以有两个值:devprod

使用—build-arg就能传递参数,示例:

docker build --build-arg ENV=dev -t domain/frontend:test-v0.1 .

完整的Dockerfile配置如下:

FROM node:16-alpine as build
ARG ENV
RUN npm config set registry https://registry.npm.taobao.org \
    && npm i npm -g

WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run ${ENV}

FROM nginx:alpine
COPY --from=build /app/out /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
ENTRYPOINT nginx -g "daemon off;"

部署成功

所有部署文件都已经完成了,得到docker镜像后,不管是部署到K8s的集群上面还是自己启动一个docker容器都很简单,在这里就忽略了。最后的部署效果完美地实现了我的目的:开发环境的请求前缀都有/dev,也成功请求到了开发环境的那台后端服务器。

标签:部署,环境,next,nginx,html,NextJS,proxy,ENV,build
From: https://www.cnblogs.com/chrystal/p/17520076.html

相关文章

  • 在 Kubernetes(k8s) 上部署 Spring Boot 应用程序:应用程序使用环境变量中的错误端口属
    如果我使用此配置启动部署(即先启动服务,然后启动部署)则pod在启动期间会失败。在日志中,我可以找到以下消息:***************************APPLICATIONFAILEDTOSTART***************************Description:Bindingtotargetorg.springframework.boot.autoconfigu......
  • goorm php环境安装go 1.20
    1、下载golang最新版本1.20.5,并安装到/usr/local/go目录wgethttps://golang.google.cn/dl/go1.20.5.linux-amd64.tar.gztarzxfgo1.20.5.linux-amd64.tar.gztar-C/usr/local/-xzvfgo1.20.5.linux-amd64.tar.gz 2、创建GOPATH目录mkdir~/.go 3、设置环境变量G......
  • Linux安装JDK并配置环境变量
    一、查询已有JAVA环境版本信息java-version二、下载OracleJDK安装包https://www.oracle.com/java/technologies/downloads/archive/四、安装+配置JDK以下方式适用于安装各版本JDK,本文以JDK1.8为例1、创建一个java目录mkdir-p/home/local/java2、进入目录cd/home/loca......
  • 华为云游戏云端部署方案:如何为游戏厂商降本增效
    华为云游戏云端部署方案,主要提供基础服务将客户游戏服务端部署到云上,并结合华为云平台生态和能力,帮助游戏企业实现业务的快速部署、优良网络覆盖、弹性扩展、安全防护、高效运营和运维。目前华为云的客户包括行业TOP游戏公司、有游戏运营平台的游戏公司、游戏机构联盟等。例如,游戏......
  • 爽游做得好,游戏部署方案必不可少,华为云游戏云端部署方案愈发吃香了
    实时战斗匹配竞技游戏是一种让玩家在同一时间、同一地图上进行对抗的游戏类型,它具有高度的互动性和竞争性,如FPS类、竞速类、MOBA类游戏,人们经常说的CS、“吃鸡”也属于这类,在全球范围内广受欢迎。然而,这种游戏也面临着一些挑战,比如如何保证游戏的流畅性、稳定性和公平性,以及如何......
  • 休闲类匹配竞技游戏公司为何需要华为云游戏云端部署方案?
    休闲类匹配竞技游戏是一种让玩家在短时间内体验快乐和挑战的游戏类型,它通常不需要复杂的操作和策略,只需要简单的点击或滑动就可以进行游戏,比如云顶、炉石等游戏就属于这类型。这种游戏的特点是轻松有趣,适合各种年龄段和喜好的玩家,所以受众非常多。如今,休闲类匹配竞技游戏的市场规模......
  • Python潮流周刊#9:如何在本地部署开源大语言模型?
    你好,我是猫哥。这里每周分享优质的Python及通用技术内容,部分为英文,已在小标题注明。(标题取自其中一则分享,不代表全部内容都是该主题,特此声明。)首发于我的博客:https://pythoncat.top/posts/2023-07-01-weekly周刊的投稿通道已开放,请在Github项目中提交issue:https://github.c......
  • MIT 6.s081 实验环境搭建
    准备工作Linux系统,我是在实验室配的主机上装了DebianBookworm,然后mac通过ssh连接上去进行操作,宿舍里则是使用的wsl2,里面的发行版也是DebianBookworm。开始配置clone源码在~/Documents/code/mit目录下执行gitclonegit://g.csail.mit.edu/xv6-labs-2021,将源码cl......
  • 使用纯 ABAP 开发 SAP UI5 应用(一):abap2UI5 开发环境搭建介绍
    我从SAP社区博客上了解到一个开源项目,名叫abap2UI5,作者是OblomovDev,这是Github项目地址:https://github.com/abap2UI5/abap2UI5这个项目最吸引ABAP开发人员之处在于:传统的ABAP搞定一切:仅仅依靠最基础的传统ABAP编程语言,就可以开发并运行SAPUI5应用。不需要......
  • 部署java的linux服务器远程报错:[USM] Channel request shell failed
    问题部署很多个微服务的linux服务器ssh远程突然进不去,远程工具提示:[USM]Channelrequestshellfailed排查分析因为部署的是很多个java进程,有可能线程数占满导致系统可创建线程耗尽,排查步骤如下:使用非远程方式进入服务器,使用top-H命令查看系统创建的线程数:查看系统允许创......