简介

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: 日志文件定期切分。

  • 无标签

0 评论

你还没有登录。你所做的任何更改会将作者标记为匿名用户。 如果你已经拥有帐户,请登录