一、服务架构图
二、安装配置
1. 安装配置apisix
(1). 快速启动及验证:
curl -sL https://run.api7.ai/apisix/quickstart | sh
该命令启动 apisix-quickstart 和 etcd 两个容器,APISIX 使用 etcd 保存和同步配置。APISIX 和 etcd 容器使用 Docker 的 host 网络模式,因此可以从本地直接访问。
如果一切顺利,将输出如下信息:
✔ APISIX is ready!
通过 curl 来访问正在运行的 APISIX 实例。比如,你可以发送一个简单的 HTTP 请求来验证 APISIX 运行状态是否正常:
curl "http://127.0.0.1:9080" --head | grep Server
如果一切顺利,将输出如下信息:
Server: APISIX/Version
(2). 其他安装方式
APISIX 安装指南
(3). 介绍如何修改服务配置
APISIX 会通过apisix/cli/ngx_tpl.lua
这个模板和conf/config-default.yaml
加conf/config.yaml
生成 Nginx 的配置文件,因此直接修改 Nginx 的配置文件是无效的。
进入容器,可以在/usr/local/apisix/conf/nginx.conf
看到生成的 Nginx 配置文件。 在自定义 Nginx 配置文件之前,烦请仔细阅读conf/config-default.yaml
。
在conf/config.yaml
里面可以覆盖掉默认值。举个例子,你可以通过xxx_snippet
之类的配置,在conf/nginx.conf
里面注入你的自定义配置: 注意nginx_config及其子项的格式缩进,在执行./bin/apisix start
时,错误的缩进将导致更新conf/nginx.conf文件失败。
在config.yaml文件,有一些snippet:
main_configuration_snippet: |
http_configuration_snippet: |
http_server_configuration_snippet: |
http_server_location_configuration_snippet: |
http_admin_configuration_snippet: |
http_end_configuration_snippet: |
stream_configuration_snippet: |
在其下面添加内容会生成到nginx.conf文件中指定位置。比如:http_server_location_configuration_snippet下写的内容会加入在 #http server location configuration snippet starts下
比如在config.yaml中进行以下配置:
http_server_location_configuration_snippet: |proxy_set_header X-Forwarded-For off;proxy_set_header X-Forwarded-Proto $var_x_forwarded_proto;proxy_set_header X-Forwarded-Host $var_x_forwarded_host;proxy_set_header X-Forwarded-Port $var_x_forwarded_port;
会在生成的nginx.conf以下位置中添加配置
# http server location configuration snippet startsproxy_set_header X-Forwarded-For off;proxy_set_header X-Forwarded-Proto $var_x_forwarded_proto;proxy_set_header X-Forwarded-Host $var_x_forwarded_host;proxy_set_header X-Forwarded-Port $var_x_forwarded_port;
1). 修改log级别
例如将log级别改为debug,在config.yaml中添加如下配置:
nginx_config:
# http_configuration_snippet: |
# client_header_buffer_size 16k; # 调整允许的请求头大小,最大为16kerror_log_level: debug
https://apisix.apache.org/docs/apisix/FAQ/#how-do-i-change-apache-apisixs-log-level
2). 配置apisix使用redis存储session,解决OIDC默认使用cookie来存储加密后的jwt导致request header too large问题
nginx_config:http_server_configuration_snippet: |set $session_storage redis;set $session_secret 623q4hR325t36VsCD3g567922IC0073T;set $session_redis_host 172.25.0.11;set $session_redis_port 6379;set $session_redis_ssl off;set $session_redis_ssl_verify off;
https://github.com/apache/apisix/issues/6792#issuecomment-1126999266
(4). apisix常用命令
当 APISIX 启动时,Admin API 默认情况下将会监听 9180 端口,并且会占用前缀为 /apisix/admin 的 API。
因此,为了避免你设计的 API 与 /apisix/admin 冲突,你可以通过修改配置文件 /conf/config.yaml 中的配置修改默认监听端口。
APISIX 支持设置 Admin API 的 IP 访问白名单,防止 APISIX 被非法访问和攻击。你可以在 ./conf/config.yaml 文件中的 deployment.admin.allow_admin 选项中,配置允许访问的 IP 地址。
在下文出现的 X-API-KEY 指的是 ./conf/config.yaml 文件中的 deployment.admin.admin_key.key,它是 Admin API 的访问 token。
1). 查看路配置
curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
2). 删除路由配置
curl -i -X DELETE http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
3). 创建/更新路由配置
curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{"id": "getting-started-ip","uri": "/ip","upstream": {"type": "roundrobin","nodes": {"httpbin.org:80": 1}}
}'
详情可查看apisix官网文档: https://apisix.apache.org/docs/apisix/admin-api/
2. 安装配置casdoor
(1). 使用docker安装
docker run -p 8000:8000 casbin/casdoor-all-in-one
默认账号密码为:admin/123
(2). 配置casdoor
在这之前介绍一些casdoor的基本概念。
组织是Casdoor的基本单位,它管理着用户和应用,组织之间是相互隔离的。 如果一个用户登录到一个组织,他可以在无需再次登录的情况下访问属于该组织的所有应用。
根据架构图,casdoor作为认证中心,apisix是需要接入到casdoor的一个应用。
1). 创建组织
2). 创建应用
3). 创建用户
3. 将casdoor配置为apisix的认证中心
1). 创建oidc插件
它的作用是,当创建的路由引用这个插件时,如果用户未登录,拦截用户的请求
curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1000 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{"desc": "test-oidc","plugins": { "openid-connect":{ "client_id": "11f0f7aedeadf26f266c","client_secret": "8e30fc2463344170d8e05ec63d5a3056c8e605fa","discovery": "http://192.168.237.1:8000/.well-known/openid-configuration","bearer_only": false,"realm": "master","introspection_endpoint_auth_method": "client_secret_basic","redirect_uri":"http://192.168.237.1:9080/callback"}}
}'
2). 创建静态文件路由,允许直接访问静态文件
下面的静态服务可以用nginx打包一个容器来私服静态文件
curl http://127.0.0.1:9180/apisix/admin/routes/2000 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{"uri": "/*","host": "test_domain.com","vars": [["uri", "~~", ".(js|css|flash|media|jpg|png|gif|ico|svg|json)$"]],"upstream":{"type": "roundrobin","nodes":{"static-service:80":1}}
}'
3). 拦截余下所有路径请求
下面的plugin_config_id即为引用的oidc插件id,当请求网站根路径时,会自动跳转到casdoor,当用户未登录请求非静态文件路径时,会报错。
curl http://127.0.0.1:9180/apisix/admin/routes/3000 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{"uri": "/*","host": "test_domain.com","enable_websocket":true,"plugin_config_id": 1000,"upstream":{"type": "roundrobin","nodes":{"api-service:80":1}}
}'