前言:這是一篇教你如何在阿里雲的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拖動到目錄下,當然你可以在右側一直使用命令列,對於敲命令列生疏的朋友是一個幫助。
連線很簡單,依次點選左上角Session,彈窗左上角點選SSH,填寫IP地址和使用者名稱,點選儲存即可,請看下圖:
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一欄填寫資料庫名和使用者名稱密碼
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程式。