React+React-Redux+Webpack+Express+MongoDB完整项目利用PM2+github部署到服务器

2023-11-18

简述

本篇文章主要是用来做个人记录,加深印象,也便于日后翻查。项目是基于慕课网视频做出的一个完整项目,从前端到后台到数据库再到部署到服务器, 服务器没有设置防火墙。

项目概述

本篇文章主要集中于项目部署到服务器上,所以对于项目具体内容碰到了就稍微介绍一点:

  1. 前端:React 16 、React-Redux、React-Router4、Axios、antd-mobile、webpack4
  2. 后端:Express、mongoose、socket . io
  3. 数据库:mongoDB
  4. 服务器:腾讯云 ubuntu 16.04
  5. 其他:nginx、git、 Xshell

项目文件和代码结构

server/server.js是项目后台的入口文件,所以当部署时,只需要启动这个文件即可

项目结构

在server.js中有一段代码是定义静态资源地址,如下:

//静态资源地址
app.use('/', express.static(path.resolve('build')));
app.use(function(req, res, next) {
    if(req.url.startsWith('/user/') || req.url.startsWith('/static/')) {
        return next();
    }
    return res.sendFile(path.resolve('build/index.html'));
})

中间件拦截所有的请求,如果路由没有/user/static返回build文件夹下的index.html,反之交给后续中间件处理

登录到服务器

使用Xshell登录到服务器:
Xshell6
在这里插入图片描述

注意:当前登录用户为root,腾讯云默认是ubuntu,更改腾讯云默认用户为ubuntu解决方案,更改后使用root用户登录,一般来说不建议用root用户,我部署时候碰到了太多的坑都是因为用户是ubuntu引起、各种权限不足,不知道怎么解决,所以直接用root用户了

输入指令:

第一步:

更新系统:sudo apt-get update

第二步:

更新完后安装相关模块包( 不能全部安装就逐个安装):sudo apt-get install vim openssl build-essential libssl-dev wget curl git

第三步:

安装nvm(可去官网查): wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

第四步:

查看nvm版本:nvm --version

第五步:

安装node6.9.5:nvm install v6.9.5

第六步:

指定版本: nvm use v6.9.5

第七步:

指定系统默认node版本:nvm alias default v6.9.5

第八步:

修改默认值: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

第九步:

安装node项目需要的包: npm i pm2 webpack -g

第十步:

如果第九步很慢可以更换npm源: npm --registry=https://registry.npm.taobao.org install -g npm

上述十步没错的话,可以编写一个test.js运行一下

输入: cd
在输入:sudo vim test.js
进入vim编辑器,输入如下代码(不会vim操作的可以百度)

//test.js
const httpServer = require("http");
const server = httpServer.createServer(function(req, res){
  res.end("node server start successful on 7777");
}).listen(7777);
console.log("node server start successful on 7777");

保存并退出,用pm2启动该文件

pm2 start test.js

查看当前pm2管理的node进程,app name 为 test就是刚刚启动的进程了,如果restart很多次的话,有可能是代码出错了,一直在重启。

pm2 list

node进程
查看pm2打印的日志。成功后也可以进入浏览器输入ip+端口看。

pm2 logs

pm2日志信息
在这里插入图片描述
现在已经完成了登录服务器,并且安装了相关的依赖。

安装和配置nginx

第一步:

云服务器有可能默认有apache服务器,需要将它删除:sudo service apache2 stop

出现:apache2:unrecognized service 说明没有这个服务

第二步:

再执行:sudo service apache stop

出现:apache:unrecognized service 说明没有这个服务,出现类似的结果,说明没有apache服务

第三步:

如果有的话执行:update-rc.d -f apache2 remove
再:sudo apt-get remove apache2

第四步:

再更新列表:sudo apt-get update

第五步:

再安装nginx:sudo apt-get install nginx

第六步:

安装完成之后检查nginx版本:nginx -v

第七步:

进入nginx目录: cd /etc/nginx/
再:ls
有一个conf.d文件夹:cd conf.d

第八步:

再新建一个配置文件:sudo vi test.conf(文件名)

upstream Website { //配置名
  server 127.0.0.1:7777; //监听的本地端口
}
server {
  listen 80;
  server_name www.xxx.com; //域名

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Nginx-Proxy true;
    proxy_pass http://Website; //和配置名相同
    proxy_redirect off;
  }
}

完成后保存并退出

第九步:找到nginx配置文件,让新建的配置文件生效

进入nginx目录:cd /etc/nginx/
找到nginx.conf文件并进入:sudo vi nginx.conf

找到: include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*
如果两行前面有#注释掉了,就删除#,因为这是让配置文件生效 完成后保存退出

第十步:

再执行:sudo nginx -t
在重启nginx:sudo nginx -s reload

现在可以在浏览器通过域名来访问,就可以和刚刚的结果一样。

安装MongoDB

这个可以参考官方文档: 选择installation,选择intall MongoDB Community Edition社区版本 for Linux on Ubuntu。(记得选择文档版本为3.4,本次安装的版本为3.4。ubuntu的版本为16.04)

按照官网版步骤来:
1.导入包管理系统使用的公钥
2.为MongoDB创建一个列表文件
3.重新加载本地包数据库
4.安装MongoDB包

安装完成之后显示:Setting up mongodb-org (3.4.20)

启动mongoDB:sudo service mongod start
查看mongoDB是否启动: netstat -lanp | grep "27017"

打通三端,客户端+github+服务器

本次部署是本地代码上传到github仓库,然后再在本地上利用pm2 deployment 来让服务器拉取github代码实现部署,所以需要三端的配合

本地到github

第一步:

生成密钥对: ssh-keygen -t rsa -b 4096 -C "你的邮箱地址"

操作中会有三步需要输入,不用输入,直接Enter键,完成后生成三个文件:
id_rsa是私钥,id_rsa.pub是公钥

第二步:

公钥:cat ~/.ssh/id_rsa.pub

复制生成的公钥到github,点击头像,setting, SSH and GPG keys,粘贴到 new SSH key

第三步:测试,本地打开git bush

git clone (项目地址)

成功克隆下来了,这一步走通了

服务器到github

本地到github的操作一样

第一步:

生成密钥对: ssh-keygen -t rsa -b 4096 -C "你的邮箱地址"

操作中会有三步需要输入,不用输入,直接Enter键,完成后生成三个文件:
id_rsa是私钥,id_rsa.pub是公钥

第二步:

公钥:cat ~/.ssh/id_rsa.pub

复制生成的公钥到github,点击头像,setting, SSH and GPG keys,粘贴到 new SSH key

第三步:创建一个文件夹mkdir test;进入cd test

git clone (项目地址,用ssh格式)

克隆下来了,这一步就走通了

本地到服务器

第三步:进入到服务器,新建一个填写公钥的文件

vim ~/.ssh/authorized_keys

第三步:到本地复制本地的公钥到上一步的文件中,保存并退出

cat ~/.ssh/id_rsa.pub

第三步:测试

ssh username@xxx.xxx.xxx.xxx

如果不行的话,可以进入服务器,然后输入红色命令修改这个配置文件三个字段如下:

vi /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication no

进一步测试,通过,三端就打通了。

pm2部署

在本地安装pm2,打开gitbush并输入命令

npm install pm2 -g

检查版本

pm2 -v

用pm2部署,在部署的项目根目录下新建一个ecosystem.json文件,文件配置参照官网(官网有可能会被墙,多刷新几次)配置
贴出我的配置。

{
    "apps": [
        {
            "name": "Website",//项目名
            "script": "./server/server.js", //入口文件
            "env": {
                "COMMON_VARIABLE": "true"
            },
            "env_production": { //注入node的环境变量
                "NODE_ENV": "production"
            }
        }
    ],
    "deploy": {
        "production": {
            "user": "root", //服务器登录用户
            "host": "118.25.16.173",//服务器ip
            "ref": "origin/master",//分支
            "repo": "git@github.com:chengminying/react-demos.git", //git仓库
            "path": "/www/Website/production",//项目在服务器的路径
            "ssh_options": "StrictHostKeyChecking=no",
            //克隆到服务器后项目需要执行的命令
            "post-deploy": "npm install --registry=https://registry.npm.taobao.org && pm2 startOrRestart ecosystem.json --env production && npm run build",
            "env": { //注入node的环境变量
                "NODE_ENV":"production"
            }
        }
    }
}

保存

初始化pm2

pm2 deploy ecosystem.json production setup

在这一步中最容易碰到文件夹权限不够问题,可以自己根据配置文件中服务器项目路径自己创建好文件夹。然后更改文件夹权限例:chmod 700 test

部署项目

pm2 deploy ecosystem.json production

这一步容易碰到服务器依赖包找不到的问题。具体问题百度一下

总结

这次部署是我第一次在部署项目,所以碰到了太多坑,就不能一一例举出来了,我部署项目上线花了三天时间,每次碰到一个坑就卡主2-3个小时(一个ubuntu权限卡了一天),中途差点放弃了。
所以需要记录下来加深印象,也便于以后出现类似问题好查找。此文章中有什么错误的还希望指出.。
这篇文章说到的都是我从慕课网上学习的一套视频上所讲的,视频上更加全面。《Node.js项目线上服务器部署与发布》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React+React-Redux+Webpack+Express+MongoDB完整项目利用PM2+github部署到服务器 的相关文章

  • Flutter 应用程序更新

    Flutter 应用程序更新 原文 https medium com flutter community in app update the flutter way 2f25e4a02c02 前言 当您推出应用程序的新版本时 您希望您的用户
  • CSS3背景渐变

    我们经常可以看到有些背景色并不是纯色 而是好看的渐变色 css3知我懂我 给我们提供了制作渐变背景色的属性 渐变主要包括线性渐变和径向渐变 接下来逐一介绍用法 1 线性渐变 线性渐变 linear gradients 表示颜色沿着一条直线过
  • 设计模式--原型模式

    原型模式 属于创建型模式 基本原理 又称为克隆模式 拷贝本身对象 可以直接使用语言中的拷贝构造 主要流程 在构建对象的时候实现一个对本身的拷贝函数 特别注意 要有对应的销毁方法 include
  • 集合框架(二)

    集合框架 二 回顾 Collection List Set的特点 Collection 不唯一的 无序的 List 不唯一的 有序 Set 唯一的 无序的 Collection和Collections的区别 Collection是集合的顶级
  • C语言/C++实现栈操作

    一 栈的概念 栈是一种常用的数据结构 它遵循先入后出 Last In First Out LIFO 的原则 栈的操作只在栈的一端进行 该端被称为栈顶 而另一端称为栈底 栈的基本操作包括压栈 入栈 push 和弹栈 出栈 pop 分别用于将元
  • HTTP 常见错误

    HTTP 错误 400 400 请求出错 由于语法格式有误 服务器无法理解此请求 不作修改 客户程序就无法重复此请求 HTTP 错误 401 401 1 未授权 登录失败 此错误表明传输给服务器的证书与登录服务器所需的证书不匹配 请与 We
  • 【Python与机器学习2-1】pandas 基本数据对象及操作

    series 相当于一维数组 要有向量化操作思想 series是类似一维数组的对象 即一个列向量 初始化series 通过列表初始化series 默认数字为索引 ser obj pandas Series list 通过字典初始化serie
  • JSP页面中page指令contentPage/pageEncoding具有什么功能呢?

    转自 JSP页面中page指令contentPage pageEncoding具有什么功能呢 下文将讲述page指令的contentPage及pageEncoding指令的功能简介说明 如下所示 page指令的contentPage及pag
  • Antd DatePicker 设置默认值报clone.weekday is not a function

    代码 dayjs版本1 11 7 页面 当点击页面日期框会报clone weekday is not a function 解决方法 在jsx文件中添加如下js import dayjs from dayjs import advanced
  • AngularJS单元测试环境搭建及验证

    AngularJS的单元测试 要测试AngularJS 需要先搭建相关的测试环境 之前已经安装了Node js并验证了基本的功能 同时下载了AngularJS的包 成功运行了AngularJS编写的程序 也就是说基本的开发环境已经构建完成
  • ArcGIS处理自相交面

    问题 我们在获取一些osm等开源地理数据网站获取数据后 比如建筑物数据 往往需要对数据进行处理后 才可以进行分析 对于面数据 处理面自相交问题是必须操作 如下图 就是自相交的面 解决方案 该问题可以使用ArcGIS轻松解决 新建线要素 选择
  • ARm 移植最新版QT5.12

    转载 https blog csdn net weixin 37771089 article details 84989447 一 准备 ubuntu 12 04 源码 http download qt io archive qt 5 12
  • IDEA使用maven进行多模块项目打包并梳理正确的打包顺序

    maven多模块打包一般相互之间都有互相的依赖关系 如果没有按照正确的依赖关系顺序进行打包就会报错 例如有三个模块web service common 其中web依赖service web和service都依赖common 那么正确的打包顺
  • hsql获取数组中最后一个值的写法

    一 问题抛出 在数据分析中我们有时候会遇到需要取出数组中最后一个值的方法 1 表xxx数据如下图所示 2 现在需要取出字符串最后的 321 和 987 二 方案探讨 1 反转字符串后 使用切割函数切割获取第一个值 然后再反转一下 代码如下
  • Spring Boot starter 启动流程(无废话版)

    如果无产阶级不能发出自己的声音 他们就会被社会遗忘 一 pom xml文件 1 父依赖 其中它主要是依赖一个父项目 主要是管理项目的资源过滤及插件
  • Superset整合keycloak系统

    本篇主要介绍superset如何整合单点登陆系统keycloak 现在网上的博客大部分都是失效了 这里我相当于更新一下 避免大家再走弯路 一 环境配置 Macos keycloak 18 0 0 superset 2 1 0 keycloa
  • PMSM学习笔记1——永磁同步电机的工作原理与数学模型

    文章目录 一 PMSM工作原理 1 同步电机工作原理 来源 电机学 李发海 2 永磁同步电机数学模型及坐标变换 来源 现代电机控制技术 王成元 2 1旋转磁场 2 2三相PMSM的基本数学模型 2 3三相PMSM的坐标变换 2 3 1 Cl
  • 【Unity 3D】学习笔记 - 粒子系统制作

    这次的任务是制作一个简单的粒子系统 并用代码控制使之在不同的场景下呈现出不同的效果 我想要制作出颜色渐变的烟花效果 关于粒子系统 可以参考 Unity 3D 学习笔记 粒子系统初探 粒子系统基本设置如下 其中Simulation Rotat
  • 学生用计算机怎么恢复出厂设置,电脑怎么恢复出厂设置

    关机或重启时 按住电脑键盘的 Del 键进入BIOS 使用Enter回车键选中 Load Optimized Defaults 选项 使用方向键选中 Y 确认 点击 Save Exit Step 或者按 F10 退出即可 以下是详细介绍 电

随机推荐

  • Go语言实现Onvif客户端:2、获取设备信息

    Go语言实现Onvif客户端 2 获取设备信息 文章目录 Go语言实现Onvif客户端 2 获取设备信息 1 思路 2 代码 1 思路 搜索设备 获取设备能力 通过设备能力的设备接口读取设备信息 我们上节说了 主要是通过设备信息中的内容来区
  • 线性代数 【基础1】

    文章目录 行列式 方阵的行列式公式 矩阵 矩阵的逆 矩阵的秩 伴随矩阵 初等变换与初等矩阵 分块矩阵 向量 正交矩阵 正交化 线性表示 线性无关与线性相关 极大无关组与向量组的秩 线性方程组 解的性质与判定 齐次线性方程组 非齐次线性方程组
  • 大型网站在架构上应当考虑哪些问题?

    分层 分层是处理任何复杂系统最常见的手段之一 将系统横向切分成若干个层面 每个层面只承担单一的职责 然后通过下层为上层提供的基础设施和服务以及上层对下层的调用来形成一个完整的复杂的系统 计算机网络的开放系统互联参考模型 OSI RM 和In
  • Java8 CompletableFuture处理多个异步任务

    CompletableFuture Java5引入了Future和 FutureTask 用于异步处理 Future可以通过get 方法获取异步的返回值 在Java8引入了CompletableFuture CompletableFutur
  • 设置GPU及显存大小

    20210128 引言 之前搜索过设置GPU和显存大小的方式 但是升级了新的版本的keras以及tensorflow 导致之前的代码失效了 这里记录一下 本质上 就是版本更换的原因 很多api可能被取消 或者改了别的 原始代码 import
  • 计算机网络ip尽最大努力交付,计算机网络知识(IP、TCP、UDP)--持续更新

    互联网的两个重要的基本特点 连通性和共享 计算机网络由若干结点和连接这些结点的链路组成 互联网的组成 边缘部分 核心部分 网络边缘的端系统之间的通信可分为两大类 客户 服务器方式 C S方式 和对等方式 P2P方式 互联网的核心部分 许多网
  • 原始传奇手游服务器不显示,原始传奇手游为什么进不去 无法登录游戏解决方法...

    近日有一款由古力娜扎代言的手游 原始传奇 上线了 不少玩家也很想体验一番 可是却发现原始传奇手游进不去 不知道是为什么 下面悠小悠就为大家详细介绍下无法登录游戏的原因和解决方法 一起探讨下吧 原始传奇手游进不去原因及解决方法 1 如果是登录
  • tomcat没有日志输出--解决办法

    程序没有问题 只是控制台信息卡 感觉像程序休眠了一样 然后在控制台点backspace或是enter 程序恢复正常 控制台日志正常输出 静态文件访问可以 解决办法 转载于 https blog 51cto com 13693838 2398
  • BIND9的架构与机制笔记1

    BIND9采用的是事件驱动的机制来工作 而事件的源头则是IO IO在linux使用的EPOLL的边缘触发模式 本篇说的是epoll BIND9如果创建了watcher线程 宏USE WATCHER THREAD控制 这里就讨论有线程的情况
  • Redis第五讲 Redis内存淘汰策略之LRU与LFU算法详细介绍

    前面介绍了Redis的一些内存淘汰策略 一般比较常用的两种淘汰策略为LRU LFU 而且他们的算法考察的也比较多 LRU 最近最久未使用 标准LRU算法是这样的 它把数据存放在链表中按照 最近访问 的顺序排列 当某个key被访问时就将此ke
  • 机器学习——无监督学习

    机器学习的分类 一般分为下面几种类别 监督学习 supervised Learning 无监督学习 Unsupervised Learning 强化学习 Reinforcement Learning 增强学习 半监督学习 Semi supe
  • Vue 中实现 excel文件上传功能

    Duang 最近搭建了一个自己的博客小破站 欢迎各位小伙伴来访吖 ares coder blog portalhttps www ares stack cn blog service game 场景 上传excel表 并将excel表中的数
  • Django实现前后端分离开发

    前后端分离开发 在传统的Web应用开发中 大多数的程序员会将浏览器作为前后端的分界线 将浏览器中为用户进行页面展示的部分称之为前端 而将运行在服务器 为前端提供业务逻辑和数据准备的所有代码统称为后端 所谓前后端分离的开发 就是前后端工程师约
  • Hadoop 之上的数据建模 - Data Vault 2.0

    对比传统的基于 RDBMS 之上的数据仓库和商业智能项目 尝试着说说 Hadoop 之上的数据仓库 从ETL 数据存储 到分析展现 重点围绕数据建模方面做分析 因为这是本文的重点 介绍一份新的数据建模方式 Data Vault 2 0 ET
  • HTML框架构建

    HTML框架构建 1 划分框架 A 使用标签决定如何划分框架 必须要有标签设定每个小窗口的网页 该标签中有src属性为每个URL值指定一个HTML文件 这个文件必须事先做好 B 标签常用的属性 属性 描述 cols 用 像素数 或 分个左右
  • Android-PullToRefresh下拉刷新库基本用法

    PullToRefresh是一套实现非常好的下拉刷新库 它支持 ListView ExpandableListView GridView WebView ScrollView HorizontalScrollView ViewPager 等
  • AutoEncoder (自编码/非监督学习)

    神经网络也能进行非监督学习 只需要训练数据 不需要标签数据 自编码就是这样一种形式 自编码能自动分类数据 而且也能嵌套在半监督学习的上面 用少量的有标签样本和大量的无标签样本学习 这次我们还用 MNIST 手写数字数据来压缩再解压图片 然后
  • Boost升压电路调试

    背景 项目用到了一款升压电路 将12V升压到32V 电流要求有12A 最大18A 设计的方案是使用Boost Controller 外置MOS来实现 选定的Controller芯片为Maxim的MAX25203 问题 回板后进行调试 在不使
  • 硕士毕业论文应该如何梳理论文框架?

    硕士毕业论文相比于本科论文来说 具有更为广阔的知识面 对于研究的课题也更有深度 如果硕士毕业论文能取得一个很高的成绩 那么不管之后是继续求学还是找工作 都会有一定的优势 我曾经就硕士论文这方面和我的一个同学讨论过 当时我询问他是怎么取得69
  • React+React-Redux+Webpack+Express+MongoDB完整项目利用PM2+github部署到服务器

    React项目使用pm2部署上线 简述 项目概述 项目文件和代码结构 登录到服务器 输入指令 安装和配置nginx 安装MongoDB 打通三端 客户端 github 服务器 本地到github 服务器到github 本地到服务器 pm2部