全栈最后一公里

1、生产环境所需要素

    购买自己的域名   购买自己的服务器   域名备案  配置服务器应用环境  安装配置数据库  项目远程部署发布与更新

 一、远程登录以及设置登录权限人员以及通过ssh设置无密码登录

远程登录服务器  ssh root@47.92.145.61

指定一个钦差大臣,不要以root权限登录,因为他很敏感,有可能删掉或者修改掉一些敏感核心文件,前端时间gitlab工程师,深夜中误删掉了15g的文件导致造成了很大的故障。

主要用到的命令是 < adduser dzq_manager(要设置的用户名) >

对用户名进行升权操作 使该用户能够以sudo的权限调用系统命令

gpasswd -a dzq_manager sudo

进一步进行操作 sudo visudo 修改相关配置规则

进行如下修改,按下 control + x 之后按 shift + y 之后按下enter键  保存成功

然后以该用户的权限进行登录

登录成功!!!

通过ssh设置无密码登录

首先本地生成ssh_key,然后登录到服务器生成相关的sshkey

ssh-keygen -t rsa -b 4096 -C "dongzhiqiang@qudian.com"

执行eval "$(ssh-agent -s)"

ssh-add ~/.ssh/id_rsa

跑通代理,建立连接

建立授权文件  vi authorize_keys

将本地电脑的id_rsa.pub文件复制粘贴到服务器上的该文件中

并对该文件进行授权操作 chmod 600 authorized_keys

然后执行sudo service ssh restart

现在登录的时候就不需要进行密码的输入了

 

二、增强服务器的安全级别

 1、改变服务器登录的默认端口号  sudo vi /etc/ssh/sshd_config

修改默认端口号是3999

 登录的时候使用ssh -p 3999 dzq_manager@47.92.145.61

2、关掉以root权限登录和禁止空密码(因为可以通过root进行扫描,导致安全风险)

这是我们再以root账号登录,就会被拒绝

3、配置iptables防火墙

首先升级一下ubuntu,执行sudo apt-get update && sudo apt-get upgrade

清空一下当前的iptables防火墙规则

iptables -F 

继续执行 sudo vi /etc/iptables.up.rules 创建服务器防火墙规则

配置完防火墙规则之后,告诉iptables配置文件的位置

sudo iptables-restore </etc/iptables.up.rules

查看防火墙是否成功启动 

sudo ufw status

启动iptables防火墙的命令

sudo ufw enable

设置开机自动启动iptables,通过设置shell脚本来实现

sudo vi /etc/network/if-up.d/iptables

赋予脚本执行的权限

sudo chmod +x /etc/network/if-up.d/iptables

4、安装fail2ban(防御性的动作库,通过检测系统的认证文件,对任何产生可疑行为的目标进行ip的锁定等等)

执行 sudo apt-get isntall fail2ban 进行fail2ban的安装

修改fail2ban的配置文件

sudo vi /etc/fail2ban/jail.conf

进行下面两处的修改

 查看fail2ban是否正常运行/启动/停止

sudo service fail2ban status/stop/start

 

三、搭建Nodejs生产环境 

1、环境搭建与必要模块安装

执行 sudo apt-get install vim openssl build-essential libssl-dev wget curl git 安装相关的依赖等

使用nvm进行nodejs的版本管理等,打开github.com搜索nvm,拷贝下面这行脚本代码

安装完成后,打开一个新的终端进行相关的操作,在新的终端界面输入 nvm install v4.4.4

使用4.4.4版本的node并默认使用,执行 nvm use v4.4.4 

nvm alias default v4.4.4

指定淘宝源镜像安装npm npm --registry=https://registry.npm.taobao.org install -g npm

增加系统文件监控数目  echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p 

为了保证更高更快的安装速度  使用cnpm 代替 npm

npm --registry=https://registry.npm.taobao.org install -g cnpm

安装常用的工具包模块 npm i pm2 webpack gulp grunt-cli -g

2、使用pm2部署管理node进程的工具进行项目的管理

可以先写一个小的demo,例如在根目录下创建app.js文件,同时在该文件写上服务启动代码,监听8081端口,通过浏览器中输入ip以及端口号的方式,进行node服务项目的访问,若成功,代表环境搭建成功。注意这里iptables防火墙允许8081端口的访问以及阿里云服务器安全组规则的设定,否则无法正常访问。

可以直接执行 pm2 start app.js 命令运行node项目

可以通过pm2 list 命令列出当前运行的项目列表

使用pm2 show app 则是某个运行的项目更详细的信息的展示

使用pm2 logs实现实时查看日志的功能

四、配置Nginx实现反向代理

安装nginx  sudo apt-get install nginx

进入conf.d目录   cd /etc/nginx/conf.d  

新建8081端口的配置文件   sudo vi dzq-com-8081.conf

配置文件内容如下,核心思想便是通过server_name也就是通过服务器ip进来的流量,都转到upstream的dongzhiqiang中去

返回上一层,查看nginx.config文件,可以看到这么一行代码

会把我们刚刚配置的.conf文件全都加载进来

执行 sudo nginx -t 检测我们写的配置文件有没有问题    

 

执行sudo nginx -s reload 重启nginx服务

这个时候,我们在浏览器中直接输入ip地址不输入端口号就可以直接访问服务器上的项目了

 五、利用DNSpos进行域名解析管理

首先,将当前域名的解析DNS服务器更换为其他的DNS服务器,由修改后的DNS服务器负责域名解析服务。

我们选择的是DNSpos作为我们域名的解析DNS服务器。

可以通过 https://support.dnspod.cn/Kb/showarticle/tsid/40/ 看到万网(被阿里云收购)的修改DNS解析服务器的方式。

紧接着,打开阿里云官网,找到我们已经备案号的域名,点击管理,点击修改DNS,把相应的地址给填入。

 

 

 

然后我们去到DNSpod的管理控制台,进入域名解析,添加我们需要解析的域名地址,我这里是dongzhiqiang.cn,点击确定

 然后到DNSpod官网添加相应的记录,进行域名的解析。

 六、服务器配置安装MongoDB

 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

这是官方的mongodb unbutu 安装教程,我们需要按照步骤一步步进行

第一步,导入publickey

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

第二步,为mongodb创建列表文件

echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

第三步,重新加载本地包数据库

sudo apt-get update

第四步,安装mongodb包,安装最新的稳定的mongodb

sudo apt-get install -y mongodb-org

可能会遇到很慢的情况,这时候我们可以修改一下源,提高下载速度

进入到相应的目录文件 cd /etc/apt/sources.list.d 编辑相应的列表

sudo vi mongodb-org-3.4.list

这时,我们在终端中输入 mongo ,若出现链接失败的情况,则在防火墙规则中加入以下两条规则

 mongod安全防护

1、修改mongodb默认端口号为2999

sudo vi /etc/mongod.cof

重启mongodb服务,sudo service mongod restart

首先修改防火墙的安全规则,将端口号改为2999,同时使用 mongo --port 2999 进行数据库的链接

将本地数据库数据导入线上服务器

执行 mongodump -h 127.0.0.1:27017 -d platform -o platform-backup 命令,将本地的platform数据库中的数据表备份一份

将该文件进行压缩打包 tar zcvf platform.tar.gz platform-backup

 

通过scp命令,将本地的压缩包上传到服务器 

scp -P 3999 ~/workplace/project-deploy/platform.tar.gz dzq_manager@47.92.145.61:/home/dzq_manager/dbbackup/

进入到服务器,对上传到服务器上的tar包进行解压操作

tar xvf platform.tar.gz

讲解压后的数据文件,导入到数据库的文件夹中

 mongorestore --host 127.0.0.1: 2999 -d platform ./dbbackup/platform-backup/platform/

 删除线上服务器的相关数据

mongo --host 127.0.0.1:2999 platform --eval "db.dropDatabaes()"

 为数据库配置相应的管理员和用户权限(核心文件,必须具有一定的安全性)

1、mongodb没有默认的管理员账号,所以要先添加管理员账号,然后开启权限的认证。

2、只有切换到admin之后,添加的账号才算是管理员账号,用户只能在用户所在的数据库登录,包括管理员账号。 

3、管理员可以管理所有的数据库,但是不能直接管理数据库,首先要到admin里认证才可以。

 

首先,对整个mongodb数据库设置超级管理员权限

进入mongo环境, 执行 mongo --port 2999

执行如下命令管理员角色(可以间接的管理所有的数据库)

db.createUser({user: 'dzq_manager_cases_owner', pwd: '1994827dzqygF', roles: [{role: 'userAdminAnyDatabase', db:'admin'}]})

在admin数据库下面对用户登录进行授权,要相对数据库创建角色,就要在这儿进行授权操作。

db.auth('dzq_manager_cases_owner', '1994827dzqygF')

进入platform数据库,创建具有读写权限的角色

use platform 

db.createUser({user: 'platform_runner', pwd: '1994827dzqygF', roles: [{role: 'readWrite', db:'platform'}]})

创建备份角色

db.createUser({user: 'platform_wheel', pwd: '1994827dzqygF', roles: [{role: 'read', db:'platform'}]})

blog数据库进行相同的操作步骤。

开启数据库的验证模式:

编辑数据库的配置文件  sudo vi /etc/mognod.conf

重启mongodb服务  sudo service mongod restart

这时,进入mongo环境,执行show dbs,将会因为权限的问题无法访问

这时,我们需要进行相关的权限验证 db.auth('dzq_manager_cases_owner', '1994827dzqygF')

再次执行show dbs 

如果想直接登录某个数据库 执行 mongo 127.0.0.1:2999/platform -u platform_runner -p 1994827dzqygF 这样就进入了某个数据库,然后就可以针对于每个数据库进行操作。

 

 七、部署线上nodejs项目

nodejs本身通过pm2来进行维护

首先,通过git把本地的项目代码上传到私有仓库,到项目目录下:

 git init  > git add . > git commit -m 'first commit'  > git remote add origin git@git.oschina.net:qqqiang123/platform.git > git push -u origin master

会出现让我们从远程更新代码的提示,执行 git pull ,如出现如下类似错误,则执行git pull origin master --allow-unrelated-histories后再执行git push -u origin master,代码上传成功~

 登录到服务器,把生成的公钥复制到第三方的代码仓库,把代码克隆到服务器上。

部署

用 pm2 来把指令发送到服务器端,让服务能够跑起来(傻瓜式的管理代码更新和服务运行,能够自动更新代码和重启服务等)

pm2不仅可以守护nodejs服务来实现平滑重启,实现代码自动更新,从本地到线上的部署。

http://pm2.keymetrics.io/ pm2的相关文档

在项目中增加配置文件 process.json

 在服务器新建相关文件夹  sudo mkdir /workplace > cd workplace > sudo mkdir website 

执行相关pm2命令:pm2 deploy process.json production setup

这时,线上服务器便有了我们部署后的文件夹

其中,current就是我们跑在线上的代码,soruce便是我们从第三方仓库克隆下来的源码,shared便是生成的日志文件等等

以后,我们每一次部署,执行pm2 deploy process.json production便可,服务器会自动拉取仓库中的代码并自动执行pm2的平滑重启。

 

八、使用和配置更安全的HTTPS协议

 以platform.dongzhiqiang.cn为例进行讲解

我们可以到腾讯云上申请一个免费的ssl证书

下一步,手动dns验证

 

进入到DNSpos,根据生成的主机记录,记录类型和记录值添加相应的记录

 

最后,下载证书,通过scp命令上传到服务器

进行nginx配置文件的修改

 

至此,ssl证书配置完成

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 

 

posted @ 2018-06-05 11:37  强强、  阅读(394)  评论(0编辑  收藏  举报