做者:郭一实
连接:https://zhuanlan.zhihu.com/p/20940096
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。node
背景git
前一段时间,是经过百度云的BAE部署本身的Node应用的,不过随着应用的不断开发,BAE的限制不断制约了应用的使用。因而着手将应用迁移到阿里云的ECS上去。本文便是介绍了如何在ECS上搭建Node环境,并将本地制做好的应用进行发布。github
环境介绍web
本地:Mac OSX 10.11.4,应用采用的技术:Node.js + Express.jsnpm
远端服务器:阿里云ECS(1核CPU、1GB内存),IP:123.57.205.23,系统为CentOS7.0json
Github:帐户名:e10101ubuntu
系统架构centos
服务器部署Node的应用,并在3000端口进行监听。本地代码开发测试后,更新到Github私人仓库。而后经过pm2部署远程服务器。数组
服务器端安装必要的软件浏览器
拟安装以下应用:Node、npm、pm2。
经过预留的帐号密码登陆系统,终端中输入:
ssh root@123.57.205.23
更新软件:
yum update -y
更新完毕后,安装Node.js:
yum install nodejs -y
安装Npm:
yum install yum -y
安装pm2:
npm install pm2 -g
(可选)服务器端建立新用户
为服务器安全起见,建立用户(用户名:yishi):
useradd yishi
设置密码:
passwd yishi
添加sudo权限:
usermod -aG wheel yishi
(可选)服务器端关闭root用户的ssh访问:
为服务器安全起见,关闭root帐户的远程访问。
打开配置文件:
vi /etc/ssh/sshd_config
找到以下设置,并修改yes为no:
PermitRootLogin no
保存文件后,重启sshd服务:
service sshd restart
退出root帐户,并使用新建立用户访问。
本地安装pm2
Macbook中,因为已经具有了node以及npm,再次不介绍如何安装上述两个软件了。与服务器端相似,经过以下命令安装pm2:
npm install pm2 -g
若是可获得版本号,则说明安装成功:
pm2 -v
设置Github仓库
此处为方便演示,咱们在Github上新建一个私人(private)仓库,名为pm2app。
仓库建立后,还须要设置Deploy keys,依次点击Settings > Deploy keys > Add deploy key。其中的Key部分,能够在服务器端上经过ssh-keygen生成,并经过
cat ~/.ssh/id_rsa.pub
便可输出。输出后,复制到deploy key中点击Add key,完成设置。
完成上述设置后,须要本地的应用代码关联此Github仓库,按照Github官网的介绍,经过在本地应用下执行:
git remote add origin https://github.com/e10101/pm2app.git
git push -u origin master
来完成设置。
本地pm2的ecosystem配置
在本地的目标应用下,输入:
pm2 ecosystem
生成pm2的部署配置模板文件以下:
{
/**
* Application configuration section
* PM2 - Application Declaration
*/
apps : [
// First application
{
name : "API",
script : "app.js",
env: {
COMMON_VARIABLE: "true"
},
env_production : {
NODE_ENV: "production"
}
},
// Second application
{
name : "WEB",
script : "web.js"
}
],
/**
* Deployment section
* PM2 - Deployment
*/
deploy : {
production : {
user : "node",
host : "212.83.163.1",
ref : "origin/master",
repo : "git@github.com:repo.git",
path : "/var/www/production",
"post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production"
},
dev : {
user : "node",
host : "212.83.163.1",
ref : "origin/master",
repo : "git@github.com:repo.git",
path : "/var/www/development",
"post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env dev",
env : {
NODE_ENV: "dev"
}
}
}
}
应为目前咱们仅部署一个应用,所以,先把没必要要的信息删除,即删除apps部分的第二项。同时把咱们的目标文件改成你应用的入口文件,此处修改成Express.js的默认设置,即:
script : "./bin/www",
apps部分就设置完毕了,而后再设置deploy部分。其中production用于生产环境,dev用于开发环境,为了演示,咱们只设置production部分。
下面依次介绍各个设置:
production : {
user : "登陆远程服务器的用户名,此处填写咱们建立的yishi",
host : "远程服务器的IP或hostname,此处能够是数组同步部署多个服务器,不过鉴于咱们只有一个服务器,所以咱们填写123.57.205.23",
ref : "远端名称及分支名,此处填写origin/master",
repo : "git仓库地址,此处填写git@github.com:e10101/pm2app.git",
path : "远程服务器部署目录,须要填写user具有写入权限的目录,此处填写/home/yishi/www/production",
"post-deploy" : "部署后须要执行的命令,此处填写npm install && pm2 startOrRestart ecosystem.json --env production"
},
整理后,按照咱们的设置,应为:
production: {
user: "yishi",
host: "123.57.205.23",
ref: "origin/master",
repo: "git@github.com:e10101/pm2app.git",
path: "/home/yishi/www/production",
"post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"
},
由于pm2的部署是经过ssh进行的,所以须要开通本地到远程服务器的无密码登陆,一样,在Mac下,经过ssh-keygen生成RSA公钥,并拷贝到远程服务器:
scp ~/.ssh/id_rsa.pub yishi@123.57.205.23:/home/yishi/.ssh/authorized_keys
上述命令中的yishi为用户名,执行时须要替换为你设置的用户名。
设置ssh完毕后,再看看整理完毕的ecosystem配置文件,以下:
{
/**
* Application configuration section
* PM2 - Application Declaration
*/
apps : [
// First application
{
name : "pm2app",
script : "./bin/www",
env: {
COMMON_VARIABLE: "true"
},
env_production : {
NODE_ENV: "production"
}
}
],
/**
* Deployment section
* PM2 - Deployment
*/
deploy : {
production : {
user: "yishi",
host: "123.57.205.23",
ref: "origin/master",
repo: "git@github.com:e10101/pm2app.git",
path: "/home/yishi/www/production",
"post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"
}
}
}
在本地应用目录下,执行pm2 deploy命令:
pm2 deploy ecosystem.json production setup
提示错误:
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
failed to clone
Deploy failed
此时主要是在远程服务器中,并未将http://github.com加入known_hosts,在服务器端经过以下命令设置:
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
在本地继续执行部署命令:
pm2 deploy ecosystem.json production setup
此时,如无其余问题,输出应提示:
○ setup complete
--> Success
至此,pm2的部署设置完毕。
pm2部署
pm2的部署设置完毕后,接下来就是实际部署了。
在部署前,现将本地代码修改并进行git提交:
git add .
git commit -m "update ecosystem"
git push
提交后,在本地应用目录,输入以下命令进行生产环境的部署:
pm2 deploy ecosystem.json production
能够看到以下输出:
[PM2][WARN] Applications pm2app not running, starting...
[PM2] App [pm2app] launched (1 instances)
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ pm2app │ 0 │ fork │ 1028 │ online │ 0 │ 0s │ 11.246 MB │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
○ hook test
○ successfully deployed origin/master
--> Success
部署成功,在远程服务器查看端口状况:
netstat -antp
能够看到应用默认部署的3000端口已经开放了。经过浏览器打开:
http://123.57.205.23:3000/
能够看到部署的Web应用能够访问了。(若是netstat -antp中可见3000端口可访问,能够检查下ECS的防火墙设置,确保3000端口对外开放)
pm2其余命令
应用列表:
pm2 list
应用信息(查看应用编号为0的信息):
pm2 show 0
(重要)服务器端设置pm2开机自动启动
开启启动设置,此处是CentOS系统,其余系统替换最后一个选项(可选项:ubuntu, centos, redhat, gentoo, systemd, darwin, amazon):
pm2 startup centos
而后按照提示须要输入的命令进行输入:
sudo su -c "env PATH=$PATH:/usr/bin pm2 startup centos -u yishi --hp /home/yishi"
保存pm2设置:
pm2 save
如今从新启动系统,测试是否能够开机启动:
sudo reboot
等系统重启后,经过浏览器检查系统是否自动启动:
http://123.57.205.23:3000/
若是启动正常,说明设置成功!
以上就是如何经过pm2部署Node应用到服务器生成环境的总结。