Aqui está uma guia para configurar rotas e autenticação em um ambiente de APISIX usando Docker.
Versão do Docker
root@servidor:/opt/docker/apisix# docker version
Cliente:
Versão: 24.0.5
API versão: 1.43
Linguagem Go: go1.20.3
Commit Git: 24.0.5-0ubuntu1~22.04.1
Construído: Seg Ago 21 19:50:14 2023
SO/Arquitetura: linux/amd64
Contexto: padrão
Servidor:
Motor:
Versão: 24.0.5
API versão: 1.43 (versão mínima 1.12)
Linguagem Go: go1.20.3
Commit Git: 24.0.5-0ubuntu1~22.04.1
Construído: Seg Ago 21 19:50:14 2023
SO/Arquitetura: linux/amd64
Experimental: falso
containerd:
Versão: 1.7.2
Commit Git:
runc:
Versão: 1.1.7-0ubuntu1~22.04.2
Commit Git:
docker-init:
Versão: 0.19.0
Commit Git:
Versão do Sistema Operacional
root@servidor:/opt/docker/apisix# lsb_release -a
LSB Versão: núcleo-11.1.0ubuntu4-sem-arquitetura:segurança-11.1.0ubuntu4-sem-arquitetura
ID Distribuidor: Ubuntu
Descrição: Ubuntu 22.04.3 LTS
Versão: 22.04
Código: jammy
Contêineres em Execução
root@servidor:/opt/docker/apisix# docker ps
ID CONTÊINER IMAGEM COMANDO CRIADO HÁ STATUS PORTAS NOMES
abc123def456 apache/apisix:3.9.0-debian "/docker-entrypoint.…" 17 segundos atrás Em funcionamento há 15 segundos 0.0.0.0:9080->9080/tcp, :::9080->9080/tcp, 0.0.0.0:9091->9091/tcp, :::9091->9091/tcp, 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp, 0.0.0.0:9180->9180/tcp, :::9180->9180/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp, 0.0.0.0:9090->9092/tcp, :::9090->9092/tcp apisix-inicio
ghi789jkl012 bitnami/etcd:3.5.7 "/opt/bitnami/script…" 2 minutos atrás Em funcionamento há cerca de um minuto 2379-2380/tcp etcd-inicio
Veirficação do Servidor APISIX
root@servidor:/opt/docker/apisix# curl "http://127.0.0.1:9080" --head | grep Server
% Total % Recebido % Enviado Taxa média Taxa média Tempo total Tempo parcial Tempo restante Velocidade
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
Servidor: APISIX/3.9.0
Configuração de Rotas
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
"identificador": "inicio-ip",
"uri": "/ip",
"upstream": {
"tipo": "roundrobin",
"nodos": {
"httpbin.org:80": 1
}
}
}'
HTTP/1.1 201 Criado
Data: Qua, 03 Abr 2024 02:13:24 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3
{"chave":"/apisix/routes/inicio-ip","valor":{"identificador":"inicio-ip","status":1,"tempo_atualização":1712110404,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"tempo_criação":1712110404,"prioridade":0,"uri":"/ip"}}
root@servidor:/opt/docker/apisix#
root@servidor:/opt/docker/apisix# curl "http://127.0.0.1:9080/ip"
{
"origem": "172.21.0.1, 117.72.36.203"
}
Chaves Padrão no etcd
I have no name!@ghi789jkl012:/opt/bitnami/etcd/bin$ etcdctl get --prefix --keys-only ""
/apisix/grupos_consumidores/
/apisix/consumidores/
/apisix/info_servidor_plano_dados/b1de8a17-c57c-4228-9b73-ff8519aea650
/apisix/regras_globais/
/apisix/configurações_plugins/
/apisix/metadados_plugins/
/apisix/plugins/
/apisix/protos/
/apisix/rotas/
/apisix/rotas/inicio-ip
/apisix/segredos/
/apisix/serviços/
/apisix/ssl/
/apisix/rotas_stream/
/apisix/upstreams/
Rota Adicionada Recentemente
I have no name!@ghi789jkl012:/opt/bitnami/etcd/bin$ etcdctl get /apisix/rotas/inicio-ip
/apisix/rotas/inicio-ip
{"identificador":"inicio-ip","status":1,"tempo_atualização":1712110404,"prioridade":0,"tempo_criação":1712110404,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"uri":"/ip"}
Balanço de Carga
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
"identificador": "inicio-cabecalhos",
"uri": "/cabecalhos",
"upstream" : {
"tipo": "roundrobin",
"nodos": {
"httpbin.org:443": 1,
"mock.api7.ai:443": 1
},
"pass_host": "nodo",
"esquema": "https"
}
}'
HTTP/1.1 201 Criado
Data: Qua, 03 Abr 2024 02:25:13 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3
{"chave":"/apisix/rotas/inicio-cabecalhos","valor":{"identificador":"inicio-cabecalhos","status":1,"tempo_atualização":1712111113,"upstream":{"esquema":"https","tipo":"roundrobin","nodos":{"httpbin.org:443":1,"mock.api7.ai:443":1},"hash_em":"vars","pass_host":"nodo"},"tempo_criação":1712111113,"prioridade":0,"uri":"/cabecalhos"}}
root@servidor:/opt/docker/apisix# contagem=$(seq 100 | xargs -I {} curl "http://127.0.0.1:9080/cabecalhos" -sL | grep "httpbin" | wc -l); echo httpbin.org: $contagem, mock.api7.ai: $((100 - $contagem))
httpbin.org: 48, mock.api7.ai: 52
Autenticação por Chave
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/consumidores" -X PUT -d '
{
"nome_usuario": "joao",
"plugins": {
"autenticacao-chave": {
"chave": "chave-secreta"
}
}
}'
HTTP/1.1 201 Criado
Data: Qua, 03 Abr 2024 02:30:41 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3
{"chave":"/apisix/consumidores/joao","valor":{"nome_usuario":"joao","tempo_criação":1712111441,"plugins":{"autenticacao-chave":{"chave":"chave-secreta"}},"tempo_atualização":1712111441}}
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9080/ip"
HTTP/1.1 200 OK
Tipo Conteúdo: application/json
Comprimento Conteúdo: 44
Conexão: manter-viva
Data: Qua, 03 Abr 2024 02:31:32 GMT
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Servidor: APISIX/3.9.0
{
"origem": "172.21.0.1, 117.72.36.203"
}
root@servidor:/opt/docker/apisix#
root@servidor:/opt/docker/apisix#
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/rotas/inicio-ip" -X PATCH -d '
{
"plugins": {
"autenticacao-chave": {}
}
}'
HTTP/1.1 200 OK
Data: Qua, 03 Abr 2024 02:31:41 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3
{"chave":"/apisix/rotas/inicio-ip","valor":{"identificador":"inicio-ip","status":1,"prioridade":0,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"consulta":"apikey"}},"tempo_atualização":1712111501,"tempo_criação":1712110404,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"uri":"/ip"}}
root@servidor:/opt/docker/apisix#
root@servidor:/opt/docker/apisix#
root@servidor:/opt/docker/apisix#
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9080/ip"
HTTP/1.1 401 Não Autorizado
Data: Qua, 03 Abr 2024 02:31:48 GMT
Tipo Conteúdo: texto/plano; charset=utf-8
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
{"mensagem":"Chave API ausente na solicitação"}
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9080/ip" -H 'apikey: chave-incorreta'
HTTP/1.1 401 Não Autorizado
Data: Qua, 03 Abr 2024 02:32:37 GMT
Tipo Conteúdo: texto/plano; charset=utf-8
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
{"mensagem":"Chave API inválida na solicitação"}
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9080/ip" -H 'apikey: chave-secreta'
HTTP/1.1 200 OK
Tipo Conteúdo: application/json
Comprimento Conteúdo: 44
Conexão: manter-viva
Data: Qua, 03 Abr 2024 02:32:55 GMT
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Servidor: APISIX/3.9.0
{
"origem": "172.21.0.1, 117.72.36.203"
}
root@servidor:/opt/docker/apisix# curl "http://127.0.0.1:9180/apisix/admin/rotas/inicio-ip" -X PATCH -d '
{
"plugins": {
"autenticacao-chave": {
"_meta": {
"desabilitar": verdadeiro
}
}
}
}'
{"chave":"/apisix/rotas/inicio-ip","valor":{"identificador":"inicio-ip","status":1,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"tempo_atualização":1712111991,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"_meta":{"desabilitar":verdadeiro},"consulta":"apikey"}},"tempo_criação":1712110404,"prioridade":0,"uri":"/ip"}}
root@servidor:/opt/docker/apisix#
root@servidor:/opt/docker/apisix#
root@servidor:/opt/docker/apisix#
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9080/ip"
HTTP/1.1 200 OK
Tipo Conteúdo: application/json
Comprimento Conteúdo: 44
Conexão: manter-viva
Data: Qua, 03 Abr 2024 02:40:12 GMT
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Servidor: APISIX/3.9.0
{
"origem": "172.21.0.1, 117.72.36.203"
}
Limitação de Taxa
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/rotas/inicio-ip" -X PATCH -d '
{
"plugins": {
"limite-contagem": {
"contagem": 2,
"janela_tempo": 10,
"codigo_rejeitado": 503
}
}
}'
HTTP/1.1 200 OK
Data: Qua, 03 Abr 2024 02:43:39 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3
{"chave":"/apisix/rotas/inicio-ip","valor":{"identificador":"inicio-ip","status":1,"prioridade":0,"tempo_atualização":1712112219,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"_meta":{"desabilitar":verdadeiro},"consulta":"apikey"},"limite-contagem":{"política":"local","contagem":2,"janela_tempo":10,"codigo_rejeitado":503,"chave":"endereco_remoto","permitir_degradação":falso,"mostrar_cota_limite_cabeçalho":verdadeiro,"tipo_chave":"var"}},"tempo_criação":1712110404,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"uri":"/ip"}}
I have no name!@ghi789jkl012:/opt/bitnami/etcd/bin$ etcdctl get /apisix/rotas/inicio-ip
/apisix/rotas/inicio-ip
{"identificador":"inicio-ip","status":1,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"tempo_atualização":1712112219,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"_meta":{"desabilitar":verdadeiro},"consulta":"apikey"},"limite-contagem":{"contagem":2,"política":"local","codigo_rejeitado":503,"chave":"endereco_remoto","permitir_degradação":falso,"mostrar_cota_limite_cabeçalho":verdadeiro,"janela_tempo":10,"tipo_chave":"var"}},"tempo_criação":1712110404,"prioridade":0,"uri":"/ip"}
root@servidor:/opt/docker/apisix# contagem=$(seq 100 | xargs -I {} curl "http://127.0.0.1:9080/ip" -I -sL | grep "503" | wc -l); echo \"200\": $((100 - $contagem)), \"503\": $contagem
"200": 2, "503": 98
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/rotas/inicio-ip" -X PATCH -d '
{
"plugins": {
"limite-contagem": {
"_meta": {
"desabilitar": verdadeiro
}
}
}
}'
HTTP/1.1 200 OK
Data: Qua, 03 Abr 2024 02:45:36 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3
{"chave":"/apisix/rotas/inicio-ip","valor":{"identificador":"inicio-ip","status":1,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"tempo_atualização":1712112336,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"_meta":{"desabilitar":verdadeiro},"consulta":"apikey"},"limite-contagem":{"política":"local","permitir_degradação":falso,"mostrar_cota_limite_cabeçalho":verdadeiro,"codigo_rejeitado":503,"_meta":{"desabilitar":verdadeiro},"chave":"endereco_remoto","contagem":2,"janela_tempo":10,"tipo_chave":"var"}},"tempo_criação":1712110404,"prioridade":0,"uri":"/ip"}}
I have no name!@ghi789jkl012:/opt/bitnami/etcd/bin$ etcdctl get /apisix/rotas/inicio-ip
/apisix/rotas/inicio-ip
{"identificador":"inicio-ip","status":1,"prioridade":0,"tempo_atualização":1712112336,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"_meta":{"desabilitar":verdadeiro},"consulta":"apikey"},"limite-contagem":{"política":"local","permitir_degradação":falso,"mostrar_cota_limite_cabeçalho":verdadeiro,"codigo_rejeitado":503,"_meta":{"desabilitar":verdadeiro},"chave":"endereco_remoto","contagem":2,"janela_tempo":10,"tipo_chave":"var"}},"tempo_criação":1712110404,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"uri":"/ip"}
root@servidor:/opt/docker/apisix# contagem=$(seq 100 | xargs -i curl "http://127.0.0.1:9080/ip" -I -sL | grep "503" | wc -l); echo \"200\": $((100 - $contagem)), \"503\": $contagem
"200": 100, "503": 0