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

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

1.独立域名+域名备案webpack

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

3.安装数据库git

4.项目远程发布与更新github

什么一级域名?web

一级域名又称为顶级域名,你们须要注意的是, www.iisp.com这种形式的域名并非一级域名,他只是一个二级域名,也就是说www只是一个主机名。 真正的一级域名是由一个合法字符串+域名后缀组成。因此,iisp.com这种形式的域名才是一级域名。iisp是域名主体,.com是域名后缀。能够是.net域名后缀,也能够是.hu域名后缀等。mongodb

什么是二级域名?数据库

所谓的二级域名实际上就是一个一级域名下面的主机名。顾名思义,他是在一级域名前面加上了一个字符串,好比asdx.iisp.com.,他能够拥有根顶级域名一样的功能。而且经过设置,能够拥有和根顶级域名彻底同样的功能。但这里并非说一级域名和二级域名彻底没有差异!apache

二级域名和顶级域名的差别:npm

*二级域名和一级域名仍是有很大的差别的,最简单的差异就在于多使用二级域名的子网站,它自身的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            // 合并代码
相关文章
相关标签/搜索