Express项目部署到云服务器

本文最后更新于:8 个月前

将Window10本地开发的Express项目迁移至阿里云服务器的过程记录与总结

Express项目部署到云服务器

前期使用 Express + MongoDB 在本地开发了一个图文博客网站的小项目,为了能够实现在线演示,现在准备把项目部署到云服务器上。

已经完成的内容

  • 项目的基本功能已经开发完成
  • 已经购买了一台阿里云服务器(服务器上已经安装过了Apache)

一、服务器上安装所需环境

安装node

  1. 安装源

    1
    curl -sL https://rpm.nodesource.com/setup_12.x | bash -

    在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具

  2. 开始安装

    1
    yum -y install nodejs
  3. 查看安装结果

    1
    2
    node -v
    npm -v
  4. 替换镜像,默认的镜像为:https:*//registry.npmjs.org/*,国内下载可能受限,更换为淘宝镜像

    1
    npm config set registry http://registry.npm.taobao.org/

    如果想恢复原来的镜像地址:npm config set registry https://registry.npmjs.org/

安装Express

使用glocal安装,Express是Nodejs下的一个框架

1
npm -g install express

安装MongoDB

  1. 下载安装包

    1
    wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/testing/x86_64/RPMS/mongodb-org-server-5.0.7-0.1.rc1.el7.x86_64.rpm

    具体的url应该参考[MongoDB官网](MongoDB Community Download | MongoDB)给出的链接为准,Package选择rpm,Platform选择自己对应的版本,我这里是RedHat/CentOS 7

  2. 安装配置

    1
    rpm -ivh mongodb-org-server-5.0.7-0.1.rc1.el7.x86_64.rpm

    rpm命令 是RPM软件包的管理工具

    1
    -i:显示套件的相关信息;-v:显示指令执行过程;-h或--hash:套件安装时列出标记;

    从安装信息可以看出,mongodb安装完成后已经自动开机启动项中

  3. 查看启动项文件

    1
    cat /usr/lib/systemd/system/mongod.service

    img

  4. 查看配置文件

    从上图可以看到配置文件在/etc/mongod.conf中

    1
    cat /etc/mongod.conf

    img

    • 数据库目录:/var/lib/mongo
    • 日志目录:/var/log/mongodb/mongod.log
    • 端口号:27017
  5. 修改配置文件

    • 访问IP改为:0.0.0.0(即不限制访问IP)不能这么设置!!极大的安全漏洞,因为从任何地方都可以访问到数据库,并做更改
    1
    vi /etc/mongod.conf
  6. 重载系统服务, 启动

    1
    2
    systemctl daemon-reload
    systemctl start mongod

    启动失败!经过多番查找,发现问题出在文件权限上,解决过程见文章末尾

  7. 查看启动状态

    1
    systemctl status mongod

    image-20220411224726165

二、服务器端口设置

开放云服务器的27017端口,并重启服务器

image-20220411231918871

在浏览器中输入服务器IP:27017,成功访问到数据库

image-20220411232018995

三、设置HTTP代理

何为代理?可以参见我另外一篇文章:了解HTTP代理

由于上一次已经安装过Apache(见这篇文章:阿里云发布网页Apache - timegogo),所以直接使用Apache的代理

网上关于Apache设置http代理的文章质量参差不齐,解释不清楚。

最后发现其实只需要在httpd.conf末尾加上两句就可以了。在CentOS 7中,Apache有另外一个名称,叫httpd

httpd的配置文件所在目录:/etc/httpd/

打开/etc/httpd/conf/httpd.conf,在末尾添加

1
2
ProxyPass "/"  "http://127.0.0.1:3000"         将所有请求("/")代理到一个后端:
ProxyPassReverse "/" "http://127.0.0.1:3000" 为了确保Location:将从后端生成的和标头修改为指向反向代理,而不是返回自身

即可!

官方文档:反向代理设置指南_Apache中文文档 (apachehttpd.com)

四、上传项目代码

安装git

CentOS 7安装git,通过git从github克隆项目仓库。这样做的好处是:本地所做的更改可以方便地通过git命令同步到服务器上。

通过yum命令直接安装,方法简单,并且会自动安装依赖的包,而且会从源里安装最新的版本(不过不一定是最新的git)。

1
yum install git

查看git版本

1
git --version

配置name和email

1
2
git config --global user.name "timegogo"
git config --global user.email "你的邮箱"

创建SSH Key

1
ssh-keygen -t rsa

根据提示,可以看到在/root/.ssh/目录下新增了id_rsa和id_rsa.pub两个文件。登陆github,打开Account Settings 打开SSH Keys页面,添加SSH Key,把id_rsa.pub里面的内容复制进去,保存

clone项目

在/home下新建/node目录,

1
git clone 地址

完善数据,因为是从本地项目移植到服务器上的,所以数据库并不是同一个,需要把数据库的数据同步,或者说重新初始化一份数据。

这里尝试把本地数据库的数据移植到云上的数据库。

五、启动Express服务

安装pm2

1
npm install -g pm2

pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能

通过pm2可以让node项目在服务器上永久运行,而且不会一包错就把express服务挂掉,而且运行中还可以进行其它操作。

切换到Express项目根目录下

1
pm2 start ./bin/www

至此,直接输入域名就可以访问到我们部署的Express项目啦!

六、修补漏洞

因为在【一】当中,将MongoDB的配置文件中的访问ip设置为0.0.0.,导致出现了安全漏洞,从任何地址都可以访问并修改它,所以数据被黑了!

为了确保安全,将数据库彻底卸载(包括所有配置文件),重新从官网下载安装包,安装一次

所有涉及到文件:

路径 文件 备注
/usr/lib/systemd/system/mongod.service 启动项文件 yum remove时自动删除
/etc/mongod.conf 配置文件 yum remove时自动删除
/var/lib/mongo 数据库目录 手动删除
/var/log/mongodb/mongod.log 日志目录 手动删除

卸载过程:

1
2
3
4
5
service mongod stop
systemctl status mongod
yum list installed | grep mongo
yum -y remove mongodb-org-shell.x86_64
yum -y remove mongodb-org-server.x86_64

重新安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vi /etc/yum.repos.d/mongodb-org-6.0.repo
加入以下代码:
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc

yum install -y mongodb-org
systemctl start mongod
遇到报错:Job for mongod.service failed because the control process exited with error code. See "systemctl status mongod.service" and "journalctl -xe" for details.

chown mongod:mongod /tmp/mongodb-27017.sock
systemctl start mongod
systemctl status mongod
systemctl enable mongod 设置开机自启动

如何安全地设置windows本地访问服务器数据库

因为使用图形化界面调试数据库的需要,需要在window本地连接云服务器上的数据库。但是如何能够安全地配置一个私有链接?

方式一:通过防火墙和mongodb的配置文件里限制ip来源。行不通!,因为本地的ip会随着网络环境的变化而变化

方式二:给数据库设置访问安全验证,不限制ip来源,所以ip都可以请求连接数据库,但是需要安全验证(✓)

七、总结

将一个本地开发好的项目移植到云服务上,主要步骤依次为:搭建项目运行环境、安装并测试数据库连接、安装必要的包、安装git并从github克隆项目、开放服务器的端口、设置服务端的http代理、安装pm2永远运行项目。

在设置服务端http代理这一步,卡了大量的时间,原因在于对于Apache不熟悉,不知道如何设置反向代理,网上的经验贴质量也参次不齐。最后靠看官网文档 + 大胆尝试 实现了。(官方文档永远都是最靠谱的)

整个过程下来,熟悉了一遍上线项目的流程,其实理解之后会发现上线的原理很简单,并没有想象的那么难,就是在服务器上创建一个一模一样的环境,让项目运行在上面,同时设置一下访问代理,通过代理访问到项目服务器。中间了解到了一个关键的知识点,就是 代理,包括正向代理和反向代理。然后学习了如何通过Apache(在CentOS上httpd)来设置反向代理。

但是我知道其实还存在很多问题没有解决,比如没有将node的项目环境修改为生产环境,没有做任何性能优化等等。

路漫漫其修远兮……

附录

bug1:无法启动mongod服务

安装配置好mongodb server之后,使用systemctl start mongod作为系统服务启动,但是失败了,报了下面的错误

1
Job for mongod.service failed because the control process exited with error code. See "systemctl status mongod.service" and "journalctl -xe" for details.

输入systemctl status mongod.service查看输出如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
● mongod.service - MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Mon 2022-04-11 22:05:49 CST; 23min ago
Docs: https://docs.mongodb.org/manual
Process: 24833 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)
Process: 24830 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 24826 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 24824 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)

Apr 11 22:05:48 iZwz913vjju8a7uxhrlugnZ systemd[1]: Starting MongoDB Database Server...
Apr 11 22:05:48 iZwz913vjju8a7uxhrlugnZ mongod[24833]: about to fork child process, waiting until...s.
Apr 11 22:05:48 iZwz913vjju8a7uxhrlugnZ mongod[24833]: forked process: 24836
Apr 11 22:05:49 iZwz913vjju8a7uxhrlugnZ mongod[24833]: ERROR: child process failed, exited with 14
Apr 11 22:05:49 iZwz913vjju8a7uxhrlugnZ mongod[24833]: To see additional information in this outp...n.
Apr 11 22:05:49 iZwz913vjju8a7uxhrlugnZ systemd[1]: mongod.service: control process exited, code=...14
Apr 11 22:05:49 iZwz913vjju8a7uxhrlugnZ systemd[1]: Failed to start MongoDB Database Server.
Apr 11 22:05:49 iZwz913vjju8a7uxhrlugnZ systemd[1]: Unit mongod.service entered failed state.
Apr 11 22:05:49 iZwz913vjju8a7uxhrlugnZ systemd[1]: mongod.service failed.

百度查找,说是文件权限的原因,一开始以为是数据库/var/lib/mongo日志/var/log/mongodb/mongod.log这两个目录的权限问题,但是发现并没有问题,属主和数组都是mongod(因为是使用rpm安装mongodb server过程中自动创建的)

再查百度,发现了真正的问题所在,是/tmp/mongodb-27017.sock这个文件的问题,它的属主为root,mongod没有足够的权限

解决方案:修改/tmp/mongodb-27017.sock的属主为mongod

1
chown mongod:mongod /tmp/mongodb-27017.sock

然后重新启动,即可

1
systemctl start mongod

参考文章:

服务器小白的我,是如何将 node+mongodb 项目部署在服务器上并进行性能优化的 - 云+社区 - 腾讯云 (tencent.com)


Express项目部署到云服务器
http://timegogo.top/2022/04/11/项目实践/Express项目部署到云服务器/
作者
丘智聪
发布于
2022年4月11日
更新于
2023年7月16日
许可协议