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和Konga管理微服务和API https://blog.51cto.com/waringid/5790671
利用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
tar zxvf etcd-v3.4.17-linux-amd64.tar.gz
mv etcd-v3.4.17-linux-amd64 /usr/local/
mkdir -p /var/lib/etcd
vim /etc/systemd/system/etcd.service
[Unit]
Descriptinotallow=Etcd Server
After=network.target
[Service]
Type=notify
User=root
WorkingDirectory=/var/lib/etcd/
#Envirnotallow=/etc/etcd/etcd.conf
ExecStart=/usr/local/etcd/etcd \
--name etcd_apisix \
--data-dir=/var/lib/etcd \
--listen-client-urls http://192.168.111.243:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.111.243:2379
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
systemctl systemctl daemon-reload
systemctl enable etcd.service
systemctl start etcd
2.2.安装 Golang
wget https://golang.org/dl/go1.17.2.linux-amd64.tar.gz
tar -C /usr/local/ -zxvf go1.17.1.linux-amd64.tar.gz
vim /etc/profile
source /etc/profile
2.3.安装 Openresty
wget https://openresty.org/package/centos/openresty.repo --no-check-certificate
mv openresty.repo /etc/yum.repos.d/
yum install -y openresty curl git gcc openresty-openssl111-devel unzip
2.4.安装 Luarocks
wget http://192.168.16.150/luarocks-3.4.0.tar.gz
wget https://github.com/luarocks/luarocks/archive/v3.4.0.tar.gz
bash ./linux-install-luarocks.sh
vim linux-install-luarocks.sh
#!/usr/bin/env bash
set -ex
# you might need sudo to run this script
if [ -z ${OPENRESTY_PREFIX} ]; then
OPENRESTY_PREFIX="/usr/local/openresty"
fi
tar -xf luarocks-3.4.0.tar.gz
cd luarocks-3.4.0 || exit
OR_BIN="$OPENRESTY_PREFIX/bin/openresty"
OR_VER=$($OR_BIN -v 2>&1 | awk -F '/' '{print $2}' | awk -F '.' '{print $1"."$2}')
if [[ -e $OR_BIN && "$OR_VER" == 1.19 ]]; then
WITH_LUA_OPT="--with-lua=${OPENRESTY_PREFIX}/luajit"
else
# For old version OpenResty, we still need to install LuaRocks with Lua
WITH_LUA_OPT=
fi
./configure $WITH_LUA_OPT \
> build.log 2>&1 || (cat build.log && exit 1)
make build > build.log 2>&1 || (cat build.log && exit 1)
sudo make install > build.log 2>&1 || (cat build.log && exit 1)
cd .. || exit
rm -rf luarocks-3.4.0
mkdir ~/.luarocks || true
OPENSSL_PREFIX=${OPENRESTY_PREFIX}/openssl
if [ -d ${OPENRESTY_PREFIX}/openssl111 ]; then
OPENSSL_PREFIX=${OPENRESTY_PREFIX}/openssl111
fi
luarocks config variables.OPENSSL_LIBDIR ${OPENSSL_PREFIX}/lib
luarocks config variables.OPENSSL_INCDIR ${OPENSSL_PREFIX}/include
2.5.安装 apisix
wget https://github.com/apache/apisix/releases/download/2.10.0/apisix-2.10.0-0.el7.x86_64.rpm
rpm -Uvh apisix-2.10.0-0.el7.x86_64.rpm
sudo yum install -y https://repos.apiseven.com/packages/centos/apache-apisix-repo-1.0-1.noarch.rpm
wget https://github.com/apache/apisix-dashboard/releases/download/v2.8/apisix-dashboard-2.8.0-0.el7.x86_64.rpm
rpm -Uvh apisix-dashboard-2.8.0-0.el7.x86_64.rpm
apisix start
curl "http://127.0.0.1:9080/apisix/admin/services/" -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
2.6.apisix 配置
apisix start
vim /usr/local/apisix/dashboard/conf/conf.yaml
manager-api start -p /usr/local/apisix/dashboard/
firewall-cmd --zone=public --add-port=9000/tcp --permanent
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
etcdctl --endpoints=127.0.0.1:2379 get / --prefix --keys-only
3.4.Etcd 数据备份与恢复
etcdctl --endpoints=127.0.0.1:2379 snapshot save etcd-snapshot-`date +%Y%m%d`.db
ETCDCTL_API=3 etcdctl snapshot restore /data/etcd_backup_dir/etcd-snapshot-20191222.db \
--data-dir=/var/lib/etcd/default.etcd
3.5.日志管理
利用系统自带的日志切割工具实现按天的日志切割管理,控制日志文件的大小。
cat > /etc/logrotate.d/apisix << EOF
/usr/local/apisix/logs/*.log {
daily
rotate 5
missingok
dateext
compress
notifempty
postrotate
[ -e /usr/local/apisix/logs/nginx.pid ] && kill -USR1 `cat /usr/local/apisix/logs/nginx.pid`
endscript
}
EOF
logrotate -f /etc/logrotate.d/apisix
logrotate -d -f /etc/logrotate.d/apisix
4.接入网关配置
4.1.调整接口
4.2.增加代理端口
不增加 apisix 的代理端口,后面需要直接通过域名的方式转发 dashboard 的请求会直接转发到 apisix 的默认接口导致日志中的403错误。具体的说明可以参考文档。
4.3.增加自签名证书
内网环境或因多种原因无法申请公网 SSL 证书的可以直接通过系统的组件实现自签名证书。
mkdir ca
cd ca
openssl genrsa -out ./CA.key 4096
openssl req -x509 -new -key ./CA.key -out ./CA.cer -days 3650 -subj /CN="LingFang"
mkdir apisix.test.lan
penssl genrsa -out ./apisix.test.lan/apisix.test.lan.pem 4096
openssl req -new -key ./apisix.test.lan/test.lan.pem -out ./apisix.test.lan/apisix.test.lan.csr -days 365
openssl x509 -days 365 -req -in ./apisix.test.lan/apisix.test.lan.csr -extensions v3_req -CAkey ./CA.key -CA ./CA.cer -CAcreateserial -out ./apisix.test.lan/apisix.test.lan.crt
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: 日志文件定期切分。