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
wget https://github.com/etcd-io/etcd/releases/download/v3.4.17/etcd-v3.4.17-linux-amd64.tar.gz |
[Unit] |
systemctl systemctl daemon-reload |
2.2.安装 Golang
wget https://golang.org/dl/go1.17.2.linux-amd64.tar.gz |
2.3.安装 Openresty
wget https://openresty.org/package/centos/openresty.repo --no-check-certificate |
2.4.安装 Luarocks
wget http://192.168.16.150/luarocks-3.4.0.tar.gz |
#!/usr/bin/env bash |
2.5.安装 apisix
wget https://github.com/apache/apisix/releases/download/2.10.0/apisix-2.10.0-0.el7.x86_64.rpm |
2.6.apisix 配置
apisix start |
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 内容
export ETCDCTL_API=3 |
3.4.Etcd 数据备份与恢复
etcdctl --endpoints=127.0.0.1:2379 snapshot save etcd-snapshot-`date +%Y%m%d`.db |
3.5.日志管理
利用系统自带的日志切割工具实现按天的日志切割管理,控制日志文件的大小。
cat > /etc/logrotate.d/apisix << EOF |
4.接入网关配置
4.1.调整接口
4.2.增加代理端口
不增加 apisix 的代理端口,后面需要直接通过域名的方式转发 dashboard 的请求会直接转发到 apisix 的默认接口导致日志中的403错误。具体的说明可以参考文档。
4.3.增加自签名证书
内网环境或因多种原因无法申请公网 SSL 证书的可以直接通过系统的组件实现自签名证书。
mkdir ca |
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: 日志文件定期切分。
标签:网关,https,CentOS,--,lua,APISIX,etcd,com,apisix From: https://blog.51cto.com/waringid/5831965