在阿里雲ECS CentOS7上部署基於MongoDB+Node.js的部落格

frogo發表於2018-07-30

前言:這是一篇教你如何在阿里雲的ECS CentOS 7伺服器上搭建一個個人部落格的教程,教程比較基礎,筆者儘可能比較詳細的把每一步都羅列下來,包括所需軟體的下載安裝和域名的繫結,筆者在此之前對Linux系統也是瞭解甚少,通過這個過程,自感學到很多東西,我喜歡用文字整理並且分享,也希望因此交到更多的朋友,可能以下教程存在很多描述不清或者措辭不當的地方,還請資深人士給予指出。即使你是小白,也沒關係,一步一步按照教程來,可能會遇到一些困難,多百度一下,或者跟我交流,都OK的。在教程之前,你需要對整個流程有一個初步全面的瞭解,主要是安裝的軟體列表和之間的關係。雖然這個教程是基於我自己開發的一個部落格程式(前端工程師最好的全棧開發實踐-設計開發屬於自己的nodejs部落格)來部署的,應該說除了step5以外,其他步驟都是通用的。當你用優惠券在阿里雲購買了一個ECS伺服器後,你需要選擇一個映象作為系統平臺,支援你的程式執行,我這裡用阿里自帶提供的Cent OS 7,教程也是以CentOS 7為根本。接著你需要在CentOS平臺上安裝一些軟體去支撐你的部落格,這些軟體有以下:

  • WEB伺服器(Nginx or Apache)用來做域名繫結和指向,這裡是Nginx
  • Node.js(支撐你的程式執行)
  • MongoDB(資料庫,支撐你的部落格資料儲存)

另外你還需要在你的windows系統安裝一個連線CentOS上MongoDB資料庫的工具Robomongo用於測試連線資料庫和檢視資料庫資訊,還有一個連線遠端ECS伺服器的工具,我推薦用MobaXterm。

Step1. 使用MobaXterm終端在windows上連線阿里雲CentOS伺服器

這個終端左側有一個目錄樹,你可以用它像ftp一樣方便的上傳,編輯,下載檔案,也支援從windows拖動到目錄下,當然你可以在右側一直使用命令列,對於敲命令列生疏的朋友是一個幫助。

alt

連線很簡單,依次點選左上角Session,彈窗左上角點選SSH,填寫IP地址和使用者名稱,點選儲存即可,請看下圖:

alt

Step2. 在CentOS7上安裝Node.js

安裝有不同方式,這裡用個人覺得比較簡單的直接部署方式:

進入相應目錄,下載bin包

開啟MobaXterm終端,一般是進入到/usr/local/src/下

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)

wget https://nodejs.org/dist/v8.11.3/node-v8.11.3-linux-x64.tar.xz
複製程式碼

解壓包

等待下載完成之後,在命令列輸入 ls,或者點選MobaXterm終端左側目錄樹到當前目錄下,你會看到node-v8.11.3-linux-x64.tar.xz檔案,接著用下面的兩行命令將xz檔案先解壓成tar檔案,再解壓成資料夾。

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 /usr/bin/node
ln -s /usr/local/src/node-v8.11.3-linux-x64/bin /usr/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,因為輕量級,比較簡單,具體安裝教程也相對容易,請參考教程https://www.cnblogs.com/jerrypro/p/7062101.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程式。

相關文章