全栈最后一公里
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证书配置完成