本文詳細介紹如何部署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é)生版可以選擇。
這里以個人版 為例笛谦,流程都一樣的。
選購好云服務(wù)器昌阿,初學(xué)者1核0.5G就足夠了饥脑,也就是默認(rèn)的第一個入門級配置。
由于阿里云ECS購買頁面經(jīng)常改版懦冰,以下購買流程圖僅供參考灶轰,入門的話參數(shù)都選最低配置即可
操作系統(tǒng)選擇CentOS
系統(tǒng) 這里選擇7.3版本
勾選分配公網(wǎng)IP,選擇帶寬為1M
選擇自定義密碼刷钢,設(shè)置ssh登錄密碼(登錄名root)笋颤,后面要用,請牢記此密碼
購買好以后内地,進入控制臺
伴澄,工作臺選擇云服務(wù)器ECS
選擇對應(yīng)的ECS服務(wù)器,在箭頭所指位置阱缓,即可獲取該服務(wù)器的公網(wǎng)地址
非凌,如圖
記住公網(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
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ù)自己的需要選擇
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證書 阿里云域名注冊
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. 首先下載安裝包
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.json
的scripts
里設(shè)置辰晕,參考阮一峰的npm scripts 使用指南
thinkjs或者egg都有自己的啟動方式,就不一一敘述了
這里要注意的是确虱,如果直接 npm start
或 node 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/