百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Next.js +Egg.js+React项目服务器部署详解

liuian 2025-02-20 16:44 25 浏览

原文:zhuxin.club/

原文:zhuxin.club/

1. 项目结构

blog:

博客项目前端工程,所用技术栈为Next.js + React Hooks + Antd + Axios。

service:

博客项目后端服务,所用技术栈为Egg.js。

admin:

博客后台管理系统,所用技术栈为Create-React-App + React Hooks + Antd + Axios。

files:

博客所用静态资源存放目录(如上传的图片等文件)。

2. 部署前准备

2.1 购买云服务器

去阿里云(下面以阿里云为例),腾讯云等云服务平台购买云服务器ECS。具体购买配置根据自己的项目规模大小而定。一般来讲,对于个人项目1核CPU,2G内存,1M带宽的配置基本足够。

购买成功后你会获得一个服务器实例和对应的公网ip(你的服务器ip地址)。现在的网站其实都是在我们输入网址后进行了DNS域名解析后,也就是转到对应的公网ip后才访问到的。

2.2 购买注册域名

依然是去阿里云,腾讯云或其他可购买域名的地方去挑选一个可用的域名并购买。域名购买后须进行实名认证,域名解析(将公网ip绑定到你的域名上),网站域名ICP备案以及公安联网备案等操作,具体参照域名购买平台的使用和备案指导进行操作。

只有完成了网站域名ICP备案才可使域名能访问到对应的公网ip即你的网站可被大众访问到。

网站域名备案审核一般耗时较长(10-30天不等),可等待同时先进行项目部署,而后域名申请下来后再进行部分配置修改即可。

关于域名的补充说明:

?

以www.baidu.com为例,严格来说baidu.com才叫做域名(全球唯一),域名与服务器的公网ip是一对一绑定的。而www只是一个主机名,一个域名可以有多个主机,比如zhidao.baidu.com,tieba.baidu.com。

?

3. 服务器环境搭建

3.1 连接服务器

在windows系统上我们使用Xshell(linux系统命令行操作工具)来连接服务器,通过输入自己的公网ip和服务器实例密码新建连接会话。如下图所示:

成功连接服务器后,来到服务器的命令行操作模式(一般默认是进入到root目录下)。

3.2 环境搭建

3.2.1 Mysql数据库

由于博客项目本地开发时使用的数据库就是egg-mysql插件,所以我们需要配置mysql数据库:

1:安装mysql:

sudo?dnf?install?@mysql

2:设置mysql开机自启动:

sudo?systemctl?enable?--now?mysqld

3:mysql密码及安全一系列设置命令:

sudo?mysql_secure_installation

注意:这里设置是否允许root远程登录时建议选no(输入n)以便于我们可能远程操作mysql。


4:进行本机登录mysql:

mysql?-uroot?-p

然后输入密码即可进入msql操作环境。

5:mysql重启:

sudo?systemctl?restart?mysqld

6:mysql数据库表从sql文件导入:

先通过use 数据库名切换数据库,然后通过以下命令:

source?sql文件绝对地址

即可导入我们本地数据库结构和数据到服务器的mysql中,其中sql文件绝对地址可通过pwd来获取。ps:sql文件我们可以在本地通过使用navicat工具进行导出生成然后传到服务器中。

3.2.2 安装Node环境

由于我们的博客项目都是基于node环境开发和运行的,所以我们需要在linux服务器中安装node。

1:安装nvm:

NVM (Node Version Manager) 是一个 管理node的bash 脚本,它允许你管理多个 Node.js 版本。通过 NVM,你可以安装或者卸载任何你想要使用或者测试的 Node.js 版本。使用以下命令安装nvm。注意不要用sudo,因为这会让 root 用户启用这个脚本。

curl?-o-?https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.0/install.sh?|?bash

2:安装node:

nvm?install?node或nvm?install?node版本号

可多次执行安装多个版本的node,并通过nvm ls来查看已安装node版本,如下图所示:

带箭头的那一行,是当前 shell 会话中使用的 Node.js 版本。default为当你打开新的 shell 会话时默认的 Node.js 版本。

3:切换当前node版本:

nvm use 版本号

如?nvm?use?v14.13.1

4:切换node默认版本:

nvm?alias?default?版本号
如?nvm?alias?default?v14.13.1

安装并设置node版本后,即可像windows环境下一样使用npm和node的功能

3.2.3 安装PM2

PM2 是一个带有负载均衡功能的 Node 应用进程管理器。可后台运行,它主要被用来守护node进程。我们将在后面运行项目时用到它,到时候再详细说明。安装node后使用以下命令安装pm2:

npm?install?pm2?-g

3.2.4 安装Nginx

Nginx 是一个高性能的HTTP和反向代理web服务器,我们常用它来进行项目进程端口监听,接口代理转发和服务器静态资源路径的相关配置。后续项目运行配置时再详细说明。使用以下命令安装Nginx:sudo yum install nginx

4. 项目部署

4.1 代码上传

我们使用Xftp工具来主要进行服务器与本地的文件传输和编辑操作。与Xshell类似,通过输入公网ip和实例密码来新建链接会话,如下图所示:

然后我们可以将自己的项目代码的文件夹从本地传输到服务器目录中任一路径(建议不要放在root目录下,可能会存在一些文件权限问题)。

由于我们之前项目代码都是基于本地开发环境编写的,一些配置的连接ip端口(如数据库,后端服务)基本都是localhost:xxxx这样的。

所以在代码上传服务器前,我们可以在代码里合适位置新建一个专门的ip端口配置的js文件并export出去,然后通过判断当前代码环境(线上或开发)来进行不同的ip端口配置。然后在需要引用到ip端口的地方直接引入即可,不用再像开发环境时写死成localhost了。

4.2 运行项目

在运行项目之前,先确保各个项目的node_modules依赖是否成功安装完成。

4.2.1 运行blog

回到xshell中,进入到blog文件夹(前端工程目录)下,这时使用上面安装的PM2来启动并守护项目进程。为什么要使用PM2来而不是项目中原有配置的script命令来控制项目运行?

因为使用原有script命令启动后,当我们断掉与服务器的连接后,进程都会被销毁。

这样的话,要保持网站一直可被访问岂不是要我们电脑时刻都要开着并且连接着服务器?显然这很不合理!而使用PM2启动来守护进程正是为了解决这种问题的。PM2常用命令如下:

1:创建启动并守护一个node项目进程:

pm2?start?npm?--name?自定义进程名?--?run?start

注意:只要新建一个进程并命名后,它就会永久保存在可用进程的列表中,除非你删掉它。

2:查看所有创建过的进程信息:

pm2?list

3:查看指定进程的详细信息:

pm2?show?进程id

其中进程id为创建新进程时生成的唯一标识,可通过pm2 list查询。

4:启动全部/指定的已创建的进程:

pm2?start?all
pm2?start?进程id

5:重启全部/指定的已创建的,正在运行的进程:

pm2?reload?all
pm2?reload?进程id

6:删除全部/指定的已创建的进程:

pm2?delete?all
pm2?delete?进程id

7:停止全部/指定的已创建的,正在运行的进程:

pm2?stop?all
pm2?stop?进程id

4.2.2 运行service

先切换到service文件夹路径。运行成功blog前端项目后,需要再启动service即后端服务来提供接口数据支持。由于后端服务是由egg.js开发的,值得一提的是,该框架内置的egg-scripts命令不需要pm2进程守护,见下图官方解释。所以我们直接在服务器可通过执行npm start或npm stop来启动和停止后端服务。

补充说明:

由于mysql数据库默认不允许通过公网ip来直接连接。所以在egg里的egg-mysql配置中无论是在线上环境还是开发环境都还是配置成本地ip端口(一般为localhost:3306),然后在线上环境时我们会通过配合nginx配置来实现成功连接,请阅读下面nginx配置部分。

4.2.3 运行admin

先切换到admin文件夹路径。博客的后台管理项目是用create-react-app脚手架搭建的。由于它基于生产环境是打包生成静态资源文件,所以我们需要用到Nginx来配置它的服务器访问路径,后面再详细说明。在此之前,我们可以先执行 npm run build来打包生成生产环境所用的静态资源文件,默认生成在admin的bulid文件夹下。

4.3 Nginx配置

4.3.1 配置前准备

nginx会对各个项目进行端口监听配置,请先确保一些必要的服务器端口(如网站首页默认80端口,mysql数据库端口3306)是否已开放使用。以阿里云为例,它的端口配置是通过服务器实例-安全组规则配置中进行设置的。此外,我们还应该新增开放一些端口(端口号可自定义)来用于nginx配置各项目进程端口代理转发。

4.3.2 配置说明

即使上面各项目运行成功后,我们依然无法不知道如何在浏览器中访问到对应的页面,这时候就需要Nginx大显身手了。

nignx配置文件的一般默认路径为/etc/nginx/nginx.conf

我们打开该文件,进行一个基本配置并对配置项进行一个详细说明。

如下例所示:

?#server对应一种端口监听的配置
?server?{
?????listen???????80;
?????#server_name可选配置,你的域名地址(如www.baidu.com)
??????server_name??www.zhuxin.club;
??????#root项目文件的绝对路径
??????root?/root/dist;
?????location?/api?{
????????#代理转发地址,主要用于项目中用到的跨域接口请求
?????????proxy_pass?http://127.0.0.1:8080;
?????????proxy_set_header?Host?$host;
?????}

配置保存后记得要执行nginx -s reload来重启niginx使配置生效。Nginx配置对于新手来讲还是需要一点时间去调试的,所以这里我们要多多进行尝试和必要的资料查询。配置完成和访问通过后我们的初次服务器部署过程就基本结束了,后续我们主要需要做的就是项目的维护了。

相关推荐

教你把多个视频合并成一个视频的方法

一.情况介绍当你有一个m3u8文件和一个目录,目录中有连续的视频片段,这些片段可以连成一段完整的视频。m3u8文件打开后像这样:m3u8文件,可以理解为播放列表,里面是播放视频片段的顺序。视频片段像这...

零代码编程:用kimichat合并一个文件夹下的多个文件

一个文件夹里面有很多个srt字幕文件,如何借助kimichat来自动批量合并呢?在kimichat对话框中输入提示词:你是一个Python编程专家,完成如下的编程任务:这个文件夹:D:\downloa...

Java APT_java APT 生成代码

JavaAPT(AnnotationProcessingTool)是一种在Java编译阶段处理注解的工具。APT会在编译阶段扫描源代码中的注解,并根据这些注解生成代码、资源文件或其他输出,...

Unit Runtime:一键运行 AI 生成的代码,或许将成为你的复制 + 粘贴神器

在我们构建了UnitMesh架构之后,以及对应的demo之后,便着手于实现UnitMesh架构。于是,我们就继续开始UnitRuntime,以用于直接运行AI生成的代码。PS:...

挣脱臃肿的枷锁:为什么说Vert.x是Java开发者手中的一柄利剑?

如果你是一名Java开发者,那么你的职业生涯几乎无法避开Spring。它如同一位德高望重的老国王,统治着企业级应用开发的大片疆土。SpringBoot的约定大于配置、SpringCloud的微服务...

五年后,谷歌还在全力以赴发展 Kotlin

作者|FredericLardinois译者|Sambodhi策划|Tina自2017年谷歌I/O全球开发者大会上,谷歌首次宣布将Kotlin(JetBrains开发的Ja...

kotlin和java开发哪个好,优缺点对比

Kotlin和Java都是常见的编程语言,它们有各自的优缺点。Kotlin的优点:简洁:Kotlin程序相对于Java程序更简洁,可以减少代码量。安全:Kotlin在类型系统和空值安全...

移动端架构模式全景解析:从MVC到MVVM,如何选择最佳设计方案?

掌握不同架构模式的精髓,是构建可维护、可测试且高效移动应用的关键。在移动应用开发中,选择合适的软件架构模式对项目的可维护性、可测试性和团队协作效率至关重要。随着应用复杂度的增加,一个良好的架构能够帮助...

颜值非常高的XShell替代工具Termora,不一样的使用体验!

Termora是一款面向开发者和运维人员的跨平台SSH终端与文件管理工具,支持Windows、macOS及Linux系统,通过一体化界面简化远程服务器管理流程。其核心定位是解决多平台环境下远程连接、文...

预处理的底层原理和预处理编译运行异常的解决方案

若文章对您有帮助,欢迎关注程序员小迷。助您在编程路上越走越好![Mac-10.7.1LionIntel-based]Q:预处理到底干了什么事情?A:预处理,顾名思义,预先做的处理。源代码中...

为“架构”再建个模:如何用代码描述软件架构?

在架构治理平台ArchGuard中,为了实现对架构的治理,我们需要代码+模型描述所要处理的内容和数据。所以,在ArchGuard中,我们有了代码的模型、依赖的模型、变更的模型等,剩下的两个...

深度解析:Google Gemma 3n —— 移动优先的轻量多模态大模型

2025年6月,Google正式发布了Gemma3n,这是一款能够在2GB内存环境下运行的轻量级多模态大模型。它延续了Gemma家族的开源基因,同时在架构设计上大幅优化,目标是让...

比分网开发技术栈与功能详解_比分网有哪些

一、核心功能模块一个基本的比分网通常包含以下模块:首页/总览实时比分看板:滚动展示所有正在进行的比赛,包含比分、比赛时间、红黄牌等关键信息。热门赛事/焦点战:突出显示重要的、关注度高的比赛。赛事导航...

设计模式之-生成器_一键生成设计

一、【概念定义】——“分步构建复杂对象,隐藏创建细节”生成器模式(BuilderPattern):一种“分步构建型”创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...

构建第一个 Kotlin Android 应用_kotlin简介

第一步:安装AndroidStudio(推荐IDE)AndroidStudio是官方推荐的Android开发集成开发环境(IDE),内置对Kotlin的完整支持。1.下载And...