服务器笔记¶
统计信息:字数 14413 阅读29分钟
原始笔记链接:https://cloud.seatable.cn/dtable/external-links/59b453a8639945478de2/
0061 如何实现 token 加密¶
1、JWT 加密
2、设置过期时间,避免客户端泄露 token
0136 你对服务器有哪些了解¶
定位:前端为主,了解一些简单的后端(服务器)知识
知识点概念层面:RestFul API Graph 设计 API 的理念;请求并发,jwt token 验证,nginx 的反向代理,docker K8s 的基本使用(image container 实际运行环境等)权限控制
语言框架层面:Python django 和 flask,node 的 express 和 Koa 基本使用;mysql 关系型数据库的增删改查(redis mongoDB 非关系型数据库的概念)监听 URL
实际案例:以小说阅读器为例,用户注册,用户登录流程(服务器和客户端通信过程,HTTP 三次握手四次挥手 TCP get post 对应不同的 TCP 请求等,滑动窗口算法),管理员权限判断等;大文件断点续传;operations 的广播 socket WS 协议基本应用;单点登录等后端实现(session)
0212 Restful API 与 GraphQL¶
两种网络技术协议,REST API 和 GraphQL 的区别:
restfulAPI 是早期的协议。在网络请求中,url 中表示请求的资源名称,请求的方法对应数据库的增删改查操作(回想一下常见的四种请求方法,get post delete put 的特点,以及 head option 请求方法)。这样的好处是 URL 直接关注资源,不需要关注怎么操作资源,目前项目大部分使用这个协议。
GraphQL是新一代的协议。每一个请求都类似 POST 请求,前端把需要的参数通过 POST 类似 JSON 发给后端,然后后端根据需要的参数返回给前端(后端需要查询)。
好处:URL固定的,不会频繁变化。很多资源可以在一个 Query 中获取,这样服务器并行请求压力较小。服务器无需返回不需要的字段(前端需要用户姓名,后端会查询一次数据库,把用户很多信息拿到并返回)。
不足:需要设置很多的查询和错误处理(前端查询两个参数,一个出错,怎么返回;数据量较大,传输更加消耗时间——网络良好的情况下不需要考虑这个)。
0213 vps 云服务器 物理服务器 的区别¶
物理服务器:真实的服务器,用于大企业,可靠性比较高,需要专人维护。内部维护比较安全稳定(例如金融电力通信行业)。
vps: Virtual Private Server(虚拟私有服务器),一般架设在云端,有固定的带宽,个人博客可以搭建在这里。企业的网站不适宜搭建。
云服务器:是 vps 的加强版,带宽可变,国内主要是华为云,阿里云,国外是亚马逊。
0694 微服务架构是什么¶
个人理解:
服务器架构发展历史¶
早期的互联网应用模式,就是 BS 模式,browser-server 服务器-客户端模式。
当访问量增加后,单一服务器无法处理复杂事务,就增加了分布式系统,负载均衡、反向代理服务器,用于平衡不同服务器的压力。
当功能越来越多,传统的服务器模式中,一个服务器上需要运行很多服务(例如 用户登录,用户评论,书籍管理,操作日志等各种服务),那么在一个服务器上运行多个服务,可能代码维护比较复杂,可能测试流程复杂,代码的耦合性等较大——例如更改新的功能,可能需要测试全部的服务等。
所以此时引入了微服务和微服务架构等。
微服务¶
微服务:不同的服务器负责不同单一的功能(可能是外部多个 APIs),如果某个功能改动,不会影响其他功能;某个服务扩容也不会影响其他功能。
在多个业务微服务模块基础上,还需要支持服务(服务网关 api-gateway, 服务注册中心,服务配置中心)
-
服务网关:统一处理外部的请求,并把不同类型的服务继续发送到不同的服务上
-
服务注册中心:不同服务之间不清楚对方的功能和变化,所以需要在注册中心去注册服务,这样就能互相调用了 rpc
-
服务配置中心:如果每个服务都有自己的配置,那么不利于后期维护和更新(运维)所以统一一个服务配置项目
优点¶
不同服务位于不同的服务器,方便扩容,方便改动功能,方便测试维护,故障隔离。
缺点¶
增加了学习和部署成本。如果小公司,服务不多,还要部署多个微服务,那么维护比较困难。
在前端中的使用¶
理论上前端不复杂时,不需要微服务架构,实际上也用到类似的概念。
不同模块(用户服务,书籍服务)等维护在不同模块,模块内部只实现某个功能的管理,外部业务组件调用模块的 API,不需要考虑模块的具体细节。这个可以说,是 redux 状态管理的一个扩展。redux 仅仅把一个状态维护在公共部分。微前端微服务就是把状态进一步封装成一个前端服务,例如 users 是状态,那么写一个 UserService 提供了 getUsers, setUsers, clearUsers APIs 外部调用这些 API 即可完成 user 的操作,不需要考虑 users 具体怎样存储的,怎样和服务器交互的等等逻辑。
参考¶
https://zhuanlan.zhihu.com/p/381847108
https://zhuanlan.zhihu.com/p/345552079
https://www.zhihu.com/question/600277145
0700 S3是什么¶
S3,Simple Storage Service 简单存储服务
对象存储服务协议
S3,全称为 Amazon Simple Storage Service,是亚马逊推出的一种对象存储服务协议,旨在为开发者提供一种简单、高效、可靠的方式来存储和管理大量的数据对象。S3协议的设计目标是提供一种易于使用的接口,使得用户可以通过互联网轻松地存储、访问和管理数据。它采用了基于对象的存储模型,每个数据对象都被视为一个独立的实体,可以通过唯一的键来识别和访问。
S3的基本特性包括:
-
对象存储:S3是一种对象存储服务,用户可以将文件保存到S3存储桶上。
-
文件大小:每个文件的大小可以从0字节到5TB,支持分段上传最大5TB的文件。
-
存储容量:S3存储桶的容量是无限的,没有总文件容量的限制。
-
命名规则:S3存储桶的命名是全球唯一的,不能和任何区域的任何账号内的S3存储桶同名。
S3的URL结构也具有其独特性,通过统一的资源标识符(URI)进行查找和访问。
这种服务模式特别**适合存储和访问大量的非结构化数据,如视频、图片、文档等,并且能够根据需求快速扩展,满足各种规模的数据存储需求**。
0214 docker 和 K8S 的关系¶
docker 和 K8S 的关系:docker and kubernetes
Docker¶
Docker 是轻量级的环境部署工具,相对传统虚拟机,占用资源少,可以提供若干个独立的环境部署不同的服务,架构是 image-container 从镜像创建不同的容器,然后在容器中执行操作,创建服务。不同容器共用底层硬件资源,数据层不互相影响。
image: 镜像(类)
container: 容器(类的实例)
docker 只适用于单机部署环境,对于集群部署服务,文件管理等需要下面的 k8s.
k8s¶
k8s 是一个集群环境-cluster,包括一个 Master 主节点和很多 Node 工作节点。
Master 主节点:负责调度管理不同的 Node 节点,提供了对外的接口 API,对内的控制器 Controller,Node 节点之间的调度,以及 etcd 存储系统。
Node 工作节点:每一个工作节点,运行了 Docker 创建容器的工具,创建了多个 POD 进程(独立的服务)还有其他的支持模块,例如 proxy 代理,日志模块,搜索模块等。
参考链接
https://juejin.cn/post/6952331691524358174
https://juejin.cn/post/6844903943051411469
https://zhuanlan.zhihu.com/p/53260098
0273 VNC 连接¶
https://blog.csdn.net/jks212454/article/details/131453847
VNC (Virtual Network Console)是虚拟网络控制台的缩写。它 是一款优秀的远程控制工具软件,可以实现远程控制计算机的功能。应用于云服务器控制平台,便于远程操作。
0408 nginx 常用配置和含义¶
详细内容见本地实际配置
下面是简化的 nginx.conf
log_format 日志模块¶
定义了一个 yuiformat 的变量,包括一系列日志
nginx服务器日志相关指令主要有两条
1 log_format,用来设置日志格式
2 access_log,用来指定日志文件的存放路径、格式和缓存大小
参数说明:
$remote_addr 和 $http_x_forwarded_for 用于记录IP地址
$request 用于记录请求URL与HTTP协议
$status 用于记录请求状态,例如成功时状态为200,页面找不到时状态为404
$body_bytes_sent 用于记录发送客户端的文件主体内容大小
$http_referer 用于记录是从哪个页面链接访问过来的;
$http_user_agent 用于记录客户浏览器的相关信息。
$upstream_response_time 请求过程中,upstream 响应时间
log_format yuiformat '[$time_iso8601] $http_x_forwarded_for $remote_addr "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_response_time';
upstream 上游模块¶
可支持多个上游服务器,实现负载均衡和主备分离
可以设置多个上游服务器,并设置权重 weight,nginx 把请求依次发送到不同服务器上,减少并发量
keepalive 指令用于设置长连接的超时时间
upstream servers {
server 127.0.0.1:5000 weight=5;
server 127.0.0.1:5001 weight=5;
server 127.0.0.1:5002 weight=1;
server 127.0.0.1:5003 backup;
keepalive 20;
}
server 服务器模块¶
server {
# 这个 default_server 块是默认的服务器块。当没有其他服务器块能够处理请求时,Nginx 会使用默认的服务器块。
listen 80 default_server;
listen [::]:80 default_server;
# root 指定的是服务器根目录,用于处理 HTTP 请求时,所使用的默认根目录
# 例如,若root /var/www/html; 则访问 http://example.com/index.html 会定位到 /var/www/html/index.html 文件
root /var/www/html;
index index.html index.htm index.nginx-debian.html
# server_name 用于设置虚拟主机服务名称
server_name _;
# 访问根目录 /
location / {
proxy_pass http://127.0.0.1:8000;
# proxy_set_header 设置代理服务器,向后端服务器转发请求时的头部信息。
# 这个指令允许你定制代理请求头,比如修改用户代理(User-Agent)、主机名、内容类型等
# 以便更好地控制流量或隐藏客户端信息。
# Host $host; 设置请求的目标主机为原始请求的主机;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
# X-Forwarded-For: 传递客户端代理的 IP 链接,对于多个代理层会有多个 IP。
# proxy_read_timeout 通常在代理服务器中使用,它设置了从上游服务器接收数据的最大等待时间。
# 如果超过这个时间限制但没有接收到预期的数据,代理服务器会认为连接超时,然后可能会关闭连接,以秒为单位
# 用于控制网络请求的响应时间,防止因长时间等待导致的性能问题或资源浪费。
proxy_read_timeout 600s;
# client_max_body_size 是一个配置选项,通常用于Web服务器中,允许客户端通过HTTP请求发送的最大数据体(body)大小。这个设置对于限制潜在的恶意攻击或防止服务器资源被大文件上传消耗过多。
# 如果设置了较高的值,可能会增加服务器处理大文件的能力,但同时也增加了被DDoS攻击的风险。
# 如果设置过低,可能会导致一些大文件无法正常上传,例如文件上传功能的网站。
# 在实际部署中,你需要根据应用的需求和服务器性能来合理配置这个值。
client_max_body_size: 0;
# add_header 用于在 HTTP响应头 中添加自定义的元数据,这对于控制HTTP缓存、设置安全策略、提供特定信息给客户端或代理服务器等场景非常有用。
# 使用add_header,你可以动态地插入如 Cache-Control、Content-Security-Policy、X-Frame-Options等头信息。
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type,Content-Range,Content-Disposition";
return 204;
}
# 日志位置
access_log /data/logs/yui.access.log yuiformat;
error_log /data/logs/yui.error.log;
}
# alias 别名,nginx会将 location 后面的 xxx 替换为 alias 指令指定的路径 xxx
location /media/assets/scripts {
alias /data/dev/static/scripts;
}
location /media {
alias /data/dev/statis/media;
}
}