在阿里云ECS CentOS7上部署基于MongoDB+Node.js的博客

前言:这是一篇教你如何在阿里云的ECS CentOS 7服务器上搭建一个我的博客的教程,教程比较基础,笔者尽量比较详细的把每一步都罗列下来,包括所需软件的下载安装和域名的绑定,笔者在此以前对Linux系统也是了解甚少,经过这个过程,自感学到不少东西,我喜欢用文字整理而且分享,也但愿所以交到更多的朋友,可能如下教程存在不少描述不清或者措辞不当的地方,还请资深人士给予指出。即便你是小白,也不要紧,一步一步按照教程来,可能会遇到一些困难,多百度一下,或者跟我交流,都OK的。在教程以前,你须要对整个流程有一个初步全面的了解,主要是安装的软件列表和之间的关系。虽然这个教程是基于我本身开发的一个博客程序(前端工程师最好的全栈开发实践-设计开发属于本身的nodejs博客)来部署的,应该说除了step5之外,其余步骤都是通用的。当你用优惠券在阿里云购买了一个ECS服务器后,你须要选择一个镜像做为系统平台,支持你的程序运行,我这里用阿里自带提供的Cent OS 7,教程也是以CentOS 7为根本。接着你须要在CentOS平台上安装一些软件去支撑你的博客,这些软件有如下:javascript

  • WEB服务器(Nginx or Apache)用来作域名绑定和指向,这里是Nginx
  • Node.js(支撑你的程序运行)
  • MongoDB(数据库,支撑你的博客数据存储)

另外你还须要在你的windows系统安装一个链接CentOS上MongoDB数据库的工具Robomongo用于测试链接数据库和查看数据库信息,还有一个链接远程ECS服务器的工具,我推荐用MobaXterm。php

Step1. 使用MobaXterm终端在windows上链接阿里云CentOS服务器

这个终端左侧有一个目录树,你能够用它像ftp同样方便的上传,编辑,下载文件,也支持从windows拖动到目录下,固然你能够在右侧一直使用命令行,对于敲命令行生疏的朋友是一个帮助。css

 
alt

链接很简单,依次点击左上角Session,弹窗左上角点击SSH,填写IP地址和用户名,点击保存便可,请看下图:html

 
alt

Step2. 在CentOS7上安装Node.js

安装有不一样方式,这里用我的以为比较简单的直接部署方式:前端

进入相应目录,下载bin包java

打开MobaXterm终端,通常是进入到/usr/local/src/下node

cd /usr/local/src/ 

https://nodejs.org/en/download/页面找到Linux Binaries (x86/x64) ,通常是64bit,右键复制连接地址(https://nodejs.org/dist/v8.11.3/node-v8.11.3-linux-x64.tar.xz)linux

wget https://nodejs.org/dist/v8.11.3/node-v8.11.3-linux-x64.tar.xz 

解压包nginx

等待下载完成以后,在命令行输入 ls,或者点击MobaXterm终端左侧目录树到当前目录下,你会看到node-v8.11.3-linux-x64.tar.xz文件,接着用下面的两行命令将xz文件先解压成tar文件,再解压成文件夹。web

xz -d node-v8.11.3-linux-x64.tar.xz 

此时在命令行输入 ls,或者点击MobaXterm终端左侧目录树到当前目录下能够看到node-v8.11.3-linux-x64.tar文件,下面解压tar文件。

tar -xf node-v8.11.3-linux-x64.tar 

此时在命令行输入 ls,或者点击MobaXterm终端左侧目录树到当前目录下能够看到node-v8.11.3-linux-x64文件夹

部署bin文件

确认node.js的路径,进入node-v8.11.3-linux-x64文件夹下的bin目录,cd node-v8.11.3-linux-x64/bin,输入pwd获取当前node.js路径,个人是/usr/local/src/node-v8.11.3-linux-x64/bin,而后分别执行下面两行命令,给node和npm建立软连接,ln指令用于建立关联(相似Windows的快捷方式)。

ln -s /usr/local/src/node-v8.11.3-linux-x64/bin/node /usr/local/bin/node ln -s /usr/local/src/node-v8.11.3-linux-x64/bin/npm /usr/local/bin/npm 

测试

node -v
npm -v

若是软连接关联成功,输入以上命令,会输出响应的版本号,至此,nodejs安装完毕。

Step3. 在CentOS7上安装MongoDB

这里仍然用相对最简单的安装方式。

下载和解压

打开https://www.mongodb.com/download-center,点击Community Server选项卡,切换到Linux部分,这里的version有不少种版本,我也很困惑该如何选择,由于我是CentOS 7,后来查了相关资料,选择了RHEL 7 Linux 64-bit x64,下面是从网上摘抄为何选择这个版本的依据资料:

CentOS和rhel最重要的区别是版权问题,redhat 的红帽图标是有版权的,CentOS被称为redhat的社区版,即你们把redhat系统里的全部图标都换了就成了centos了。再就是redhat是有相应的服务的,也是有些收费的服务,centos没有。其余都同样:使用,性能,稳定性。。。。都同样。

复制下载连接https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.0.tgz,而后进入相应目录下载:

cd /usr/local/src wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.0.tgz 

以后输入ls,会看到mongodb-linux-x86_64-rhel70-4.0.0.tgz已经下载完毕,而后解压文件

tar -zxvf mongodb-linux-x86_64-rhel70-4.0.0.tgz 

以后输入ls,会看到mongodb-linux-x86_64-rhel70-4.0.0文件夹表示解压完毕

部署

咱们把mongodb直接部署在/usr/local/src/下面,因为文件夹文字太长,咱们修改一下文件夹名称为mongodb

mv mongodb-linux-x86_64-rhel70-4.0.0 mongodb 

上面命令作的事情是在/usr/local/src下建立一个mongodb文件夹,而后把/usr/local/src下面的mongodb-linux-x86_64-rhel70-4.0.0文件夹下的内容所有移动到mongodb下,并删除mongodb-linux-x86_64-rhel70-4.0.0文件夹。

建立日志目录和数据文件目录

cd /usr/local/src/mongodb/ mkdir -p data/logs mkdir -p data/db 

启动MongoDB有2种方式,一是直接指定配置参数,二是指定配置文件。这里先介绍建立配置文件,若是你熟悉linux的vim命令,能够在命令行编辑,若是不熟悉,能够按照以下的方式,先在你的windows系统桌面上准备一个文件mongodb.conf,填写下列项:

port=27899 #端口号(默认的端口号是27017,这里修改也是为了安全性) dbpath=/usr/local/src/mongodb/data/db #数据目录(指向刚才建立的数据文件目录) logpath=/usr/local/src/mongodb/logs/mongodb.log #日志目录(指向刚才建立的日志目录,并指定mongodb.log文件名,系统会自动建立) fork=true #设置后台运行 logappend=true #日志输出方式(写日志的模式:设置为true为追加。默认是覆盖。若是未指定此设置,启动时MongoDB的将覆盖现有的日志文件。) auth=true #开启认证(默认是flase,不须要认证的,这里开启认证是为了安全性) 

而后经过MobaXterm直接拖到/usr/local/src/mongodb/目录下。

启动和终止

进入/usr/local/src/mongodb/bin/目录下,启动MongoDB

cd /usr/local/src/mongodb/bin/ ./mongod --config ../mongodb.conf 

若是启动成功,你会看到如下内容:

2018-07-11T17:45:05.312+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none' about to fork child process, waiting until server is ready for connections. forked process: 12674 child process started successfully, parent exiting 

你能够经过ps aux |grep mongodb命令查看mongodb进程是否开启

root     12674 1.6 3.6 1084292 69128 ? Sl 17:45 0:01 ./mongod --config ../mongodb.conf root 12705 0.0 0.0 112660 964 pts/0 R+ 17:46 0:00 grep --color=auto mongodb 

第一个就是刚刚启动的进程,12674是进程ID,若是你想终止进程,能够用kill -9 12674来终止。

进入终端操做数据库

cd /usr/local/src/mongodb/bin/ ./mongo --port=27899 

这里说明一下,由于你的conf配置文件的端口改为了27899,因此这里启动终端要指定端口号,若是是27017默认端口号,则不须要指定,直接./mongo就能够进入交互控制台,接着你输入show dbs,就会看到如下默认集合:

> show dbs admin 0.000GB config 0.000GB local 0.000GB 

假如你在本地的windows环境安装MongoDB,一般咱们测试是否开启MongoDB的办法是直接在浏览器输入http://127.0.0.1:27017去查看,可是linux系统并不方便,咱们还能够用一个命令去查看是否开启:

netstat -anpt|grep 27899    27899是MongoDB的进程端口号

若是正常开启,你会看下如下的信息,注意这里的ip地址是0.0.0.0,而不是127.0.0.1,这是由于我在mongodb.conf文件里面加了bind_ip = 0.0.0.0,表明外网也能够链接这个阿里云的Mongodb,这里牵扯不少内容,具体在下面讲。

tcp        0 0 0.0.0.0:27899 0.0.0.0:* LISTEN 12674/./mongod 

从外网访问阿里云的MongoDB

一般状况下,你的MongoDB成功启动后,你在浏览器端输入你的ECS服务器的公网IP再加上你本身的MongoDB的端口号(例如:http://47.98.xxx.152:27899),能够看到It looks like you are trying to access MongoDB over HTTP on the native driver port.信息,若是访问不到,可能有如下三种状况:

你的阿里云ECS服务器的安全组没有设置对外网开放

阿里云的服务器为了安全,默认的禁止外网访问,早期的ECS服务器是能够访问的,最新的centos7+版本没有开启安全组,你须要在阿里云后台的安全组设置规则,具体操做请在阿里云后台提交工单咨询,下面是个人咨询结果,供你们参考。

****** :   服务器IP : 47.98.xxx.152:27899 问题描述 : 我已经安装了mongodb,而且启动了,可是我在外网访问不了47.98.xxx.152:27899,请帮忙排查 2018-07-10 15:20:34 工程师 62134 号 : 您好,咱们已经收到您提交的问题,正在为您查看,请稍等 2018-07-10 15:22:29 工程师 62134 号 : 尊敬的客户您好,根据您的反馈,咱们将问题定义以下: [问题总结] 实例名ID :i-bp1ixbos2x1xxxxxxx 客户端IP地址 : 47.98.xxx.152 出现问题时间段 : 2018-07-10 15:20:34 问题描述 :我已经安装了mongodb,而且启动了,可是我在外网访问不了47.98.xxx.152:27899 接下来,咱们将对上述问题进行分析排查,若是针对上述问题定义及范围有任何疑问,欢迎随时联系咱们。 [处理意见] 您好: 请您在安全组添加一条容许27017端口的策略。 添加安全组规则请您参考:https://help.aliyun.com/document_detail/25471.html?spm=5176.11065259.1996646101.searchclickresult.5bc177d5XwTU1y 
防火墙没有关闭
systemctl status firewalld 查看防火墙状态
systemctl start firewalld 开启防火墙
systemctl stop firewalld 关闭防火墙

以上是CentOS的防火墙命令,你能够输入systemctl status firewalld查看防火墙状态,若是防火墙是关闭的,你会看到下列信息:

● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) 这里表示防火墙是关闭的状态 Docs: man:firewalld(1) 

若是是开启状态,Active一栏是Active: active (running) since Thu 2018-07-12 11:18:45 CST; 2s ago

若是你并不但愿关闭防火墙,可是但愿仍然能打开MongoDB的端口,你能够单独开启MongoDB端口,好比你的MG端口是27899,你可使用下列命令永久打开这个端口:

firewall-cmd --zone=public --permanent --add-port=27899/tcp; firewall-cmd --reload 

成功后会显示两个success

[root@frogo2 bin]# firewall-cmd --zone=public --permanent --add-port=27899/tcp; firewall-cmd --reload success success 

地方法针对端口,适用全部端口的开启。若是你想知道你永久打开了哪些端口,你能够经过如下命令:

firewall-cmd --list-ports 
MongoDB.conf文件bind_ip参数应该设置为0.0.0.0

在终端输入命令行netstat -anpt|grep 27899,若是显示的IP地址是127.0.0.1,说明MongoDB端口只对本地开放,须要将MongoDB.conf文件增长bind_ip=0.0.0.0,表示外网能够访问本地的MongoDB

port=27899 #端口号(默认的端口号是27017,这里修改也是为了安全性) dbpath=/usr/local/src/mongodb/data/db #数据目录(指向刚才建立的数据文件目录) logpath=/usr/local/src/mongodb/logs/mongodb.log #日志目录(指向刚才建立的日志目录,并指定mongodb.log文件名,系统会自动建立) fork=true #设置后台运行 logappend=true #日志输出方式(写日志的模式:设置为true为追加。默认是覆盖。若是未指定此设置,启动时MongoDB的将覆盖现有的日志文件。) auth=true #开启认证(默认是flase,不须要认证的,这里开启认证是为了安全性) bind_ip=0.0.0.0 #对外开放端口(默认是127.0.0.1) 

修改完mongodb.conf,先kill -9 掉原先的mongodb进程,而后进入bin目录,重启mongodb。

cd /usr/local/src/mongodb/bin/ ./mongod --config ../mongodb.conf 

此时在netstat -anpt|grep 27899 会看到IP地址改为了0.0.0.0,而后在浏览器端输入你的ECS服务器的公网IP再加上你本身的MongoDB的端口号去测试是否成功。

Step4.给MongoDB开启密码访问

MongoDB 默认是没有开启安全认证的,对于部署在云上就显得及其不安全,下面咱们为mongodb的admin数据库建立用户。

MongoDB数据库有如下特色:

1,没有默认管理员帐号,因此要先添加管理员帐号,在开启权限认证。 2,切换到admin数据库,添加的帐号才是管理员帐号。 3,用户只能在用户所在数据库登陆,包括管理员帐号。 4,管理员能够管理全部数据库,可是不能直接管理其余数据库,要先在admin数据库认证后才能够。这一点比较特别。

首先cd 到bin目录:

cd /usr/local/src/mongodb/bin/ ./mongo --port=27899 进入MongoDB交互台,若是是默认是27017,则不须要加上后面的--port参数 在控制台输入 show dbs 你会看到如下数据库,blog是你刚才建立的 > show dbs admin 0.000GB blog 0.000GB config 0.000GB local 0.000GB 使用 use admin 切换到admin数据库 > use admin switched to db admin 使用db.createUser()函数在admin数据库下建立用户,老版本的MongodDB是db.addUser()函数,这里注意一下,由于网上不少没有指明版本 > db.createUser({user:"root",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]}) Successfully added user: { "user" : "root", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } 咱们看到已经成功在admin下建立了一个用户名为root,密码为123456的用户 userAdminAnyDatabase:授予在全部数据库上管理User的权限-意思是能够在全部的数据库管理User,可是没有操做权利,只有你在那个数据库验证了User,而后才能去操做数据库的读写。(若是不能白,能够百度MongoDB的role方面知识) 

如今咱们成功的建立了用户和密码,下面请将mongodb.conf文件中的开启安全认证项修改成true

cd /usr/local/src/mongodb 

用vim 命令或者经过MobaXterm终端直接修改文件,文件最后呈现如下样子

# idae - MongoDB config start # 设置数据文件的存放目录(根据实际的db文件夹的路径填写) dbpath = /usr/local/src/mongodb/data/db # 设置日志文件的存放目录及其日志文件名(根据实际的logs文件夹的路径填写) logpath = /usr/local/src/mongodb/data/logs/mongodb.log # 设置端口号(默认的端口号是 27017) port = 27899 # 设置为以守护进程的方式运行,即在后台运行 fork = true # 日志 logappend=true # 开启认证 auth = true # 开启远程访问 bind_ip = 0.0.0.0 

而后找到MongoDB进程,先kill掉,再重启

[root@frogo2 mongodb]# ps aux |grep mongodb root 22083 0.2 4.5 1078336 85724 ? SLl Jul19 2:38 ./mongod --config ../mongodb.conf root 23111 0.0 0.0 112660 964 pts/1 R+ 11:07 0:00 grep --color=auto mongodb [root@frogo2 mongodb]# kill -9 22083 [root@frogo2 mongodb]# cd bin [root@frogo2 bin]# ./mongod --config ../mongodb.conf 2018-07-20T11:08:32.841+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none' about to fork child process, waiting until server is ready for connections. forked process: 23115 child process started successfully, parent exiting 

而后再次打开MongoDB交互台,使用show dbs命令会报出未验证的提示:

./mongo --port=27899 进入MongoDB交互台 > show dbs 2018-07-20T11:09:51.770+0800 E QUERY [js] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "command listDatabases requires authentication", "code" : 13, "codeName" : "Unauthorized" } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 Mongo.prototype.getDBs@src/mongo/shell/mongo.js:65:1 shellHelper.show@src/mongo/shell/utils.js:865:19 shellHelper@src/mongo/shell/utils.js:755:15 @(shellhelp2):1:1 

咱们能够看到结果显示失败未验证,说明咱们刚才开启MongoDB密码登陆成功,下面咱们须要验证,首先切换到admin数据库下,也就是说,验证步骤必须在admin数据库下面进行

> use admin switched to db admin > show collections Warning: unable to run listCollections, attempting to approximate collection names parsing connectionStatus > db.auth("root","123456") 1 > show dbs admin 0.000GB blog 0.000GB config 0.000GB local 0.000GB 

db.auth()函数是验证方法,能够看到显示结果1表示成功验证,这个时候咱们再show dbs,就成功显示了。 这个时候咱们就能够对数据库任意操做了。

如今咱们尝试用Robomongo工具在外部链接MongoDB数据,你须要在Authentication一栏填写数据库名和用户名密码

 
alt

Step5.在CentOS7上部署node.js BLOG程序

1.咱们把blog文件放在home目录下,cd 到home下面,clone你的blog代码到目录下(或者打开MobaXterm终端左侧的目录树,把blog拖到home 目录下)

安装node依赖包

npm install

修改config.js文件中的数据库链接

//mongodb配置信息 mongodb: { uri: 'mongodb://root:123456@localhost:27899/blog', options: {} }, 

运行node app.js,若是成功,会提示服务已经启动,端口号:7000

安装forever守护进程,以保证node能够持续工做。

npm install forever -g 全局安装

输入forever若是报错bash: forever: command not found,则须要创建一个软链接:

找到forever安装路径npm list -g --depth 0

[root@frogo2 ~]# npm list -g --depth 0 /usr/local/src/node-v8.11.3-linux-x64/lib ├── forever@0.15.3 └── npm@5.6.0 

/usr/local/src/node-v8.11.3-linux-x64/lib/node_modules/forever就是安装路径,你也能够打开MobaXterm终端去查看它的位置,而后使用ln -s创建软链接

ln -s /usr/local/src/node-v8.11.3-linux-x64/lib/node_modules/forever/bin/forever /usr/bin/forever 

再次输入forever 就不会报错command not found 了,下面是forever的命令

//用forever启动 forever start xxx.js

//重启 forever restart xxx.js

//查看进程 forever list

//中止 forever stop xxx.js

咱们能够用如下命令启动app.js

cd /home/blog/ forever start app.js 

出现如下信息表示成功启动,这个时候,你关掉了MobaXterm终端也不要紧。

warn:    --minUptime not set. Defaulting to: 1000ms warn: --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms info: Forever processing file: app.js 

而后用阿里云服务器公网的IP+7000端口号,就能够访问到该blog的页面了。

Step6.在CentOS7上安装Nginx服务器并绑定域名到博客

阿里云的CentOS7默认是没有安装WEB服务器的,基本主流的WEB服务器就是apache和nginx,若是安装了WEB服务器,80端口默认是打开的,你能够用netstat -an|grep :80 查看是否安装了WEB服务器。

在这里,我推荐用nginx,由于轻量级,比较简单,具体安装教程也相对容易,请参考教程http://www.javashuo.com/article/p-nhuwsndd-eo.html

安装完nginx之后进入/usr/local/nginx/sbin/下执行./nginx启动WEB服务,这个时候你输入阿里云ECS的公网IP看到粗体Welcome to nginx!字样信息表示安装和启动nginx成功。因为博客的程序端口是7000,而默认web服务器是80,在这里你须要在ngnix的conf文件设置一下代理 ,首先进入到/usr/local/nginx/conf/目录下,打开目录下的ngnix.conf文件,找到server{}代码块,在location /{}里面增长proxy_pass http://127.0.0.1:7000;,这个地址是指向blog程序的,另外把你须要绑定的域名写在server_name 后面,其余的项被注释的你能够自由配置。

server {
        listen       80; #server_name localhost; server_name www.frogo.me;(须要绑定的域名) #root /home/frogo; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://127.0.0.1:7000;(指向7000,就是你node.js博客程序的端口) #root /home/frogo; #index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } 

而后 cd 到/usr/local/nginx/sbin/下面,执行 nginx -s reload,便可成效,这个时候剩下最后一件事,就是将你的域名的A记录绑定到你的ECS服务器的公网IP上面。不久之后,当你访问域名,便可看到你的blog程序。

做者:frogo 连接:https://www.jianshu.com/p/f8b0d088a032 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。