1. Location语法
1. 语法规则
location [= |~|~ * |^~ ] /uri/{…}正则表达式中的特殊字符 :- . () {} [] * + ?
2. Location 优先级说明
在 nginx 的 location 和配置中 location 的顺序没有太大关系。
与 location 表达式的类型有关。
相同类型的表达式,字符串长的会优先匹配 。
3. location 表达式类型
~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他 location 。
= 进行普通字符精确匹配。也就是完全匹配
4. 匹配模式及优先级顺序 ( 高 -> 低 ):
客户端 : http ://localhost/helloworld/test/a. html客户端 : http ://localhost/helloworld/test//helloworld/test/a. html/helloworld/test/location /{}location /helloworld/{}location /helloworld/test/{}location =/helloworld/test/{root xxx;}http ://localhost/helloworld/test/a. htmllocation ^~ /helloworld/test/{}location ^~ /login/{}http ://localhost/helloworld/test/a. JPGlocation ~ * \ .[ jpg|png ]{}http ://192.168.1.100/login/hello/world/login. html/login/hello/world/login. htmllocation /{}location /login/{}location /login/hello/{}location /login/hello/world/{}location ~ /group[ 1-9 ]/M0[ 0-9 ]{}
练习:
匹配示例 :/ -> configuration/index.html -> configuration/documents/document.html -> configuration C/documents///images/1.gif -> configuration D/images///documents/1.jpg -> configuration E
2. 项目总结
1. 客户端
Qt
了解了Qt 中 http 通信
2. nginx 反向代理服务器
为web 服务器服务
web服务器需要集群
3. web 服务器 - nginx
处理静态请求 - > 访问服务器文件
动态请求 -> 客户端给服务器提交的数据
借助fastCGI 进行处理
讲的是单线程处理方式 - API
也可以多线程处理 -> 另外的 API
使用spawn-fcgi启动
4. mysql
关系型数据库 - 服务器端
存储什么?
项目中所有用到的数据
5. redis
非关系型数据库 - 服务器端使用
数据默认在内存, 不需要 sql 语句 , 不需要数据库表
键值对存储, 操作数据使用的是命令
和关系型数据库配合使用
存储服务器端经常访问的数据
6. fastDFS
分布式文件系统
追踪器, 存储节点 , 客户端
存储节点的集群
横向扩容 -> 增加容量
添加新组, 将新主机放到该组中
纵向扩容 -> 备份
将主机放到已经存在的组中
存储用户上传的所有的文件
给用户提供下载服务器
3. 项目提炼
1. 做的是文件服务器
电商网站
旅游网站
租房
装修公司
医院
短视频网站
2. 需要什么 ?
首先需要的是fastDFS
配置环境
扩容
操作fastDFS - 客户端
web
桌面终端 - Qt
数据库操作
mysql
oralce
有一个web 服务器 - Nginx
静态资源部署
动态请求 - 编写 fastCGI 程序
注册
登录
上传
下载
秒传
文件列表的获取
redis
存储服务器访问比较频繁的数据
4. 存储节点反向代理
http://192.168.31.109:80/group1/M00/00/00/wKgfbViy2Z2AJ-FTAaM3As g3Z0782.mp4"
http://192.168.31.109:80/group2/M00/00/00/wKgfbViy2Z2AJ-FTAaM3As g3Z0782.mp4"
上图的反向代理服务器代理的是每个存储节点上部署的 Nginx- 每个存储节点上的 Nginx 的职责 : 解析用户的 http 请求 , 帮助用户快速下载文件客户端上传了一个文件 , 被存储到了 fastDFS 上 , 得到一个文件 ID/group1/M00/00/00/ wKgfbViy2Z2AJ-FTAaM3Asg3Z0782 . mp4"因为存储节点有若干个 , 所有下载的时候不知道对应的存储节点的访问地址给存储节点上的 nginx web 服务器添加反向代理服务器之后 , 下载的访问地址 :- 只需要知道 nginx 反向代理服务器的地址就可以了 : 192.168.31. 109- 访问的 url :http ://192.168.31.109/group1/M00/00/00/ wKgfbViy2Z2AJ-FTAaM3Asg3Z0782 . mp4客户端的请求发送给了 nginx 反向代理服务器- 反向代理服务器不处理请求 , 只转发 , 转发给存储节点上的 nginx 服务器反向代理服务器的配置 - nginx. conf- 找出处理指令 : 去掉协议 , iP/ 域名 , 末尾文件名 , ? 和后边的字符串- /group1/M00/00/00/ - 完整的处理指令- 添加 locationserver {location /group1/ M00{# 数据转发 , 设置转发地址proxy_pass http ://test.com;}location /group2/ M00{# 数据转发 , 设置转发地址proxy_pass http ://test1.com;}}upstream test. com{# fastDFS 存储节点的地址 , 因为存储节点上安装了 nginx, 安装的 nginx 作为 web 服务器的角色server 192.168.31.100;server 192.168.31.101;server 192.168.31.102;}upstream test1. com{# fastDFS 存储节点的地址 , 因为存储节点上安装了 nginx, 安装的 nginx 作为 web 服务器的角色server 192.168.32.100;server 192.168.33.101;server 192.168.34.102;}# ===================================存储节点上的 web 服务器的配置存储节点 1location /group1/ M00{# 请求处理root 请求的资源的根目录 ; // 存储节点的 store_path0 对应的路径 + datangx_fastdfs_module;}location /group1/ M01{# 请求处理root 请求的资源的根目录 ;ngx_fastdfs_module;}存储节点 2location /group2/ M00{# 请求处理root 请求的资源的根目录 ;ngx_fastdfs_module;}location /group2/ M01{# 请求处理root 请求的资源的根目录 ;ngx_fastdfs_module;}存储节点 3location /group3/ M00{# 请求处理root 请求的资源的根目录 ;ngx_fastdfs_module;}location /group3/ M01{# 请求处理root 请求的资源的根目录 ;ngx_fastdfs_module;}
5. https
1. 在百度服务器端首先生成一个秘钥对 -> 对公钥分发
2. 百度将公钥给到了 CA 认证机构 , ca 对私钥进行签名 -> 生成了证书 .
3. 第一步第二部只做一次
4. 客户端访问百度 , 百度将 ca 生成的证书发送给客户端
5. 浏览器对收到的证书进行认证
6. 如果证书没有问题 -> 使用 ca 的公钥将服务器的公钥从证书中取出
7. 我们得到了百度的公钥
8. 在浏览器端生成一个随机数 , 使用得到的公钥进行加密 , 发送给服务器
9. 服务器端使用私钥解密 , 得到了随机数 , 这个随机数就是对称加密的秘钥
10. 现在秘钥分发已经完成 , 后边的通信使用的的对称加密的方式
1. 对称加密加解密秘钥是同一个2. 非对称加密公钥 , 私钥rsa -> 公钥私钥都是两个数字ecc -> 椭圆曲线 , 两个点公钥加密 , 私钥解密数据传输的时候使用私钥加密 , 公钥解密数字签名3. 哈希函数md5/ sha1/sha2得到散列值 , 散列值是定长的4. 消息认证码生成消息认证码 : ( 将原始数据 + 共享秘钥 ) * 进行哈希运算 = 散列值验证消息认证码 :( 接收的原始数据 + 共享秘钥 ) * 哈希运算 = 新的散列值新散列值和旧散列值进行比较 , 看是不是相同作用 :验证数据的一致性型弊端 :两端共享秘钥必须相同 , 共享秘钥分发困难5. 数字签名 -> 目的告诉所有人这个数据的所有者是 xxx, xxx 就是拿私钥的人生成一个非对称加密的密钥对公钥私钥生成签名 :对原始数据进行哈希运算 -> 散列值使用非对称加密的私钥 , 对散列值进行签名 ( 私钥加密 ) -> 密文得到的密文就是数字签名签名的校验 :校验这会收到签名者发送的数据原始数据数字签名对接收的数据进行哈希运算 -> 散列值使用非对称加密的公钥 , 对数字签名进行解密 -> 明文 == 签名者生成的散列值校验者的散列值 和 签名者的散列值进行比较相同 -> 校验成功了 , 数据属于签名的人失败 -> 数据不属于签名的人弊端 :接收公钥的人没有办法校验公钥的所有者。6. 证书由一个受信赖的机构 (CA) 对某人的公钥进行数字签名CA 有一个密钥对使用 ca 的私钥对某个人的公钥进行加密 -> 证书这个人 的公钥这个人的个人信息