阿里云ECS服務(wù)器部署Node.js項目全過程詳解

本文詳細介紹如何部署NodeJS項目到阿里云ECS上钙蒙,以及本人在部署過程中所遇到的問題茵瀑、坑點和解決辦法,可以說是全網(wǎng)最全最詳細的教程了躬厌。同時講解了如何申請阿里云免費SSL證書马昨,以及一臺ECS服務(wù)器配置多網(wǎng)站的Nginx配置方法等。

原文鏈接:http://www.kovli.com/2024/09/12/ecs-deploy/

作者:Kovli

1. 云服務(wù)器選擇

阿里云ECS是阿里巴巴旗下的云服務(wù)器提供商

本文基于阿里云ECS云服務(wù)器講解,目前有個人版鸿捧,企業(yè)版抢呆,學(xué)生版可以選擇。

個人版

學(xué)生版

企業(yè)版

優(yōu)惠券

這里以個人版 為例笛谦,流程都一樣的。

選購好云服務(wù)器昌阿,初學(xué)者1核0.5G就足夠了饥脑,也就是默認(rèn)的第一個入門級配置。

由于阿里云ECS購買頁面經(jīng)常改版懦冰,以下購買流程圖僅供參考灶轰,入門的話參數(shù)都選最低配置即可

ecs01.jpg

操作系統(tǒng)選擇CentOS系統(tǒng) 這里選擇7.3版本

ecs02.jpg

勾選分配公網(wǎng)IP,選擇帶寬為1M

ecs03.jpg

選擇自定義密碼刷钢,設(shè)置ssh登錄密碼(登錄名root)笋颤,后面要用,請牢記此密碼

ecs04.jpg

購買好以后内地,進入控制臺伴澄,工作臺選擇云服務(wù)器ECS

ecs05.jpg

選擇對應(yīng)的ECS服務(wù)器,在箭頭所指位置阱缓,即可獲取該服務(wù)器的公網(wǎng)地址非凌,如圖

ecs06.jpg

記住公網(wǎng)IP,下一步要用到荆针。

2. 登陸服務(wù)器

打開 Terminal敞嗡,

輸入 ssh root@公網(wǎng)IP

輸入之前自己設(shè)的服務(wù)器登錄密碼(如果忘了航背,可以去上圖右側(cè)的管理-更多-重置密碼)

即可登陸服務(wù)器喉悴。

首次登陸可能會詢問公鑰,yes 即可玖媚。

關(guān)于 ssh 登陸箕肃,想要詳細了解的可以看阮一峰寫的這篇ssh原理與應(yīng)用

上述操作是使用 root 用戶身份登陸,會直接進入到下圖 紅色箭頭標(biāo)出的 root 目錄下最盅。

cd .. 跳轉(zhuǎn)到上一層, 再 ls -a 突雪,就可以看到類似下圖的目錄結(jié)構(gòu)了。

[圖片上傳失敗...(image-393844-1726210259027)]
圖片引用自《鳥哥的Linux》

3. 安裝Nginx

阿里云官方Nginx配置教程

1. 在配置 nginx 時涡贱,可能會依賴于 PCRE 包和 zlib 包咏删,先進行安裝:

cd /usr/local 切換目錄

cd /usr/local
yum -y install pcre pcre-devel
yum install -y zlib-devel

2. 下載 nginx,這里nginx版本號可以根據(jù)需要選擇问词,我選擇1.13.3是當(dāng)時最新的版本了督函,下面的node版本、mongodb版本都可以根據(jù)自己的需要選擇

nginx官網(wǎng)版本列表

cd /usr/local/src 
wget http://nginx.org/download/nginx-1.13.3.tar.gz

3. 解壓縮

tar -xvzf nginx-1.13.3.tar.gz

4. 配置nginx

下載解壓openssl

wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz

tar -xvzf openssl-1.0.2l.tar.gz 

cd 進入nginx解壓包里,執(zhí)行之前安裝的pcre-devel與openssl-devel解決依賴問題

cd nginx-1.13.3
yum -y install pcre-devel openssl openssl-devel

再執(zhí)行配置腳本來進行編譯預(yù)處理

./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/nginx.conf --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-openssl=/usr/local/src/openssl-1.0.2l

成功后顯示如下信息辰狡,

Configuration summary
  + using system PCRE library
  + using OpenSSL library: /usr/local/src/openssl-1.0.2l
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx"
  nginx configuration file: "/usr/local/nginx/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

make

make && make install

5. 使用 openssl 生成證書(以下介紹的是自己生成的供學(xué)習(xí)用锋叨,正常面向市場的產(chǎn)品請用認(rèn)證的)

openssl req -new -x509 -nodes -out server.crt -keyout server.key

移動證書到nginx文件夾

mv server.crt /usr/local/nginx
mv server.key /usr/local/nginx

認(rèn)證的SSL證書,申請阿里云免費ssl證書:

如何申請免費SSL證書 - 進入數(shù)字證書管理服務(wù)控制臺

TIP:需要有個域名來綁定ssl證書 阿里云域名注冊

ecs07.jpg

6. 修改 nginx 配置文件:

vi /usr/local/nginx/nginx.conf

修改如下


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    # 關(guān)閉錯誤頁面的nginx版本數(shù)字宛篇,提高安全性
    server_tokens off;

    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    include /usr/local/nginx/sites-enabled-server/*;


}

新建文件夾用于存放多網(wǎng)站的nginx配置文件

cd /usr/local/nginx/
mkdir sites-enabled-server

sites-enabled-server里面新增若干文件娃磺,以便這個ECS可以給多網(wǎng)站使用

vim default


server {
        listen 80;
        server_name _;

        return 404;
}

server {
        listen       80;
        server_name  你的域名.com www.你的域名.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://127.0.0.1:nodejs配置的端口號;
        }

        #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;
        #}
    }

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

vim default-ssl

server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      server.crt;
        ssl_certificate_key  server.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
             proxy_pass http://127.0.0.1:nodejs配置的端口號;
        }
    }
~       

繼續(xù)新增網(wǎng)站,例如叫倍,vim mywebsite.cn

server {
        listen       80;
        server_name  mywebsite.cn www.mywebsite.cn;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://127.0.0.1:nodejs配置的mywebsite的端口號;
        }

        #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;
        #}
    }

7. 啟動nginx

/usr/local/nginx/sbin/nginx

4. 安裝 node

  • node -- 編譯后二進制文件應(yīng)在/usr/local/bin/node 下

  • mongodb -- 安裝在/usr/local/mongodb 下

下面就一步一步來

1. 首先升級CentOS
yum -y update

2. 升級后偷卧,跳轉(zhuǎn)到 /usr/local/src , 這個文件夾通常用來存放軟件源代碼

cd /usr/local/src

3. 下載 nodejs 代碼,也可以使用scp命令直接上傳吆倦,因為下載實在太慢了听诸。

wget http://nodejs.org/dist/node-latest.tar.gz(下載最新)
wget http://nodejs.org/dist/v7.10.0/node-v7.10.0.tar.gz(推薦,穩(wěn)定版本)

4. 解壓
tar -xzvf node-v0.12.5.tar.gz

5. 進入解壓后的文件夾
cd node-v0.12.5

6. 執(zhí)行配置腳本來進行編譯預(yù)處理
./configure

7. 安裝v8可能有警告蚕泽, //需要安裝gcc

8. sudo yum install gcc-c++ //安裝gcc

9. 編譯源代碼及安裝

當(dāng)編譯完成后晌梨,需要使之在系統(tǒng)范圍內(nèi)可用, 編譯后的二進制文件將被放置到系統(tǒng)路徑,默認(rèn)情況下须妻,Node二進制文件應(yīng)該放在/user/local/bin/node文件夾下

make && make install

10. 安裝pm2仔蝌,建議 global 安裝
npm install pm2 -g

11. 建立超級鏈接, 不然 sudo node 時會報 "command not found"

  • sudo ln -s /usr/local/bin/node /usr/bin/node
  • sudo ln -s /usr/local/lib/node /usr/lib/node
  • sudo ln -s /usr/local/bin/npm /usr/bin/npm
  • sudo ln -s /usr/local/bin/node-waf /usr/bin/node-waf
  • sudo ln -s /usr/local/bin/pm2 /usr/bin/pm2

Nodejs到這里就基本安裝完成了。

5. 安裝mongodb

  • 軟件安裝位置:/usr/local/mongodb

  • 數(shù)據(jù)存放位置:/var/mongodb/data

  • 日志存放位置:/var/mongodb/logs

1. 首先下載安裝包

MongoDB下載中心

cd /usr/local
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.6.tgz

2. 解壓安裝包璧南,重命名文件夾為mongodb

tar zxvf mongodb-linux-x86_64-2.6.0.tgz
mv mongodb-linux-x86_64-2.6.0 mongodb

3. 創(chuàng)建數(shù)據(jù)和日志存放目錄

mkdir /var/mongodb
mkdir /var/mongodb/data
mkdir /var/mongodb/logs

4. 打開rc.local文件掌逛,添加CentOS開機啟動項:

vim /etc/rc.d/rc.local

5. 將mongodb啟動命令追加到本文件中,讓mongodb開機自啟動:

/usr/local/mongodb/bin/mongod --dbpath=/var/mongodb/data --logpath /var/mongodb/logs/log.log --logappend --auth --port 27017 --fork

6. mongo權(quán)限設(shè)置

sudo vi /etc/mongod.conf

較新版本的增加安全校驗的方法是配置文件最后面加上(網(wǎng)上很多舊版寫法都是無效的)

security: authorization: enabled

如下所示:

systemLog:
 destination: file
 path: /var/mongodb/logs/log.log
 logAppend: true
storage:
 dbPath: /var/mongodb/data
net:
 bindIp: 127.0.0.1
security:
 authorization: enabled

然后重啟mongodb即可司倚,這里說明下豆混,初學(xué)也可以不設(shè)這個選項,這樣操作數(shù)據(jù)庫就不需要用戶名密碼了动知,從安全的角度看還是設(shè)了比較好皿伺,后面都是以設(shè)了安全校驗來講解。

7. 關(guān)閉 vim 后盒粮,直接手動啟動mongodb

/usr/local/mongodb/bin/mongod --dbpath=/var/mongodb/data --logpath /var/mongodb/logs/log.log --logappend --auth --port 27017 --fork

8. 啟動mongo shell

cd /usr/local/mongodb/bin/
./mongo

9. 在 mongo shell 中創(chuàng)建超級管理員以及相關(guān)數(shù)據(jù)庫到管理員及數(shù)據(jù)庫

use admin //admin database
db.createUser({
 user: "myAdmin",
 pwd: "******",
 roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
 }
 )

10. 使用特權(quán)進入

./mongo -u "mydmin" -p "******" --authenticationDatabase "admin"

11. 創(chuàng)建新數(shù)據(jù)庫鸵鸥,并設(shè)置管理員

> use mywebsite
switched to db mywebsite
> db.createUser(
... {
... user: "mywebsiteAdmin",
... pwd: "******",
... roles: [ { role: "readWrite", db: "mywebsite" }]
... }
... )
> use secondwebsite
switched to db secondwebsite
> db.createUser(
... {
... user: "secondwebsiteAdmin",
... pwd: "******",
... roles: [ { role: "readWrite", db: "secondwebsite" }]
... }
... )

以后進入其中的數(shù)據(jù)庫需要權(quán)限,如果用超級管理員則不需要

db.auth("mywebsiteAdmin", "******")

12. mongodb數(shù)據(jù)遷移(用于從指定地址數(shù)據(jù)庫遷移到云服務(wù)器上)

//存放到某個目錄
./mongodump -h 127.0.0.1:27017 -d mywebsite -o /home/mywebsite -u "mywebsiteAdmin" -p "******"

//取出
./mongorestore  -h 127.0.0.1:27017 -d mywebsite /home/mywebsite/mywebsite -u "mywebsiteAdmin" -p "******"

13. mongodb連接需要安全校驗的配置
以app.js為例丹皱,

設(shè)置數(shù)據(jù)庫連接
vim app.js

數(shù)據(jù)庫連接類似下面的格式妒穴,由于數(shù)據(jù)庫安裝在同一服務(wù)器,因此 host 為127.0.0.1:

var dbUrl = 'mongodb://用戶名:登陸密碼@127.0.0.1/databaseFoo';
mongoose.connect(dbUrl)

例如我的app.js里的這一段代碼

// 配置數(shù)據(jù)庫
mongoose.Promise = global.Promise;
let mongoConnectUrl = 'mongodb://' + config.database.USERNAME + ':' + config.database.PASSWORD + '@' + config.database.HOST;
mongoose.connect(mongoConnectUrl);

到這里 mongodb 基本已經(jīng)安裝設(shè)置完成了摊崭。

6. 上傳NodeJS代碼到服務(wù)器上

把nodejs的程序放在 /home

cd /home

我使用碼云管理代碼讼油。它的私有庫是免費的∧佤ぃ基本操作和 github 一樣矮台。

1. 注意公鑰的生成與添加

ssh-keygen -t rsa -C "mywebsite@gmail.com"

查看與復(fù)制公鑰

cat ~/.ssh/id_rsa.pub

2. git安裝

yum install git

3. 復(fù)制代碼:
git clone https://git.oschina.net/xxxxxxx/nodeapp.git //你的repo地址

4. 進入 nodeapp 文件夾
cd nodeapp
(若后續(xù)代碼變更乏屯,提交到 git repo 后直接git pull即可部署代碼)

5. 安裝nodeapp的所有依賴

npm install

注意,使用淘寶鏡像避免未知問題

npm --registry https://registry.npm.taobao.org install

7. 啟動Node服務(wù)

這里根據(jù)你nodejs所使用的框架不同而不同瘦赫,

例如koa2可以在package.jsonscripts里設(shè)置辰晕,參考阮一峰的npm scripts 使用指南

thinkjs或者egg都有自己的啟動方式,就不一一敘述了

這里要注意的是确虱,如果直接 npm startnode app.js 啟動含友,則一旦退出 ssh 遠程登陸,服務(wù)就會停止運行校辩。

使用pm2就可以解決這個問題唱较,如果跟著教程走,你已經(jīng)全局安裝了pm2了,可以直接使用

8. 其他說明

這篇文章是匯聚了網(wǎng)上諸多教程及本人從零開始部署遇到的各種問題和坑點的解決方案所形成的一篇詳細教程,由于涉及點比較多和泌,加上版本更新迭代读拆,如果在部署過程中遇到問題,可以在下面評論提問(需要登錄Github賬號才可以評論)纸镊,或者給我發(fā)郵件(admin@kovli.com)倍阐。

本文所述的本地操作系統(tǒng):MacOS系統(tǒng),阿里云ECS操作系統(tǒng):CentOS 7.3逗威,本地如果是Windows環(huán)境終端操作可能有所不同峰搪。

Nginx的一些常用操作方法:

/usr/local/nginx/sbin/nginx # 啟動
/usr/local/nginx/sbin/nginx -t #檢查配置文件編寫是否正確
/usr/local/nginx/sbin/nginx -s reload #Nginx平滑重啟 (一般用這個就可以了)
/usr/local/nginx/nginx.conf #配置文件。

文中已引用了部分參考文章凯旭,同時感謝下面的參考文章的作者:
http://www.reibang.com/p/0496ef49b2a5
https://segmentfault.com/a/1190000004051670
http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/
https://segmentfault.com/q/1010000003937372


版權(quán)聲明:

轉(zhuǎn)載時請注明作者Kovli以及本文地址:
http://www.kovli.com/2024/09/12/ecs-deploy/


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末概耻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子罐呼,更是在濱河造成了極大的恐慌鞠柄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫉柴,死亡現(xiàn)場離奇詭異厌杜,居然都是意外死亡,警方通過查閱死者的電腦和手機计螺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門夯尽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人登馒,你說我怎么就攤上這事匙握。” “怎么了谊娇?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵肺孤,是天一觀的道長罗晕。 經(jīng)常有香客問我,道長赠堵,這世上最難降的妖魔是什么小渊? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮茫叭,結(jié)果婚禮上酬屉,老公的妹妹穿的比我還像新娘。我一直安慰自己揍愁,他們只是感情好呐萨,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著莽囤,像睡著了一般谬擦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朽缎,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天惨远,我揣著相機與錄音,去河邊找鬼话肖。 笑死北秽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的最筒。 我是一名探鬼主播贺氓,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼床蜘!你這毒婦竟也來了辙培?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤邢锯,失蹤者是張志新(化名)和其女友劉穎虏冻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弹囚,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡厨相,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸥鹉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛮穿。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖毁渗,靈堂內(nèi)的尸體忽然破棺而出践磅,到底是詐尸還是另有隱情,我是刑警寧澤灸异,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布府适,位于F島的核電站羔飞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏檐春。R本人自食惡果不足惜逻淌,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疟暖。 院中可真熱鬧卡儒,春花似錦、人聲如沸俐巴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欣舵。三九已至擎鸠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缘圈,已是汗流浹背糠亩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留准验,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓廷没,卻偏偏與公主長得像糊饱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子颠黎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容