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

 更新时间:2023年05月23日 16:06:46   作者:T.Y.Bao  
本文主要介绍了使用Nginx和pm2部署Next.js项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

概述

只有一台服务器,所以上图服务都都在一个云服务器上。其中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://$host$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服务

需要将项目源文件上传至云服务器:

运行npm run build

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

后记:

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

到此这篇关于使用Nginx和pm2部署Next.js项目的文章就介绍到这了,更多相关Nginx和pm2部署Next.js内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx的反向代理实例详解

    Nginx的反向代理实例详解

    这篇文章主要介绍了Nginx的反向代理实例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 浅谈Nginx七层反向代理和负载均衡

    浅谈Nginx七层反向代理和负载均衡

    这篇文章主要介绍了浅谈Nginx七层反向代理和负载均衡,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 利用nginx+lua+redis实现反向代理方法教程

    利用nginx+lua+redis实现反向代理方法教程

    这篇文章主要给大家介绍了利用nginx+lua+redis实现反向代理方法教程,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • nginx 负载均衡轮询方式配置详解

    nginx 负载均衡轮询方式配置详解

    负载均衡(load-balance)就是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验,本文给大家介绍nginx 负载均衡轮询方式配置,感兴趣的朋友一起看看吧
    2022-03-03
  • 编写Go程序对Nginx服务器进行性能测试的方法

    编写Go程序对Nginx服务器进行性能测试的方法

    这篇文章主要介绍了编写Go程序对Nginx服务器进行性能测试的方法,包括对其负载均衡和缓存等方面的测试,极力推荐!需要的朋友可以参考下
    2015-06-06
  • nginx 平滑重启与升级的实现方法

    nginx 平滑重启与升级的实现方法

    有时候我们需要平滑重启nginx服务,防止出现问题,这里简单的总结,方便需要的朋友
    2013-02-02
  • SQL操作Pandas DataFrame的三种方式示例详解

    SQL操作Pandas DataFrame的三种方式示例详解

    这篇文章主要为大家介绍了SQL操作Pandas DataFrame的三种方式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Nginx反向代理一个80端口下配置多个微信项目详解

    Nginx反向代理一个80端口下配置多个微信项目详解

    这篇文章主要介绍了Nginx反向代理一个80端口下配置多个微信项目详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • Nginx配置文件详解以及优化建议指南

    Nginx配置文件详解以及优化建议指南

    Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势,下面这篇文章主要给大家介绍了关于Nginx配置文件详解以及优化的相关资料,需要的朋友可以参考下
    2021-09-09
  • nginx中(13: Permission denied)权限问题的解决办法

    nginx中(13: Permission denied)权限问题的解决办法

    "nginx 13: Permission denied" 错误通常表示nginx进程没有足够的权限来访问特定的文件或目录,本文就来介绍一下解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09

最新评论