云服务远程代码同步与nodejs+PM2部署

#部署生产环境的基本条件

1.独立域名+域名备案

2.云服务器或可连接网路的自备服务器+配置服务器应用环境

3.安装数据库

4.项目远程发布与更新

什么一级域名?

一级域名又称为顶级域名,大家需要注意的是, www.iisp.com这种形式的域名并不是一级域名,他只是一个二级域名,也就是说www只是一个主机名。 真正的一级域名是由一个合法字符串+域名后缀组成。所以,iisp.com这种形式的域名才是一级域名。iisp是域名主体,.com是域名后缀。可以是.net域名后缀,也可以是.hu域名后缀等。

什么是二级域名?

所谓的二级域名实际上就是一个一级域名下面的主机名。顾名思义,他是在一级域名前面加上了一个字符串,比如asdx.iisp.com.,他可以拥有根顶级域名同样的功能。并且通过设置,可以拥有和根顶级域名完全一样的功能。但这里并不是说一级域名和二级域名完全没有差别!

二级域名和顶级域名的差异:

*二级域名和一级域名还是有很大的差异的,最简单的差别就在于多使用二级域名的子网站,它自身的PR值往往要比一级域名低一个档次。

二级域名,是依附一级域名的存在而存在的,也就是说要是顶级域名消失了,二级域名也也会不复存在。*

关于ssl证书 可以不购买,可以再服务器上通过工具来生成免费证书

关于云主机 要选择大厂商,防止倒闭和被收购;

选择国内主机厂商,国内备案、连接速度和稳定性都很快;

1核1G 大约可以承受1万的用户量

阿里云主机默认会挂载一个系统盘,最好自己再挂载一个数据盘,这样即使清空数据盘也不会影响主机的系统运行,否则一旦重装系统,自己的应用就都没有了。

ssh远程登录服务器

1.不要用root用户去部署服务,要配置一个账户用于部署,防止root操作造成误删; 2.部署常用命令

  • ssh  用户名@远程ip地址       // ssh连接远程服务
  • logout     // 退出登录
  • .ssh ls       // 查看ssh下文件有多少曾经连接过的信息
  • 如果同一个ip的主机重装系统或者换了,ssh连接会出现“ ECDSA host key for icarusyu.me has changed and you have requested strict checking. Host key verification failed.”这样的错误,而无法连接; because 在主机子系统每次成功ssh连接远程操作,都会把你每个你访问过计算机的公钥(public key)都记录在主机的目录/Users/icarus/.ssh/known_hosts下,当下次访问相同子机服务器时,会核对公钥。如果公钥不同,会发出警告,避免你受到DNS Hijack之类的攻击。

解决方法: cd ~/.ssh        // 进入ssh记录文件; 然后ls,查看连接过的ssh记录, rm known_hosts删除连接记录,然后再执行ssh远程连接即可。

  • service ssh restart    // 重启ssh连接

  • fdisk -l     // 查看当前系统的盘信息

  • df -h        // 查看硬盘使用情况

  • cmd+r    或者  ctrl+r      // 清除当前命令行面板

  • rm -rf A.txt    // 删除A.txt文件

  • mv   A.txt  B.txt    // 在当前路径下修改A.txt 文件名为B.txt

  • ls    // 显示当前文件下的文件

  • ls -a    // 表示all,显示包括隐藏文件的所有文件

  • 最好不要用root权限去操作,我们来增加一个具有权限限制的账户zzf(这个名字可自己随意取): adduser    XXX(此处举例输入adduser  zzf,后面会以zzf这个账号来操作),然后输入或者不输入 Full Name []:、    Room Number []: 等信息即创建成功

  • 然后我们需要给该用户分配权限 gpasswd   -a  zzf  sudo      // 给zzf账户分配到sudo组中 sudo visudo      // 打开配置用户权限的文件进行编辑,编辑如下,在User privilege specification配置zzf的权限

上图中:%admin All=(All)  All   表示admin账户的权限也是最高的 ctrl+x    // 保存文件 shift+y    // 确认保存即可

通过配置密钥实现ssh无密码登录

cd ~/.ssh        // 进入ssh记录文件       然后ls,查看连接过的ssh记录(如果没有.ssh文件夹,就要mkdir .ssh新建该文件夹)
 * ssh-keygen -t rsa -b 4096 -C "2441150413@qq.com"        // 生成公钥和私钥(此处不用输入密码,直接多次回车默认就好,然后就会在.ssh文件夹下生成➜id_rsa和  id_rsa.pub两个文件) id_rsa    私钥
 id_rsa.pub   公钥

  • cat id-rsa    // 查看私钥信息
  • cat id-rsa.pub    // 查看公钥信息
  • eval "$(ssh-agent -s)"         // 开启ssh代理 cd ./ssh
  • ssh-add ~/.ssh/id_rsa        // 将私钥加入代理

然后再在服务器上同样执行以下操作:
ssh-keygen -t rsa -b 4096 -C "2441150413@qq.com"   eval "$(ssh-agent -s)"

  • ssh-add ~/.ssh/id_rsa      
    cd ./ssh  查看以下是否生成公钥和私钥文件
  • ssh-add ~/.ssh/id_rsa     
    然后还是在服务器执行以下:  
    vi  authorized_keys      // 新建授权文件
     shift+:   wq!   enter    // 退出编辑

下一步本地和服务器配对:
本地操作:
cat  id_rsa.pub       // 复制公钥
然后复制其全部内容
服务器操作:
vi  authorized_keys
i     // 在vi编辑状态下开始insert
粘贴刚才复制的内容,然后esc
shift+:   wq!   enter

  • 然后现在就可以在本地试一下ssh连接,就会发现不需要输入密码就可以连接了!

修改远程连接默认端口(默认为22)

sudo vi /etc/ssh/sshd_config

  • vi编辑快捷键
    ctrl+A    移动到行首
    ctrl+E    移动到行尾

新开一个tab,连接ssh,防止修改配置文件之后无法连接,所以保留当前窗口
下面开始修改文件内容配置:
Port  22    改为-》9999
USeDNS   no
末尾加一行  AllowUsers   zzf     
保存退出之后重启ssh      sudo  service ssh  resatrt
阿里云需要添加安全组配置,如下图把9999端口配置进去

新开一个ssh窗口执行ssh连接即可
ssh -p 9999 zzf@47.102.204.126

###关闭服务器root密码登录,安全更高一步 sudo vi /etc/ssh/sshd_config
将该文件中PermitRootLogin  no
然后退出保存,重启ssh
然后可以试试用root来登录,就会发现

防火墙iptables和Fail2Ban配置

Fail2Ban是根据系统日志作出相应的动作的防御性工具

安全设置还可以将内网服务器的ip和跳板机ip绑定,只允许跳板机连接; 通过本地机器连接跳板机,通过跳板机去连接真是服务器

#搭建nodejs的生产环境 1.安装vim open ssl build-essential libssl-dev wget curl git这一堆工具
sudo apt-get upgrade    // 更新apt的包
sudo apt-get install  vim open ssl build-essential libssl-dev wget curl git 
回车安装
2.安装nvm 在github上找到nvm,然后找到相应的脚本执行安装

To install or update nvm, you can use the install script using cURL:

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
or Wget:

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh
| bash
复制代码

然后重新打开一个ssh窗口
nvm   回车就可以看到nvm的许多命令,表示安装完成
nvm install node  或者直接输入版本号   nvm  install   v6.9.5
可选:可以将npm源改为taobao镜像;也可安装cnpm(但是一般建议使用npm优先)
npm get registry   // 查看当前npm源
pm --registry=https://registry.npm.taobao.org install -g npm    // 配置npm源为淘宝镜像
pm --registry=https://registry.npm.taobao.org install -g cnpm    // 安装cnpm nvm use v6.9.5   // 指定当前使用node版本
nvm alias default v6.9.5    // 指定默认node版本
node -v    可以查看node版本
// gulp的watch需要监听很多文件的改动,但是fedora、ubuntu系统的文件句柄其实是有限制的,因此可以使用以下命令设置句柄数量
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

// 安装相关工具 npm i pm2 webpack -g
测试是否可以使用
sudo vi app.js   // 新建app.js文件
填入以下代码:

const http = require('http')

http.createServer(function(req, res){
        res.writeHead(200, { 'Content-Type': 'text/plain'})
        res.end('zzf node test')
}).listen(8081)

console.log('server running on port 8081')
复制代码

// 然后保存退出,执行app.js node app.js

// 端口开发根据自己项目需要,配置防火墙iptables

我目前使用的阿里云只需要配置安全组即可,如下:

// 输入云服务  http://47.102.204.126:8081 可以查看到输出的内容如下:

这样我们就实现了终端开启服务,终端退出就不可使用了;
所以需要将服务注册到后台,并可以支持自启动

##PM2配置启动服务
在app.js所在目录,执行pm2 start app.js 即可启动

pm2 list     // 列出当前所有node服务
pm2  show   0     // 查看id为0的node服务详情
pm2 logs     // 查看当前pm2的日志

nginx 配置与使用,使外网可80端口访问

nginx配置80端口代理到对应端口服务
检测是否安装了apache占用80端口
sudo service apache2 stop
apache2: unrecognized service     // 说明未安装apache
// 如果有,则执行以下俩行语句移除apache
update-rc.d -f apache2 remove    
sudo apt-get remove apache2    
// 然后刷新apt-get
sudo apt-get update    
1.安装nginx
sudo apt-get install nginx    
nginx -v    // 查看nginx版本
和上面一样配置阿里云安全组80端口

配置nginx:
cd /etc/nginx/
 cd conf.d/
sudo vi  imooc-com-8081.conf     // 新建用于imooc.com站点的配置文件(要学习规范一点文件命名),如下:

upstream imooc {
        server 127.0.0.1:8081;
}

server {
        listen  80;
        server_name  localhost;

        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://imooc;
                proxy_redirect off;
        }
}
复制代码

cd ..
检查nginx.conf   文件的 include /etc/nginx/conf.d/*.conf;是否正确(这里表示将所有etc/nginx/conf.d文件夹下的所有配置文件都include进nginx的配置文件中)

# Virtual Host Configs         ##

include /etc/nginx/conf.d/.conf;         include /etc/nginx/sites-enabled/;

sudo nginx -t     // 检测nginx的配置是否正确,出现下面的success表示成功
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

sudo nginx -s reload   // 重启nginx
浏览器输入   http://47.102.204.126:80   即可访问当之前我们定义的那个服务了。 当然如果配置了域名解析的化也是可以访问的。

此时我们查看控制台的网络可以看到,Response Headers 中Server:nginx/1.4.6(Ubuntu);那么这个nginx版本和系统信息怎么隐藏呢?

使用vim  编辑nginx.conf   修改 server_tokens off;
重启动nginx  即可

-----------------------------------------------------------

#域名解析DNSPod 一个域名只能有一个ip,但是一个ip地址可以对应多个域名;

配置二级域名
登录www.dnspod.cn网站,点击域名解析,执行添加操作

配置结果为:

此时我们的二级域名就配置好了,访问的时候就分别是
movie.iamfane.club
wechat.iamfane.club
www.iamfane.club
他们都指向47.102.204.126  这台服务器,我们会在服务器上根据请求的域名来解析到对应的服务。
此时可以ping  上面的域名,会发现返回的是我们配置的服务器ip

#服务器安装mongodb
注意此处一定要注意安装的mongodb对应服务器的操作系统类型和版本,我们用的阿里云服务器为ubautu14.04的,下面的命令也要对应ubautu14.04

安装公钥
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
增加源
echo "deb repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
更新列表
sudo apt-get update
安装
sudo apt-get install -y mongodb-org
这一步一般都会比较慢,是因为mongodb的源http://repo.mongodb.org比较慢,我们可以将安装请求的安装源更改为阿里云镜像地址(mirrors.aliyun.com/mongodb/);
cd /etc/apt/sources.list.d/
udo vi mongodb-org-3.2.list        // 编辑文件
将deb  repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse 改为deb  mirrors.aliyun.com/mongodb/apt… trusty/mongodb-org/3.2 multiverse

sudo apt-get update
sudo apt-get install -y mongodb-org
开启mongodb
sudo service  mongod  start
查看momgo的日志文件
cat /var/log/mongodb/mongod.log
直接执行mongo    回车
如果此处连接失败,则有可能服务器的27017端口未开放,则需要在防火墙配置端口 在防火墙iptables文件中插入以下代码:

并重载防火墙 sudo iptabls-restore < /etc/iptables.up.rules
再次执行mongo    回车,若此时结果报错:Failed global initialization: BadValue: Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly.
大概意思是:全局初始化失败,无效或没有用户区域设置。请确保环境变量设置正确 解决办法只需要一行命令:
export LC_ALL=C (去除所有本地化的设置,让命令能正确执行)
然后执行mongo就好了。

修改mongodb的默认端口(本文将默认的27017改为19999)

默认端口往往不够安全,所以我们尽量修改端口

编辑mongod.conf 文件 
sudo vi /etc/mongod.conf 找到下面代码修改端口   port: 27017    --------->  此处改为19999
  bindIp: 127.0.0.1
重启mongo:   sudo service mongod restart
执行   mongo --port 19999     即可连接成功。

mongodb 数据库本地迁移到服务器

1.整个库打包迁移
先导出备份好本地文件(indust-app为mongodb数据库的名称,indust-app-backup为导出后的文件名称)
mongodump -h 127.0.0.1:27017   -d  indust-app  -o   indust-app-backup
导出后的mongodb数据库信息如下:

本地将数据库打包成tar包(indust-app.tar.gz ) 
tar  zcvf indust-app.tar.gz  indust-app-backup
使用scp命令去把本地的数据库文件上传到服务器要存储数据库的地址
scp  -P  9999 ./ indust-app.tar.gz  zzf@40.102.204.126:/home/zzf/dbbackup/ 
9999为远程ssh连接的端口号,
./ indust-app.tar.gz为当前要上传的文件,
zzf@40.102.204.126为ssh连接的用户名和ip地址,
/home/zzf/dbbackup/ 为文件导入后存储的位置(如果没有就先建好该文件夹)
解压上传的tar文件,得到 indust-app文件夹就是数据库的信息
tar  vxf  indust-app.tar.gz
 将上传的 indust-app数据库restore到mongodb中
mongorestore  --host  127.0.0.1:9999  -d   indust-app   ./dbbackup/indust-app
检查是否导入成功
mongo --port 9999
 use   indust-app
show tables
db.creations.find({})     
就可以看到creations数据表里面的数据是否正确了。

2.mongodb查询结果保存为json,并单表导入
查询users表中name不为null的用户信息并保存到movie-users.json
mongoexport  -d  imooc-movie  -c  users  -q  '{"name": { $ne:null}}'  -o  ./movie-users.json
也可以将导出的文件上传到远程服务器,操作方式和上面类似,然后将数据导入到服务器的users表中,相关方法可以自己查询

3.删除数据库imooc-moive
mongo  --host 127.0.0.1:9999  imooc-moive  -eval   "db.dropdatabase()"

4.数据库配置管理员和数据权限
·mogodb是没有默认的管理员账号的,所以要先添加管理员账号,然后再开启权限认证
 ·只有切换到admin这个数据库,添加的账号才是管理员账号, 
· 用户只能在用户所在数据库来登录,admin也是如此;
·管理员可以管理所有数据库,但是不能直接管理数据库,要到admin中认证才可以

下面来操作一把:
mongo --port 9999
use admin
// imooc_cases_owner对所有数据库有间接的操作权限
db.createUser({user: 'imooc_cases_owner', pwd: 'Safe124',roles: [{role: 'userAdminAnyDatabase', db:'admin'}]}) ​
执行之后得到success相关信息即为添加成功。
用户授权
db.auth('imooc_cases_owner', 'Safe1
24$')
返回1 ,表示授权成功

单独数据库的用户授权
use imooc-movie // 切换到imooc-movie数据库下 // imooc_movie_runner用户可以对 imooc-movie数据库有读写权限
db.createUser({user: 'imooc_movie_runner', pwd: 'F@3127&',roles: [{role: 'readWrite', db:'imooc-movie'}]})
// 对数据库创建一个备份角色,只读不可写
db.createUser({user: 'imooc_movie_reader', pwd: 'Fa
(*27&$',roles: [{role: 'read', db:'imooc-movie'}]})
但是现在还没有放开认证模式,下面来开启
sudo  vi  /etc/mongod.conf     // 修改配置文件
修改结果如下图:

然后重启mongo数据库: sudo  service  mongod  restart
然后执行
use admin 
db.auth('imooc_cases_owner', 'Safe1*24$') 然后才可以执行相关查询和数据操作

也可以直接进入某个数据库
mongo  127.0.0.1:9999/imooc-movie  -u  imooc-movie-runner  -p  '这里写密码' 成功即可执行相关操作,
例如:show  tables  
还有数据库的迁移和单表迁移也是常用的指令,大家在使用到之后可以自行查阅尝试

数据库的定时备份

我们可以通过脚本文件执行来达到定时多次备份数据库的任务,脚本内容如下:

脚本执行

  • sudo  sh  ./tasks/movie.backup.sh 如果可以执行成功,我们就把它添加到系统的定时任务中
  • cd  到根目录
  • crontab  -e     // 会打开nano编辑器来编辑文件 按照某个时间规则执行某个脚本任务,配置代码如下(每天凌晨13分执行一次)

有时我们还需要将备份的数据库文件定时上传到备份服务器上(此处以上传到七牛云对象存储为例),这个服务我们可以用nodejs来实现  这部分代码七牛云提供了相关实现方式,

末尾添加以下代码来传输

对上面的代码进行参数解析:

也可将上面的任务配置成定时任务即可

Tips:如果有多个数据库,最好每个数据库单独配置一个备份脚本,而不是一次性写在一个脚本中,这样防止一个出问题都出问题。

向远程服务器部署和发布上线

  1. git仓库新建私有项目;
  2. git代码同步到远程git仓库;可以配置全局git的用户密码
  3. 配置仓库密钥、本地密钥和服务器密钥配对
  • 在git工厂新建部署公钥,然后把本地的.ssh/id_rsa.pub的内容全部复制粘贴到目录中
  • 本地也同样执行这个操作:

然后将本地代码上传到仓库

  1. 远程服务器也去git仓库clone最新代码; 服务器安装git  :  sudo apt-get install git 服务器clone最新代码下来:

  2. PM2 (pm2.io/doc/en/runt…) 配置自动更新代码:本地项目配置部署的json配置文件;记得要将这个配置文件通过git上传到远程仓库

module.exports = {
  apps: [{
    name: "app",
    script: "app.js"
  }],
  deploy: {
    // "production" is the environment name
    production: {
      // SSH key path, default to $HOME/.ssh
      key: "/path/to/some.pem",
      // SSH user
      user: "ubuntu",
      // SSH host and port
      host: ["192.168.0.13"],
      port: 9999,
      // SSH options with no command-line flag, see 'man ssh'
      // can be either a single string or an array of strings
      ssh_options: "StrictHostKeyChecking=no",
      // GIT remote/branch
      ref: "origin/master",
      // GIT remote(远程git仓库地址)
      repo: "git@github.com:Username/repository.git",
      // path in the server(部署到服务器的位置)
      path: "/var/www/my-repository",
      // Pre-setup command or path to a script on your local machine
      pre-setup: "apt-get install git ; ls -la",
      // Post-setup commands or path to a script on the host machine
      // eg: placing configurations in the shared dir etc
      post-setup: "ls -la",
      // pre-deploy action
      pre-deploy-local: "echo 'This is a local executed command'",
      // post-deploy action
      post-deploy: "npm install",
    },
  }
}
复制代码

上面具体配置请参考PM2网站自行编辑。

5.本地使用 pm2  deploy xxx.json production setup , 触发远程更新代码并按照上述配置文件创建相应的文件夹, 然后去服务器的/var/www/my-repository下查看文件是否下载成功。 启动服务器上的项目:

  • pm2  deploy xxx.json production     // 这时一般会爆出错误,应为pm2在服务器上不存在 在服务器根目录执行以下操作:
  • vi   .bashrc     // 编辑这个文件 将下面几行代码注释掉,防止他提前返回:

  • source  .bashrc
  • pm2  deploy xxx.json production    即可看到pm2的启动结果。

如果上面本地的pm2配置文件写错,也会报错,需要注意!!! 修改文件夹相对当前用户的读写权限:sudo  chmod  777  xxx   (该用户对xxx文件夹具有读写权限)

  • pm2 list  可以查看当前跑的服务 ##nginx配置请求转发

git简易的命令行入门教程:

Git 全局设置:

  • git config --global user.name "临山"
  • git config --global user.email "zhengfeizhang@sina.com"

创建 git 仓库:

  • mkdir iot
  • cd iot
  • git init
  • touch README.md
  • git add README.md
  • git commit -m "first commit"
  • git remote add origin gitee.com/zhengfeizha…
  • git push -u origin master

已有仓库?

  • cd existing_git_repo
  • git remote add origin gitee.com/zhengfeizha…
  • git push -u origin master
  • 代码版本落后需要
  • git  fetch
  • git  merge  origin/master            // 合并代码

转载于:https://juejin.im/post/5c8fa25fe51d455f971becea

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值