Express项目部署到云服务器
本文最后更新于:8 个月前
将Window10本地开发的Express项目迁移至阿里云服务器的过程记录与总结
Express项目部署到云服务器
前期使用 Express + MongoDB 在本地开发了一个图文博客网站的小项目,为了能够实现在线演示,现在准备把项目部署到云服务器上。
已经完成的内容
- 项目的基本功能已经开发完成
- 已经购买了一台阿里云服务器(服务器上已经安装过了Apache)
一、服务器上安装所需环境
安装node
安装源
1
curl -sL https://rpm.nodesource.com/setup_12.x | bash -
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具
开始安装
1
yum -y install nodejs
查看安装结果
1
2node -v
npm -v替换镜像,默认的镜像为:
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 |
|
安装MongoDB
下载安装包
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
安装配置
1
rpm -ivh mongodb-org-server-5.0.7-0.1.rc1.el7.x86_64.rpm
rpm命令 是RPM软件包的管理工具
1
-i:显示套件的相关信息;-v:显示指令执行过程;-h或--hash:套件安装时列出标记;
从安装信息可以看出,mongodb安装完成后已经自动开机启动项中
查看启动项文件
1
cat /usr/lib/systemd/system/mongod.service
查看配置文件
从上图可以看到配置文件在/etc/mongod.conf中
1
cat /etc/mongod.conf
- 数据库目录:/var/lib/mongo
- 日志目录:/var/log/mongodb/mongod.log
- 端口号:27017
修改配置文件
- 访问IP改为:
0.0.0.0(即不限制访问IP)不能这么设置!!极大的安全漏洞,因为从任何地方都可以访问到数据库,并做更改
1
vi /etc/mongod.conf
- 访问IP改为:
重载系统服务, 启动
1
2systemctl daemon-reload
systemctl start mongod启动失败!经过多番查找,发现问题出在文件权限上,解决过程见文章末尾
查看启动状态
1
systemctl status mongod
二、服务器端口设置
开放云服务器的27017端口,并重启服务器

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

三、设置HTTP代理
何为代理?可以参见我另外一篇文章:了解HTTP代理
由于上一次已经安装过Apache(见这篇文章:阿里云发布网页Apache - timegogo),所以直接使用Apache的代理
网上关于Apache设置http代理的文章质量参差不齐,解释不清楚。
最后发现其实只需要在httpd.conf末尾加上两句就可以了。在CentOS 7中,Apache有另外一个名称,叫httpd
httpd的配置文件所在目录:/etc/httpd/
打开/etc/httpd/conf/httpd.conf
,在末尾添加
1 |
|
即可!
官方文档:反向代理设置指南_Apache中文文档 (apachehttpd.com)
四、上传项目代码
安装git
CentOS 7安装git,通过git从github克隆项目仓库。这样做的好处是:本地所做的更改可以方便地通过git命令同步到服务器上。
通过yum命令直接安装,方法简单,并且会自动安装依赖的包,而且会从源里安装最新的版本(不过不一定是最新的git)。
1 |
|
查看git版本
1 |
|
配置name和email
1 |
|
创建SSH Key
1 |
|
根据提示,可以看到在/root/.ssh/目录下新增了id_rsa和id_rsa.pub两个文件。登陆github,打开Account Settings 打开SSH Keys页面,添加SSH Key,把id_rsa.pub里面的内容复制进去,保存
clone项目
在/home下新建/node目录,
1 |
|
完善数据,因为是从本地项目移植到服务器上的,所以数据库并不是同一个,需要把数据库的数据同步,或者说重新初始化一份数据。
这里尝试把本地数据库的数据移植到云上的数据库。
五、启动Express服务
安装pm2
1 |
|
pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能
通过pm2可以让node项目在服务器上永久运行,而且不会一包错就把express服务挂掉,而且运行中还可以进行其它操作。
切换到Express项目根目录下
1 |
|
至此,直接输入域名就可以访问到我们部署的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 |
|
重新安装:
1 |
|
如何安全地设置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 |
|
输入systemctl status mongod.service
查看输出如下
1 |
|
百度查找,说是文件权限的原因,一开始以为是数据库/var/lib/mongo
和日志/var/log/mongodb/mongod.log
这两个目录的权限问题,但是发现并没有问题,属主和数组都是mongod(因为是使用rpm安装mongodb server过程中自动创建的)
再查百度,发现了真正的问题所在,是/tmp/mongodb-27017.sock
这个文件的问题,它的属主为root,mongod没有足够的权限
解决方案:修改/tmp/mongodb-27017.sock
的属主为mongod
1 |
|
然后重新启动,即可
1 |
|
参考文章:
服务器小白的我,是如何将 node+mongodb 项目部署在服务器上并进行性能优化的 - 云+社区 - 腾讯云 (tencent.com)