Next.js项目部署,使用Nginx和pm2

news2024/9/28 17:35:07

概述

请添加图片描述
只有一台服务器,所以上图服务都都在一个云服务器上。其中Nginx 分别在用户和Next服务之间代理、在Next和后台之间代理。

常规的前台页面不需要这样做,例如Vue中直接把build之后的dist文件拷贝到nginxhtml目录并配置nginx指向即可,但是Next可以做到服务端渲染(SSR)所以Next的前台页面实际上是一个nodejs服务,所以nginx在这里是代理用户请求,proxy_pass到这个nodejs服务上。
而前后台之间的nginx代理属于反向代理,一般也通过proxy_passrewrite路径进行代理,我没配置这个。

Next.js配置

在需要SSRpage中需要添加 getStaticPropsgetStaticProps这些function只能写在page文件夹中,不可以在components中用),注意可以设置revalidate定时重新build页面,这样页面也可以定期更新,如下:


export async function getStaticProps() {
	//后台取数据
    const result = await queryTimelineList()
    // console.log(result)
    return {
        props: {
            timelineData: result.data,
        },
        // 重新绘制页面时长 1200 ,单位秒
        revalidate: 1200
    };
}

另外,注意在动态路由的page中,需要设置fallbacktrue,且页面中要增加对fallbackfalse的处理,否则build的时候会报错,如下 一个名为 [postId].js的page:

const PostId = ({postId, postDetail, recentPosts,curTags}) => {


    const router = useRouter()
	// 注意,这里要处理
    if (router.isFallback) {
        return <div>Loading...</div>
    }
    ...
}


// Fetch data at build time
export async function getStaticProps(context) {
    const postId = context.params.postId

    const
        [postDetailResult,
            recentPostsResult,
            curPostTagsResult] = await Promise.all([
                queryPostDetailByPostId(postId),
                queryRecentPostList(),
                queryTagListByPostId(postId)
            ]
        )
    return {
        props: {
            postId: postId,
            postDetail: postDetailResult?.data,
            recentPosts: recentPostsResult?.data,
            curTags: curPostTagsResult?.data
        },
        revalidate: 300
    };
}

// Specify dynamic routes to pre-render pages based on data.
// The HTML is generated at build time and will be reused on each request.
export async function getStaticPaths() {
    const postIdsResult = await queryPostIdList();
    const postIdList = postIdsResult.data

    return {
        paths: postIdList.map((postId) => {
        	// 这里如果传的是数字会报错,必须转为字符串
            return {params: {postId: postId.toString()}}
        }),
        // 设置为true
        fallback: true,
    };
}

Nginx配置

完整的nginx.conf配置文件如下:


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    

    # HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  btyhub.site, www.btyhub.site;
		# ssl两个文件,放在 nginx的conf目录中
        ssl_certificate      btyhub.site_bundle.pem;
        ssl_certificate_key  btyhub.site.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
		# 代理到Next的服务,默认3000端口,也可以在start的时候指定
        location / {
            proxy_pass    http://127.0.0.1:3000/;
        }
		
    }
    # 监听普通http请求,重写至https
	server{
		listen 80;
		server_name btyhub.site, www.btyhub.site;
		rewrite ^(.*)$ https://www.btyhub.site:443/$1 permanent;
	}

}

pm2启动

ps:除了使用pm2启动Next服务外,也可以npm run build之后直接nohup npm run start
pm2官网文档

首先要安装node环境,安装完了将命令添加到全局bin中:

# /usr/local/node是我的node安装目录
ln -s /usr/local/node/bin/npm /usr/local/bin/
ln -s /usr/local/node/bin/npx /usr/local/bin/
ln -s /usr/local/node/bin/node /usr/local/bin/

其次,全局安装pm2 并加入全局bin:

npm install -g pm2
ln -s /usr/local/node/bin/pm2 /usr/local/bin/

测试,是否安装成功:

pm2 -version

运行next服务

  1. 需要将项目源文件上传至云服务器:
    在这里插入图片描述

  2. 运行npm run build

  3. 运行pm2 start --name yourappname npm -- start

后记:
域名配置完要隔几天才可以给网站备案,备案之后才可以通过域名访问,在这之前可以先用ip地址测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue的底层原理

如何追踪变化 当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项&#xff0c;Vue 将遍历此对象所有的 property&#xff0c;并使用 Object.defineProperty 把这些 property 全部转为 getter/setter。 这些 getter/setter 对用户来说是不可见的&#xff0c;但是在…

RK3588平台开发系列讲解(GPIO篇)配置GPIO需要了解的概念

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、 GPIO(通⽤输⼊输出)二、IOMUX(输⼊输出复⽤)三、PULL(端口上下拉)四、DRIVE-STRENGTH(端口驱动强度)五、 SMT(端口斯密特触发器)沉淀、分享、成长,让自己和他人都能有所收获!😄 …

SAP Gateway 在开发系统和生产系统上的缓存控制

SAP Gateway 元数据缓存可以启用和禁用&#xff0c;并且在非生产系统中默认停用。 我们推荐以下缓存设置&#xff1a; 开发系统 应该禁用 SAP Gateway 元数据缓存&#xff0c;以便始终获取最新的元数据&#xff08;默认设置&#xff09;。 OData 通道应用程序应在其模型提供…

UNIAPP实战项目笔记53 登录的前端和后端nodejs对接以及写后端接口和接口文档

UNIAPP实战项目笔记53 登录的前端和后端对接以及写后端接口和接口文档 实际案例图片 输入手机号或用户名登录页面 代码 login.vue页面 <template><view class"login"><swiper vertical"true" style"height: 100vh;"><swi…

VIM编辑器初学者用法指南——vim中无法使用冒号更改Ubuntu的输入法解决

VIM编辑器初学者用法指南一、vim打开文件&#xff1a;二、vim编辑文件&#xff1a;三、退出编辑模式四、保存文件并退出Vim编辑器Vim编辑器是Unix系统最初的编辑器&#xff0c;内置有两种操作模式:普通模式和插入模式。 普通模式&#xff1a;执行非内容编辑类的保存、退出等指令…

基于JAVA和MYSQL的图书馆座位管理系统的设计与开发

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 11-11管理员功能模块 公告管理&#xff1a;可以对馆内开放时间、意外情况或者其他安排在网上进行发布公告&#xff0c;也…

【Redis-10】Redis集群的实现原理(Redis Cluster)

Redis集群是Redis提供的分布式数据库方案&#xff0c;通过分片来进行数据共享&#xff0c;实现复制和故障转移的功能。 1. Redis集群节点 一个Redis集群由多个节点组成&#xff0c;多个节点通过命令连接&#xff0c;由独立状态转为集群状态&#xff0c;命令是cluster meet <…

C51——电动车简易防盗系统

这是电动车简易报警器信号电路 #include "reg52.h" sbit switcher P1^1; sbit D0_ON P1^2; sbit D1_OFF P1^3; sbit vibrator P1^4; void Delay3000ms() //11.0592MHz { unsigned char i, j, k; //_nop_(); i 22; j 3; k 227; …

生物素-双硫键-叠氮化物Biotin-SS-Azide CAS1620523-64-9 简介

名称&#xff1a;Biotin-SS-azide Azide-SS-biotin Azide-C2-SS-C2-biotin 是一种可降解 (cleavable) 的 ADC linker&#xff0c;可用于合成抗体偶联药物(ADC)。叠氮化物-SS-生物素是一种可裂解的生物素化试剂&#xff0c;用于使用点击化学标记含炔烃的生物分子。叠氮基与炔烃…

Mycat(2):mysql的集群搭建

MyCat的环境演示需要使用mysql集群 &#xff0c;下面先搭建mysql的环境 1 集群搭建概述 1.1 是什么 集群&#xff08;cluster&#xff09;技术是一种较新的技术&#xff0c;通过集群技术&#xff0c;可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收…

记一次新装的SQLServer本地无法访问的处理过程

本机新装的SQL Server连接不上, 首先尝试使用 计算机名\实例名 Windows 身份验证 的形式登录, 例如:Dell-WorkCenter\MSSQL2017 如果使用 计算机名\实例名 的形式可以登录, 但使用127.0.0.1或者本机IP地址无法登录的话, 有可能是Named Pipes 与 TCP/IP 协议没有启用, 开…

图书馆借阅数据分析系统设计与实现

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于图书馆、帮助信息、图书资讯、图书类型、图书信息 管理员&#xff1a; 1、管理&#xff1a;关…

大数据- 初探MapReduce

一、MapReduce编程实例——词频统计实现 启动hadoop服务 1、准备数据文件 &#xff08;1&#xff09;在虚拟机上创建文本文件 创建wordcount目录&#xff0c;在里面创建words.txt文件 &#xff08;2&#xff09;上传文件到HDFS指定目录 创建/wordcount/input目录&#…

设计模式之桥接模式

bridge design pattern 桥接模式的概念、桥接模式的结构、桥接模式的优缺点、桥接模式的使用场景、桥接模式的实现示例、桥接模式的源码分析 1、桥接模式的概念 桥接模式&#xff0c;即将抽象和实现分离&#xff0c;使他们可以独立变化。它是用组合关系来代替继承关系实现的&a…

赫夫曼树 | 实战演练

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

关于动漫的HTML网页设计:期末前端web大作业——海贼王基地(6个页面)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

QT—5种标准对话框使用详解

对话框是 GUI 程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者简洁的用户交互。所谓标准对话框&#xff0c;是 Qt 内置的一系列对话框&#xff…

kafka问题总结

kafka问题总结【1】Kafka 都有哪些特点&#xff1f;【2】为什么要使用 kafka&#xff0c;为什么要使用消息队列&#xff1f;【2】kafka的使用场景【3】Kafka 的设计架构【4】kafka分区的目的【5】Kafka 是如何做到消息的有序性&#xff1f;【6】Kafka 的高可靠性是怎么实现的&a…

【操作系统-总论】发展历程、体系结构、虚拟机

文章目录1 操作系统的发展历程1.1 手工操作阶段1.2 批处理阶段1.2.1 单道批处理系统&#xff08;单道程序系统&#xff09;1.2.2 多道批处理系统&#xff08;多道程序系统&#xff09;1.3 分时操作系统1.4 实时操作系统2 操作系统的体系结构3 虚拟机1 操作系统的发展历程 1.1 …

Nginx教程(3)—负载均衡

文章目录3.1 负载均衡-轮询3.2 负载均衡-加权轮询3.3 upstream指令参数3.4 使用JMeter测试集群3.5 负载均衡之IP_hash3.6 一致性hash算法3.7 Nginx控制浏览器缓存3.8 Nginx反向代理缓存Nginx教程一 Nginx教程二 3.1 负载均衡-轮询 轮询是Nginx默认使用的策略&#xff0c;轮询算…