Nodejs学习三

六、开发博客之登录

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进程内存中

问题:

  1. 进程内存有限,访问量过大,内存暴增怎么办
  2. 线上运行是多进程的,进程之间的内存无法共享

解决方案:redis
web server最常用的缓存数据库,数据放在内存中,优点:读写比较快,缺点:比较贵,存储空间比较小一些,断电流失

特点:

  1. 将web server和redis拆分成单独的服务
  2. 双方都是独立的,可扩展的(例如扩展成集群)
  3. mysql也是一个单独的服务,也可扩展

为何session适合redis?

  1. session访问频繁,对性能要求高
  2. session不考虑断电丢失的问题(内存的硬伤)
  3. session数据量不会太大(相对于mysql中)

为何网站数据不适合用redis?

  1. 操作频率不是太高(相对于session操作)
  2. 断电不能丢失,必须保留
  3. 数据量大,内存成本太高

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适合什么场景?

  1. Session访问频繁,对性能要求比较高
  2. Redis读写比较快,内存价格比较高
  3. 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文件操作

  1. 读取文件,写入文件(readFile,writeFile) 当写入的文件
  2. 非常多的时候,进程就支撑不了了。

7-3、stream介绍
IO操作的性能瓶颈:

  1. 输入输出包括“网络IO”和“文件IO”
  2. 相对于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,效率高)逐行读取的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值