1.简介
1.1.参考资源
微服务网关的介绍和说明前面已有介绍,相关的文档可以参考以下链接。
Nginx 最大的问题是官方没有提供 GUI 方式的管理界面并且在群集方面的支持有限,所有配置都基于文本的配置方式。使用和学习成本较高。
Openresty 通过将 Nginx 和 LuaJit 环境结合起来实现了更复杂更扩展的应用,支持更多的应用场景并且提供了大量的插件。上手比较简单,但是如果要用好或出现问题排查等则需要更多的技能,需要懂代码开发。当然它也不提供 GUI 的管理界面。
Kong 是将 Openresty 结合微服务的发展趋势发展而出的专门整到容器环境的网关(也适合非容器环境),官方不提供 GUI 的管理界面,通过 PGSQL 实现配置内容的保存。在数据转发性能上无法和 Nginx 和 Openresty 相比,实际使用整体感觉比较重(Konga是第三方的图形管理界面,并不是由Kong 提供)
ApiSIX 借鉴Kong 的模式提供更符合云原生环境的功能和插件,最重要的是官方提供图形管理界面。
kong 微服务网关插件机制及常用指令 https://blog.51cto.com/waringid/5800540
kong 微服务网关配置指南 https://blog.51cto.com/waringid/5793828
使用Kong和Konga管理微服务和API https://blog.51cto.com/waringid/5790671
nginx配置指南之一 https://blog.51cto.com/waringid/1438852
nginx操作指南之二 https://blog.51cto.com/waringid/1441632
nginx增加modsecurity模块 https://blog.51cto.com/waringid/1629905
也谈nginx的安全限制 https://blog.51cto.com/waringid/1608666
利用Kong 的 request-transformer 插件重写 URL https://blog.51cto.com/waringid/5803062
Linux 系统生产环境配置指南 https://blog.51cto.com/waringid/5782872
1.2.ApiSIX 说明
web 网关主要承载业务访问的代理转发和 SSL 证书配置并实现基于域名的 web 访问。当前主要的网关应用有 Nginx、openresty 和 kong 等。它们有各自的特点但同时也存在不足。其中 openresty 和 kong 都是基于 Nginx 的功能实现。
Apisix 和 Kong 类似,近几年发展较快。通过 ETCD 保存数据并且提供 GUI 管理界面,相对比较轻量。和 Kong 以及 Openresty 相比推出的时间较短。
2.基础环境配置
2.1.安装 Etcd
2.2.安装 Golang
2.3.安装 Openresty
2.4.安装 Luarocks
2.5.安装 apisix
2.6.apisix 配置
3.常见配置管理
3.1.登录
在浏览器输入服务器的IP+9080端口使用 admin 的默认用户名和密码登录
3.2.负载均衡配置
测试的负载均衡配置如下图所示。要实现以下要求
1、apisix 提供对外访问服务,访问地址是 192.168.111.243
2、在该服务器上通过 python3 -m http.server 10000/10001 的方式模拟上游的服务器。其中不同的端口对应不同的文件内容,该端口不许外网访问(防火墙上未启用该端口)
3、输入 http://192.168.111.243:9080/http/会随机访问 10000和10001端口(增加 http 的作用是为了检测 rewrite 的功能)
3.2.1增加上游服务器资源(Upstream)
3.2.2.增加路由(Route)
3.2.3.测试验证
3.3.查看 Etcd 内容
3.4.Etcd 数据备份与恢复
3.5.日志管理
利用系统自带的日志切割工具实现按天的日志切割管理,控制日志文件的大小。
4.接入网关配置
4.1.调整接口
4.2.增加代理端口
不增加 apisix 的代理端口,后面需要直接通过域名的方式转发 dashboard 的请求会直接转发到 apisix 的默认接口导致日志中的403错误。具体的说明可以参考文档。
4.3.增加自签名证书
内网环境或因多种原因无法申请公网 SSL 证书的可以直接通过系统的组件实现自签名证书。
5.seafile 的 Nginx 配置转换
5.1.目标要求
1、使用 https 协议访问和上传,确保传输安全
2、参照 Nginx 的配置文件转为 apisix 的 GUI 配置
5.2.增加证书
参照“4.3 增加自签名证书”的方式增加内部的 SSL 证书
5.3.增加上游服务器
参照 nginx 的配置文件增加 127.0.0.1:8000 和 127.0.0.1:8082 的资源
5.4.增加路由
6.guacamole 域名登录配置
7.基础知识
7.1.配置文件的重点块
- access_by_lua_block: access_by_lua是nginx权限访问控制的一个模块,通过配置相关参数可以达到访问应用权限控制的目的
- proxy_pass
- header_filter_by_lua_block: 自定义http 头
- body_filter_by_lua_block: 处理body模块
- log_by_lua_block: 日志
7.2.openresty的启动过程
Initing:服务启动,工作通常是读取配置文件,初始化内部数据结构
Running:服务运行,接受客户端的请求,返回相应结构
exiting:服务停止,做一些必要的清理工作,如关闭监听端口
7.2.1.Initing子阶段
configuration:读取配置文件,解析配置指令,设置运行参数
master-initing:配置文件解析完毕,master 进程初始化公用的数据
worker-initing:worker 进程自己的初始化,进程专用的数据
7.2.2.Runing阶段
ssl:SSL/TLS 安全通信和验证
preread:在正式处理之前 “预读” 数据,接收 HTTP 请求头
rewrite:检查、改写 URI,实现跳转/重定向
Access:访问权限控制
content:产生响应内容
filter:对 contet 阶段产生的内容进行过滤架构处理
log:请求处理完毕,记录日志,或者其他的首尾工作
7.3.openresty指令
init_by_lua:master-initing 阶段,初始化全局配置或模块
init_worker_by_lua:worker-initing 阶段,初始化进程专用功能
ssl_certificate_by_lua:ssl 阶段,在 “握手” 时设置安全证书
set_by_lua:rewrite 阶段,改写 Nginx 变量
access_by_lua:access 阶段,访问控制或限速
content_by_lua: content 阶段,产生响应内容
balancer_by_lua: content 阶段,反向代理时选择后端服务器
header_filter_by_lua:filter 阶段,加工处理响应头
body_filter_by_lua: filter 阶段,加工处理响应体
log_by_lua: log 阶段,记录日志或其他的收尾工作
通过apisix rest api 管理路由转发:
7.4.apisxi 支持的插件
7.4.1.General
batch-requests: 以 http pipeline 的方式在网关一次性发起多个 http 请求。
插件热加载:无需重启服务,完成插件热加载或卸载。
HTTPS/TLS:根据 TLS 扩展字段 SNI(Server Name Indication) 动态加载证书。
serverless:允许在 APISIX 中的不同阶段动态运行 Lua 代码。
redirect: URI 重定向
7.4.2.Traffic
limit-req:基于漏桶原理的请求限速实现。
limit-conn:限制并发请求(或并发连接)。
limit-count:基于“固定窗口”的限速实现。
proxy-cache:代理缓存插件提供缓存后端响应数据的能力。
request-validation: 请求验证。
proxy-mirror:代理镜像插件提供镜像客户端请求的能力。
api-breaker: API的断路器,在状态不正常的情况下停止将请求转发到上游。
7.4.3.Transformation
response-rewrite: 支持自定义修改返回内容的 status code、body、headers。
proxy-rewrite: 支持自定义修改 proxy 到上游的信息。
grpc-transcode:REST <--> gRPC 转码。
fault-injection:故障注入,可以返回指定的响应体、响应码和响应时间,从而提供了不同的失败场景下处理的能力,例如服务失败、服务过载、服务高延时等。
7.4.4.Authentication
authz-keycloak: 支持 Keycloak 身份认证服务器
wolf-rbac 基于 RBAC 的用户认证及授权。
key-auth:基于 Key Authentication 的用户认证。
JWT-auth:基于 JWT (JSON Web Tokens) Authentication 的用户认证。
basic-auth:基于 basic auth 的用户认证。
oauth: 提供 OAuth 2 身份验证和自省。
openid-connect
7.4.5.Security
cors: 为你的API启用 CORS
uri-blocker: 根据 URI 拦截用户请求。
referer-restriction: Referer 白名单。
ip-restriction: IP 黑白名单。
7.4.6.Monitoring
prometheus:以 Prometheus 格式导出 APISIX 自身的状态信息,方便被外部 Prometheus 服务抓取。
OpenTracing:支持 Zikpin 和 Apache SkyWalking。
Skywalking: Supports Apache SkyWalking。
7.4.7.Loggers
http-logger: 将请求记录到 HTTP 服务器。
tcp-logger: 将请求记录到 TCP 服务器。
kafka-logger: 将请求记录到外部 Kafka 服务器。
udp-logger: 将请求记录到 UDP 服务器。
sys-log: 将请求记录到 syslog 服务。
log-rotate: 日志文件定期切分。