六、开发博客之登录
6-1、开始
当更新、删除博客时,要验证是否登录,还有管理中心的页面
核心:
1、登录校验
2、登录信息存储(用户名 还有其他的需求用于管理信息中心)
目录:
1、cookie和session
cookie是实现登录的基础
session是实现登录目前的一个解决方案
2、session写入redis
redis,是server端必须要知道的东西,是一个内存数据库,用来存储session
3、开发登录功能,和前端联调(nginx反向代理)
6-2、cookie
1、什么是cookie
- 存储在浏览器的一段字符串(最大5kb)
- 跨域不共享 淘宝,又打开百度,cookie不共享
- 格式:k1=v1;k2=v2;自己来结构化
- 每次发送http请求,会将请求域的cookie一起发送给server端 server端可以修改cookie并返回给浏览器
- 浏览器也可以通过js修改cookie(有限制)
2、js 操作cookie,浏览器中查看cookie
-
request-headers:浏览器给服务器发送的cookie
-
respose-headers:服务器修改cookie后返回给浏览器端的(set-cookie)
-
Application 里面cookies保存着cookie信息(Name表示cookie值,Value表示cookie值)
-
document.cookie的值查看
-
document.cookie = ‘k1=v1’;来增加cookie
3、server端操作cookie,实现登录验证
6-3、nodejs操作cookie
1、查看cookie
2、修改cookie
3、实现登录验证
如果cookie里面有username,代表已经登录了,如果cookie里没有username,就代表没有登录
cookie赋值要后端来做
res.setHeader('Set-Cookie', `username=${data.username}; path=/`)
6-4、cookie做限制(1)
由于前端可以通过document.cookie来随意的修改用户名
,作为李四伪造张三,来查看张三的一些敏感信息
加httpOnly,就只能通过后端去修改,不能通过前端去修改了
6-5、cookie做限制(2)
expires做过期时间的限制
6-6、session介绍
用cookie回暴露用户名
解决:cookie中存储userid,server端对应username
解决方案:session,即server端存储用户信息
6-7、session演示
cookie用userid来表示,第一次登录,把用户名和密码保存在session中,返回给客户端userid,第二次登录时,看cookie中的userid
6-8、从session到redis
目前session直接是js变量,放在nodejs进程内存中
问题:
- 进程内存有限,访问量过大,内存暴增怎么办
- 线上运行是多进程的,进程之间的内存无法共享
解决方案:redis
web server最常用的缓存数据库,数据放在内存中,优点:读写比较快,缺点:比较贵,存储空间比较小一些,断电流失
特点:
- 将web server和redis拆分成单独的服务
- 双方都是独立的,可扩展的(例如扩展成集群)
- mysql也是一个单独的服务,也可扩展
为何session适合redis?
- session访问频繁,对性能要求高
- session不考虑断电丢失的问题(内存的硬伤)
- session数据量不会太大(相对于mysql中)
为何网站数据不适合用redis?
- 操作频率不是太高(相对于session操作)
- 断电不能丢失,必须保留
- 数据量大,内存成本太高
6-8、 安装redis
Windows:
https://www.runoob.com/redis/redis-install.html
启动:
redis-server.exe redis.windows.conf
MAC:
brew install redis
总结:
为何用redis?不用redis出现的问题? mysql适合什么场景。
redis适合什么场景?
- Session访问频繁,对性能要求比较高
- Redis读写比较快,内存价格比较高
- Mysql硬盘数据库,成本比较低,可以存储大量数据
6-9、 nodejs连接redis
安装:
cnpm install redis --save
6-9、 nodejs连接redis–封装工具函数
把配置、创建、使用分离开来,创建中返回set 和get方法,然后再登录时使用。
6-10、 完成server端登录的代码
在新建、更新、删除博客时,验证是否登录博客,author从req.session.username中获取
6-11、和前端联调
- 登录必须有cookie,因此不能用postman,必须用到浏览器。
- cookie是跨域不共享的,前端和server端必须同域
- 需要用nignx做代理,让前后端同域
- 前端页面需要配置端口号
cnpm install http-server -g
http-server -p 8001
一个系统不允许启动俩个端口一样的俩个进程
6-12、nginx配置
nginx介绍:
- 高性能的web服务器,开源免费
- 一般用于静态服务(静态图片,文件这些),负载均衡(一台主服务器,其他服务器均摊流量)
- 反向代理
对浏览器不可见的,为服务器服务的
下载:
Windows:
http://nginx.org/en/download.html
MAC:
brew install nginx
基本命令
- 测试配置文件格式是否正确 nginx-t
- 启动nginx;重启nginx -s reload
- 停止nginx -s stop
配置nginx:(把前端和后端的接口配置一个公共的接口8081)
Windows: C:\nginx\conf\nginx.conf
Mac: /usr/local/etc/nginx/nginx.conf
打开nginx的配置文件:
MAC: sudo vim /usr/local/etc/nginx/nginx.conf
Windows 找到自己的文件夹打开
6-13、nginx联调演示与总结
在管理中心,加上特定条件,代表只查询此作者的列表
七、开发博客之日志
7-1、日志介绍
日志:
一、访问日志:access log (server端最重要的日志)
- 访问时间,(GET或者POST)
- 别的信息,浏览器版本,地址
二、自定义日志(包括自定义事件,错误记录)
- 记录完后如何拆分日志
日志要放在文件中
nodejs文件操作,nodejs stream(文件流,提高性能)减少CPU和内存
- 日志功能的开发和使用
- 文件拆分,日志内容分析
- 日志要存储到文件中
不存于redis中?
因为文件太大,日志对速度要求不是很高(一快)
不存于mysql中?
mysql中,必须要有表结构,联动查询,(第二快)
文件的成本低,不需要任何处理
7-2、nodejs文件操作
- 读取文件,写入文件(readFile,writeFile) 当写入的文件
- 非常多的时候,进程就支撑不了了。
7-3、stream介绍
IO操作的性能瓶颈:
- 输入输出包括“网络IO”和“文件IO”
- 相对于CPU计算和内存读写,IO的突出特点就是慢,比如server需要读写文件,网络接收数据和传递数据(CPU的问题,网络带宽的问题)
如何有限的硬件资源下提高IO的操作效率?
- stream就是流,读取,之前是全部读取,视频就是一边看一边加载,节省很多的硬件资源,倒入,倒出,写入,写出,一边看一边加载,接收部分req.pipe(res)
7-4、stream演示
标准的输入输出
process.stdin.pipe(process.stdout)
readerStream读取
writerStream写入
读取是一点一点读取的 on data去监听
7-5、写日志
访问日志
自定义日志
错误日志
以Stream流的方式写入日志并且追加
7-6、拆分日志
原因:日志内容积累,放在一个文件中不好处理
按时间来划分日志文件(通过文件名来找到当天的日志)
可以不占用本服务器的资源
实现:
linux的crontab命令,即定时任务
crontab是一个定时任务,格式: *****command
将access.log拷贝并重命名为日期
清空access.log文件,继续积累日志
使用shell编辑 sh copy.sh
分析日志介绍
crontab
crontab -e 是设置每一天自动更新时间
crontab -l查看目前的配置
日志分析
- 比如针对access.log日志,分析chrome的占比
- 日志是按行存储的,一行就是一条日志
- 使用nodejs的radline(基于stream,效率高)逐行读取的