Nginx支持国密实践
1 简介我国密码行业中有两个主要的通信协议相关的技术标准:
《信息安全技术 传输层密码协议(TLCP)》:即GB/T 38636-2020
《SSL VPN 技术规范》:即GM/T 0024-2014
上述协议关联标准:如数字证书标准GB/T 20518, SM2密码算法标准GB/T 35275等
《SSL VPN技术规范》作为行业标准,部分内容已上升为《信息安全技术 传输层密码协议(TLCP)》国密标准。
国密TLS,又称GMTLS1.1,GMTLS1.1中的1.1代表国密TLS的版本号: _0x0101_。众所周知,目前TLS协议支持的版本:
1234VersionTLS10 = 0x0301VersionTLS11 = 0x0302VersionTLS12 = 0x0303VersionTLS13 = 0x0304
目前主流的TLS软件程序实现中,通信实体在建立TLS连接时,会优先协商使用最大版本号TLS协议 _(版本号越大意味着安全性越高、性能越好)_,因此VersionGMSSL = 0x0101 版本号的设定增加了软件支持的复杂度,这也是阻碍GMTLS1.1广泛应 ...
OpenResty 性能优化
1 性能下降10倍的真凶:阻塞函数OpenResty 之所以可以保持很高的性能,简单来说,是因为它借用了 Nginx 的事件处理和 Lua 的协程机制,所以:
在遇到网络 I/O 等需要等待返回才能继续的操作时,就会先调用 Lua 协程的 yield 把自己挂起,然后在 Nginx 中注册回调;
在 I/O 操作完成(也可能是超时或者出错)后,由 Nginx 回调 resume,来唤醒 Lua 协程。
这样的流程,保证了 OpenResty 可以一直高效地使用 CPU 资源,来处理所有的请求。在这个处理流程中,如果没有使用 cosocket 这种非阻塞的方式,而是用阻塞的函数来处理 I/O,那么 LuaJIT 就不会把控制权交给 Nginx 的事件循环。这就会导致,其他的请求要一直排队等待阻塞的事件处理完,才会得到响应。
下面,我再来介绍几个常见的坑,也就是一些经常会被误用的阻塞函数;
1.1 执行外部命令在业务中通常可以执行一些外部的命令和工具,来辅助完成一些操作。比如杀掉某个进程:
1os.execute("kill -HUP " ...
OpenResty API篇
2 OpenResty开发平台2.1.1 协程和事件驱动在 OpenResty 层面,Lua 的协程会与 NGINX 的事件机制相互配合。如果 Lua 代码中出现类似查询 MySQL 数据库这样的 I/O 操作,就会先调用 Lua 协程的 yield 把自己挂起,然后在 NGINX 中注册回调;在 I/O 操作完成(也可能是超时或者出错)后,再由 NGINX 回调 resume 来唤醒 Lua 协程。这样就完成了 Lua 协程和 NGINX 事件驱动的配合,避免在 Lua 代码中写回调。我们可以来看下面这张图,描述了这整个流程。其中,lua_yield 和 lua_resume 都属于 Lua 提供的 lua_CFunction。
下面是 ngx.sleep 的一段源码,可以帮你更清晰理解这一点。 这段代码位于 ngx_http_lua_sleep.c 中,你可以在 lua-nginx-module 项目的 src 目录中找到它。在ngx_http_lua_sleep.c 中,我们可以看到 sleep 函数的具体实现。你需要先通过 C 函数 ngx_http_lua ...
OpenResty 基础篇
0 参考资料
nginx-lua-module 中文版
nginx-lua-module 原版
API网关:
KONG基于nginx+OpenResty
Envoy
APISIX
0.1 课程目录
1 入门篇1.1 初探OpenRestyOpenResty的三大特性:
详尽的文档和测试用例
同步非阻塞
动态
传统的Web服务器,比如NGINX,如果发生任何的变动,都需要去修改磁盘上的配置文件,然后重新加载才能生效,这是因为没有提供API,来控制运行时的行为。但OpenResty可以使用脚本语言lua来控制逻辑的,动态时Lua天生的优势。
1.2 第一个程序 下边通过使用Lua语言,使用OpenResty启动服务,然后响应打印出“hello world”
安装OpenResty
可以取官网下载源码进行编译安装(enter link description here) 2. 创建工作目录
创建工作目录,然后目录下创建日志和配置文件保存地方
123mkdir geektimecd geektimemkdir logs/ conf/
编写nginx.conf
下边编写一个 ...
Go--基础篇
0 参考资料GO开源项目收集:https://github.com/avelino/awesome-go
01 第一章 Go语言简介1.1 工作区和GOPATH工作区是放置Go源码文件的目录工作区下边有pkg、src、bin三个目录
pkg目录
用于存放归档文件(名称以.a为后缀的文件),所有归档文件都会被存放到该目录下的平台相关目录中,同样以代码包为组织形式
bin目录
用于存放当前工作区中的Go程序的可执行文件
当环境变量GOBIN已有效设置时,该目录会变的无意义
当GOPATH的值中包含多个工作区的路径时,必须设置GOBIN,否则无法成功安装Go程序的可执行文件
1.2 代码包的导入
本地化导入
123import . "strings"HasPrefix("abc", "a") //导入后使用函数不需要加包名
1.3 包管理1.3.1 Go的依赖管理
1.3.2 go mod12345678go mod init mod名称go build 源码文件go mod download 下载依赖包go mod ...
Python--常用工具包
0 参考资料
Pandas中文文档
NumPy中文文档
1 Pandas 数据处理1.1 Pandas 数据结构 - SeriesPandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。
Series 由索引(index)和列组成,函数如下:
1pandas.Series( data, index, dtype, name, copy)
参数说明:
data:一组数据(ndarray 类型)。
index:数据索引标签,如果不指定,默认从 0 开始。
dtype:数据类型,默认会自己判断。
name:设置名称。
copy:拷贝数据,默认为 False。
示例:
1234567891011121314151617181920212223242526272829# 从列表创建Series pd.Series(['a', 'b', 'c']) # 0 a # 1 b # 2 c # dtype: object # 自动创建索引 # 通过字典创建 ...
Python编程语言--进阶篇
0 参考资料
Python核心技术与实战 – Geek
1 Python对象的比较、拷贝1.1 比较is 操作符和 ==操作符:
在 Python 中,每个对象的身份标识,都能通过函数 id(object) 获得。因此,'is'操作符,相当于比较对象之间的 ID 是否相等,
1234567891011121314a = 10b = 10 a == bTrue id(a)4427562448 id(b)4427562448 a is bTrue
对于整型数字来说,以上a is b为 True 的结论,适用于 -5 到 256 范围内的数字。
1234567891011121314a = 257b = 257 a == bTrue id(a)4473417552 id(b)4473417584 a is bFalse
Python 内部会对 -5 到 256 的整型维持一个数组,起到一个缓存的作用。这样,每次你试图创建一个 -5 到 256 范围内的整型数字时,Python 都会从这个数组中返回相对应的引用,而不是重新开辟一块新的内存空间。使用'=='的次 ...
Python编程语言--面向对象
1 类1.1 类的定义和使用12345678910111213141516171819202122 class Dog: """一次模拟小狗的简单尝试。""" def __init__(self, name, age): """初始化属性name和age。""" self.name = name self.age = age self.type = 1 # 给属性指定默认值 def sit(self): """模拟小狗收到命令时蹲下。""" print(f"{self.name} is now sitting.") def roll_over(self): """模拟 ...
Python编程语言--基础篇
0 参考资料
0.1 文档官方文档PyCharm使用手册
1 基础类型1.1 数字交互模式下,上次输出的表达式会赋给变量 _。把 Python 当作计算器时,用该变量实现下一步计算更简单,例如:
1.2 字符串定义字符串支持:单引号 (‘…’) 或双引号 (“…”) ,如果要输出原始字符串,在引号前添加 r原始字符串有一个限制:一个原始字符串不能以奇数个\字符结束。
字符串字面值可以包含多行。 一种实现方式是使用三重引号:”””…””” 或 ‘’’…’’’。
1.2.1 字符串运算符
1.2.2 字符串相关方法字符串的方法
1.3 列表列表数据类型支持很多方法,列表对象的所有方法所示如下:
list.append(x)
在列表末尾添加一个元素,相当于 a[len(a):] = [x] 。
list.extend(iterable)
用可迭代对象的元素扩展列表。相当于 a[len(a):] = iterable 。
list.insert(i, x)
在指定位置插入元素。第一个参数是插入元素的索引,因此,a.insert(0, x) 在列表开头插入元素, a.insert(l ...
Kubernetes中的Calico网络
1 介绍Calico网络的大概思路,即不走Overlay网络,不引入另外的网络性能损耗,而是将转发全部用三层网络的路由转发来实现。下边实践一下Calico网络的两种模式:
IPIP:就是对IP的封装,通过tunnel的方式,进行路由转发
BGP:直接
2 环境部署在Kuberntes环境里部署calico网络,下载calico.yaml安装脚本如下:
12345678910#!/bin/bash## wget https://projectcalico.docs.tigera.io/manifests/calico.yaml# preload cni calicodocker pull calico/cni:v3.23.1docker pull calico/node:v3.23.1docker pull calico/kube-controllers:v3.23.1kubectl apply -f calico.yaml
3 IPIP模式3.1 测试环境为了模拟两个POD跨node通信,我们创建两个pod,分别部署在master和node节点。下边以两个nginx的pod为例 ...