我们上传服务器的公钥到 git 仓库
cat ~/.ssh/id_rsa.pub
复制,去 github 的设置中添加公钥,
clone 一个项目
公钥上传到 github 后,我们的服务器就有这个 github 账户的权限了,让我们来 clone 一个项目吧。
cd ~
mkdir website
cd website
git clone [email protected]:18810666595/nodetest.git
clone 成功啦,ls
查看到了项目文件目录
pm2
pm2 工具能够守护 nodejs 服务,能实现平滑重启,代码自动更新,以及从本地到线上的部署。
关于 pm2 部署的文档可以去官网查看 pm2官网 http://pm2.keymetrics.io/
pm2 部署步骤:
- 在本地的 git 仓库下,新建一个
ecosystem.json
文件
添加配置信息
{
"apps": [
{
"name": "nodetest",
"script": "app.js",
"env": {
"COMMON_VARIABLE": "true"
},
"env_production": {
"NODE_ENV": "production"
}
}
],
"deploy": {
"production": {
"user": "cg",
"host": ["47.94.198.140"],
"port": "22",
"ref": "origin/master",
"repo": "[email protected]:18810666595/nodetest.git",
"path": "/www/website/production",
"ssh_options": "StrictHostKeyChecking=no",
"env": {
"NODE_ENV": "production"
}
}
}
}
- 切换到阿里云服务器,创建
/www/nodetest
文件目录(远程)
sudo mkdir /www
cd /www
sudo mkdir nodetest
- 让 pm2 连上服务器,自动部署任务
pm2 deploy ecosystem.json production setup
发现连接失败了,这是因为用户 cg 的权限不够,无权操作位于根路径的 /www
文件夹
修改用户 cg 的权限
切换到阿里云服务器,修改 /www/nodetest/
文件对用户 cg 的权限为可读、可写、可执行。(远程)
sudo chmod 777 /www/nodetest/
再次让 pm2 连上服务器,自动部署任务(本地)
切换到本地命令行,再次执行 pm2 的自动部署
pm2 deploy ecosystem.json production setup
哈哈, success 成功啦
去服务器上检查一下吧
切换到阿里云服务器(远程)
cd /www/nodetest/production
ls
可以看到有三个文件夹,current, shared, source
- current: 当前服务运行的文件夹
- shared: 日志文件等共享数据
- source: 克隆下来的源代码
进入 current 文件夹查看,发现就是我们 push 到 github 的文件。
本地控制远端代码更新、服务重启
pm2 部署项目的原理:
- 通过本地的 pm2 工具在本地命令行登录服务器,
- 通知服务器从 github 拉取到到服务器,部署到相应的文件夹中。
pm2 部署项目
我们先把
ecosystem.json
配置文件也 push 到 github 上。然后执行命令让 pm2 自动部署
pm2 deploy ecosystem.json production
发现失败了,阿里云服务器上没有 pm2 这个指令
这是因为 pm2 在服务器上使用的是非交互的 ssh 连接方式。
切换到服务器
切换到服务器(远程)
vi .bashrc
把下面三项注释掉(加 #)
source .bashrc
如果出错,就看这篇 stackoverflow
回到本地终端
执行命令让 pm2 自动部署。
pm2 deploy ecosystem.json production
成功啦,哈哈!
去服务器上 pm2 list
查看进程,也能查看到
修改 nginx 配置信息,可以通过域名访问到这个网页
切换到阿里云服务器(远程)
cd /etc/nginx/conf.d/
sudo vi test-chengong-shop-3999.conf
//增加配置项
配置参数为
upstream nodetest {
server 127.0.0.1:3999;
}
server {
listen 80;
server_name test.chengong.shop;
location / {
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://nodetest;
proxy_redirect off;
}
}
我们去浏览器访问 test.chengong.shop
域名,发现 502 报错
这是因为 iptables 防火墙禁止了 3999 端口的请求。
修改 iptables 的配置
sudo vi /etc/iptables.up.rules
增加两条配置,允许 3999 端口的访问
重启 iptables
sudo iptables-restore < /etc/iptables.up.rules
刷新我们的浏览器,或者再次访问 test.chengong.sh op
域名,发现服务启动成功啦!!
将本地的改动同步到线上
我们的网站服务跑在了服务器里,如果我们的本地项目做了修改,如何同步到线上呢? 三步走
- 修改本地项目
- push 本地代码到 github
- 执行 pm2 部署指令(在本地执行)
pm2 deploy ecosystem.json production
修改成功啦!
使用 npm 的 script 脚本命令实现自动化的上传到 github 并 执行 pm2 同步更新服务器远端代码。
在本地项目目录下,初始化一个 package.json
文件
npm init
一路回车默认,项目目录下就生成了一个 package.json 文件,编辑它,在 script
这一项中添加一条指令 update
,注意上一条指令最后要加逗号 ,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"update": "git add . && git commit -am \"update\" && git push && pm2 deploy ecosystem.json production"
}
这样我们就能用 npm 指令实现自动化一条龙服务了,在命令行中,输入
npm run update
可以看到自动进行了上传到 github,并且自动执行 pm2 更新同步到远程服务器。
我们去浏览器刷新页面,或者再次访问 test.chengong.shop
域名,可以看到自动更新了,以后修改了本地项目,只要执行
npm run update
这个指令就自动一条龙了