#部署生产环境的基本条件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万的用户量
阿里云主机默认会挂载一个系统盘,最好本身再挂载一个数据盘,这样即便清空数据盘也不会影响主机的系统运行,不然一旦重装系统,本身的应用就都没有了。
1.不要用root用户去部署服务,要配置一个帐户用于部署,防止root操做形成误删; 2.部署经常使用命令
解决方法: 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 // 确认保存便可
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 公钥
而后再在服务器上一样执行如下操做:
ssh-keygen -t rsa -b 4096 -C "2441150413@qq.com" eval "$(ssh-agent -s)"
下一步本地和服务器配对:
本地操做:
cat id_rsa.pub // 复制公钥
而后复制其所有内容
服务器操做:
vi authorized_keys
i // 在vi编辑状态下开始insert
粘贴刚才复制的内容,而后esc
shift+: wq! enter
sudo vi /etc/ssh/sshd_config
新开一个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来登陆,就会发现
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端口代理到对应端口服务
检测是否安装了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版本和系统信息怎么隐藏呢?
-----------------------------------------------------------
#域名解析DNSPod 一个域名只能有一个ip,可是一个ip地址能够对应多个域名;
配置二级域名
登陆www.dnspod.cn网站,点击域名解析,执行添加操做
配置结果为:
#服务器安装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就行了。
默认端口每每不够安全,因此咱们尽可能修改端口
编辑mongod.conf 文件
sudo vi /etc/mongod.conf 找到下面代码修改端口 port: 27017 ---------> 此处改成19999
bindIp: 127.0.0.1
重启mongo: sudo service mongod restart
执行 mongo --port 19999 便可链接成功。
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', 'Safe124$')
返回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 127.0.0.1:9999/imooc-movie -u imooc-movie-runner -p '这里写密码' 成功便可执行相关操做,
例如:show tables
还有数据库的迁移和单表迁移也是经常使用的指令,你们在使用到以后能够自行查阅尝试
数据库的定时备份
咱们能够经过脚本文件执行来达到定时屡次备份数据库的任务,脚本内容以下:
脚本执行
有时咱们还须要将备份的数据库文件定时上传到备份服务器上(此处以上传到七牛云对象存储为例),这个服务咱们能够用nodejs来实现 这部分代码七牛云提供了相关实现方式,
末尾添加如下代码来传输
Tips:若是有多个数据库,最好每一个数据库单独配置一个备份脚本,而不是一次性写在一个脚本中,这样防止一个出问题都出问题。
远程服务器也去git仓库clone最新代码; 服务器安装git : sudo apt-get install git 服务器clone最新代码下来:
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配置文件写错,也会报错,须要注意!!! 修改文件夹相对当前用户的读写权限:sudo chmod 777 xxx (该用户对xxx文件夹具备读写权限)
Git 全局设置:
建立 git 仓库:
已有仓库?