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

计划是让Nginx根据不同的路径前缀决定请求发给哪个后端;而路径前缀则是由Docker打包镜像的时候传递参数给Next App作为环境变量。
部署过程
设置next.config.js
导出静态文件
我们需要Next项目编译后的文件,这需要我们把next.config.js中加上output: "export"设置,这样我们在运行next build命令后,Next会生成一个静态资源文件夹out ,如图:

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

设置环境变量
如上文提到,Nginx需要根据不同的路径前缀来决定请求哪个后端,那么就需要前端去判断当前是什么环境再设定当前的请求的路径前缀。
根据NODE_ENV判断当前环境【已失败】
计划是当
NODE_ENV为production的时候,请求前缀为/prod;当NODE_ENV为development的时候则为/dev。实施的时候却发现next build和next start这两条命令都会默认设置NODE_ENV为production。因此当我使用cross-env在运行命令时设置NODE_ENV为development就失败了(如图)。

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

后来看到有网友说可以通过webpack的DefinePlugin插件来创建全局变量,从而改变环境。参考链接:使用process.env.NODE_ENV的正确姿势
自定义环境变量
发现NODE_ENV会被
next build和next 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可以有两个值:dev和prod。
使用—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,也成功请求到了开发环境的那台后端服务器。

NextJS项目的部署以及多环境的实现的更多相关文章
- java项目部署在服务器环境配置以及命令的编写
在往项目上部署java项目(即打成的jar包),要为相应的项目配置环境变量,即项目运行所需要的jar或其他第三方的jar包,java -cp derivativeAccording.jar:lib/c ...
- Tomcat热部署:Maven项目一键部署到Tomcat服务器 - 支持多环境
参考:Eclipse中的Maven项目一键部署到Tomcat服务器 - 支持多环境部署 命令 debug模式设置关联源码 eclipse --> 项目右键 --> Debug As --& ...
- 项目部署到liunx环境下访问接口返回异常
1.访问接口返回异常 已经连续踩了两次这个坑了.所以记下来了.方便下次搜索! 项目在window下运行正常,无任何异常! 但是部署到liunx环境下的服务器上就有问题 访问静态页面毫无问题,一旦涉及到 ...
- 国产中标麒麟Linux部署dotnet core 环境并运行项目 (三) 部署运行WEB API项目
部署dotnet Core Web API 上一步的文章,是我们公司最核心的一个ORM组件,在中标麒麟系统完成了一个插入数据的任务,这一步是将正式的从dot net framework 迁移到 dot ...
- 国产中标麒麟Linux部署dotnet core 环境并运行项目 (一) 安装dotnet core
背景 根据我之前写的文章 将 Net 项目升级 Core项目经验:(一)迁移Net项目为Net Core\Standard项目,我们将公司内部最核心的ORM框架迁移到net core 上面,并在win ...
- maven项目打包部署到虚拟机测试和生产环境上及查看日志操作
调试通过后提交代码到gitlab,打包部署到相应环境(测试或生产环境)步骤一样1.打包在要打包的项目上右键run as maven clean 清除原来的包,然后run as maven instal ...
- itellij idea导入web项目并部署到tomcat
概述 主要分为项目配置和tomcat配置两大步骤. 一.项目配置 打开idea,选择导入项 选择将要打开的项目路径后,继续选择项目的原本类型(后续引导设置会根据原本的项目类型更新成idea的项目),此 ...
- Greenplum 数据库安装部署(生产环境)
Greenplum 数据库安装部署(生产环境) 硬件配置: 16 台 IBM X3650, 节点配置:CPU 2 * 8core,内存 128GB,硬盘 16 * 900GB,万兆网卡. 万兆交换机. ...
- Eclipse中的Web项目自动部署到Tomcat
原因 很长时间没用Eclipse了,近期由于又要用它做个简单的JSP项目,又要重新学习了,虽然熟悉的很快,但记忆总是很模糊,偶尔犯错,以前很少写博客,现在感觉还是很有必要的,编程中每个人对于犯过的错误 ...
- 项目分布式部署那些事(2):基于OCS(Memcached)的Session共享方案
在不久之前发布了一篇"项目分布式部署那些事(1):ONS消息队列.基于Redis的Session共享,开源共享",因为一些问题我们使用了阿里云的OCS,下面就来简单的介绍和分享下相 ...
随机推荐
- [NotePad++]NotePad++实用技巧
2 应用技巧 2.1 匹配并捕获/截取 截取第1列的数据 截取前 "(.*)", "(.*)", "(.*)"\)\); 截取后: 2.2 ...
- linux 给lvm磁盘扩容
目录 linux 给lvm磁盘扩容 扩容步骤 确认可用空间 创建新的物理卷 将物理卷添加到现有的卷组中 扩展逻辑卷 linux 给lvm磁盘扩容 早上到公司发现磁盘满了,挂载点是一个lvm 跟领导确认 ...
- ORA-17629: Cannot connect to the remote database server
rman远程连接目标库,提示报错ORA-17629: Cannot connect to the remote database server,首先排查网络问题是否通路,结果发现目标端防火墙是开着的, ...
- 部署:keepalived-1.3.5+MHA部署mysql集群
MHA: MHA工作原理总结为以下几条: 从宕机崩溃的master保存二进制日志事件(binlog events): 识别含有最新更新的slave: 应用差异的中继日志(relay log)到其他sl ...
- MySQL(七)索引
索引的数据结构 1 为什么使用索引 索引概述 索引(Index)是帮助MySQL高效获取数据的数据结构.是"排好序的快速查找结构",满足特定的查找算法 索引是在存储引擎中实现的,每 ...
- vue项目webpack打包
之前一篇随笔写到vue多环境打包环境配置:https://www.cnblogs.com/shun1015/p/13411636.html 1.区分vue脚手架版本,版本不同,项目结构不同,多环境变量 ...
- Vue实战案例
Vue项目案例 结合之前学习的 vue.js.脚手架.vuex.vue-router.axios.elementui 等知识点,来开发前端项目案例(仅前端不含后端). 1.项目搭建 其实就是将我们项目 ...
- 文章学习:TPRE:分布式门限代理重加密
学习文章:TPRE:分布式门限代理重加密 前言 成方金科新技术实验室与隐语团队合作,构建了"基于国密的分布式门限代理重加密算法TPRE",为用户提供了一种安全.高效.自主可控的数据 ...
- 【解决方法】白嫖利用WPS自带C盘清理大师,清理C盘空间,自测清理19.5G空间,太感人了!
环境: 工具:WPS-WPS清理大师 系统版本:Windows 10 问题描述: 描述:本人C盘常年不足10G,也用过一些其他的清理工具,但是也不懂,不敢乱删除东西.一直得过且过. 由于C盘中有很多的 ...
- 金三银四好像消失了,IT行业何时复苏!
疫情时候不敢离职,以为熬过来疫情了,行情会好一些,可是疫情结束了,反而行情更差了, 这是要哪样 我心中不由一万个 草泥 路过 我心中不惊有了很多疑惑和感叹 接着上一篇 一个28岁程序员入行自述和感受 ...