- 由 虚拟的现实创建于10月 11, 2023 需要 6 分钟阅读时间
简介
web 网关主要承载业务访问的代理转发和 SSL 证书配置并实现基于域名的 web 访问。当前主要的网关应用有 Nginx、openresty 和 kong 等。它们有各自的特点但同时也存在不足。其中 openresty 和 kong 都是基于 Nginx 的功能实现。
Nginx 最大的问题是官方没有提供 GUI 方式的管理界面并且在群集方面的支持有限,所有配置都基于文本的配置方式。使用和学习成本较高。
Openresty 通过将 Nginx 和 LuaJit 环境结合起来实现了更复杂更扩展的应用,支持更多的应用场景并且提供了大量的插件。上手比较简单,但是如果要用好或出现问题排查等则需要更多的技能,需要懂代码开发。当然它也不提供 GUI 的管理界面。
Kong 是将 Openresty 结合微服务的发展趋势发展而出的专门整到容器环境的网关(也适合非容器环境),官方不提供 GUI 的管理界面,通过 PGSQL 实现配置内容的保存。在数据转发性能上无法和 Nginx 和 Openresty 相比,实际使用整体感觉比较重。
Apisix 和 Kong 类似,近几年发展较快。通过 ETCD 保存数据并且提供 GUI 管理界面,相对比较轻量。和 Kong 以及 Openresty 相比推出的时间较短。
基础环境配置
安装 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] Description=Etcd Server After=network.target [Service] Type=notify User=root WorkingDirectory=/var/lib/etcd/ #EnvironmentFile=/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
安装 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
安装 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
安装 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
安装 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'
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
常见配置管理
登录
在浏览器输入服务器的IP+9080端口使用 admin 的默认用户名和密码登录
负载均衡配置
测试的负载均衡配置如下图所示。要实现以下要求
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 的功能)
增加上游服务器资源(Upstream)
增加路由(Route)
测试验证
查看 Etcd 内容
export ETCDCTL_API=3 etcdctl --endpoints=127.0.0.1:2379 get / --prefix --keys-only
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
日志管理
利用系统自带的日志切割工具实现按天的日志切割管理,控制日志文件的大小。
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
接入网关配置
调整接口
增加代理端口
不增加 apisix 的代理端口,后面需要直接通过域名的方式转发 dashboard 的请求会直接转发到 apisix 的默认接口导致日志中的403错误。具体的说明可以参考文档。
增加自签名证书
内网环境或因多种原因无法申请公网 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
seafile 的 Nginx 配置转换
目标要求
1、使用 https 协议访问和上传,确保传输安全
2、参照 Nginx 的配置文件转为 apisix 的 GUI 配置
增加证书
参照“4.3 增加自签名证书”的方式增加内部的 SSL 证书
增加上游服务器
参照 nginx 的配置文件增加 127.0.0.1:8000 和 127.0.0.1:8082 的资源
增加路由
guacamole 域名登录配置
基础知识
配置文件的重点块
- 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: 日志
openresty的启动过程
Initing:服务启动,工作通常是读取配置文件,初始化内部数据结构
Running:服务运行,接受客户端的请求,返回相应结构
exiting:服务停止,做一些必要的清理工作,如关闭监听端口
Initing子阶段
configuration:读取配置文件,解析配置指令,设置运行参数
master-initing:配置文件解析完毕,master 进程初始化公用的数据
worker-initing:worker 进程自己的初始化,进程专用的数据
Runing阶段
ssl:SSL/TLS 安全通信和验证
preread:在正式处理之前 “预读” 数据,接收 HTTP 请求头
rewrite:检查、改写 URI,实现跳转/重定向
Access:访问权限控制
content:产生响应内容
filter:对 contet 阶段产生的内容进行过滤架构处理
log:请求处理完毕,记录日志,或者其他的首尾工作
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 管理路由转发:
apisxi 支持的插件
General
batch-requests: 以 http pipeline 的方式在网关一次性发起多个 http 请求。
插件热加载:无需重启服务,完成插件热加载或卸载。
HTTPS/TLS:根据 TLS 扩展字段 SNI(Server Name Indication) 动态加载证书。
serverless:允许在 APISIX 中的不同阶段动态运行 Lua 代码。
redirect: URI 重定向
Traffic
limit-req:基于漏桶原理的请求限速实现。
limit-conn:限制并发请求(或并发连接)。
limit-count:基于“固定窗口”的限速实现。
proxy-cache:代理缓存插件提供缓存后端响应数据的能力。
request-validation: 请求验证。
proxy-mirror:代理镜像插件提供镜像客户端请求的能力。
api-breaker: API的断路器,在状态不正常的情况下停止将请求转发到上游。
Transformation
response-rewrite: 支持自定义修改返回内容的 status code、body、headers。
proxy-rewrite: 支持自定义修改 proxy 到上游的信息。
grpc-transcode:REST <--> gRPC 转码。
fault-injection:故障注入,可以返回指定的响应体、响应码和响应时间,从而提供了不同的失败场景下处理的能力,例如服务失败、服务过载、服务高延时等。
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
Security
cors: 为你的API启用 CORS
uri-blocker: 根据 URI 拦截用户请求。
referer-restriction: Referer 白名单。
ip-restriction: IP 黑白名单。
Monitoring
prometheus:以 Prometheus 格式导出 APISIX 自身的状态信息,方便被外部 Prometheus 服务抓取。
OpenTracing:支持 Zikpin 和 Apache SkyWalking。
Skywalking: Supports Apache SkyWalking。
Loggers
http-logger: 将请求记录到 HTTP 服务器。
tcp-logger: 将请求记录到 TCP 服务器。
kafka-logger: 将请求记录到外部 Kafka 服务器。
udp-logger: 将请求记录到 UDP 服务器。
sys-log: 将请求记录到 syslog 服务。
log-rotate: 日志文件定期切分。
- 无标签
添加评论