高性能且具备一系列安全策略的网关对于承载具体业务至关重要,对于个人开发者而言,你的入口更是决定着你收益的稳定性,因此,选择一款合适的Api网关来承载自身不断扩展的业务就成了首要任务,在对比了Nginx、Kong、Tyk、Gloo、Apache Apisix之后,果断入坑apisix, apisix无论在性能、配置效率、还是功能层面,都领先其他产品,尽管在使用的时候遇到了很多坑,官方的文档也很糟乱,不过在部署完成后,就不需要管那些了。
部署apisix首选docker compose方式,可以在官方的github上面下载demo
一、克隆仓库
git clone https://github.com/apache/apisix-docker.git
cd example
##其中docker-compose.yml就是部署需要的文件,由于官网的这份compose中没有dashboard容器,而部署apisix的目的就是为了方便配置,所以dashboard是必须的,我在官网基础上加入了dashboard
二、拷贝dashboard配置文件
将all-in-one中apisix-dashboard文件夹拷贝到example目录中,下面dashboard容器需要挂载使用
三、编写compose文件
最终修改后的docker-compose.yml 如下
version: "3"
services:
apisix:
##这边写死为最新的版本
image: apache/apisix:3.8.0-debian
restart: always
volumes:
- ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
depends_on:
- etcd
##network_mode: host
#9180 admin port, 9080 api端口,9443 https端口
ports:
- "9180:9180/tcp"
- "9080:9080/tcp"
- "9091:9091/tcp"
- "9443:9443/tcp"
- "9092:9092/tcp"
networks:
apisix:
etcd:
image: bitnami/etcd:3.5.11
restart: always
volumes:
- etcd_data:/bitnami/etcd
environment:
ETCD_ENABLE_V2: "true"
ALLOW_NONE_AUTHENTICATION: "yes"
ETCD_ADVERTISE_CLIENT_URLS: "http://etcd:2379"
ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
ports:
- "2379:2379/tcp"
networks:
apisix:
##这是新增的,注意必须别用3.0.1有bug,插件市场是加载不出来的
dashboard:
image: "apache/apisix-dashboard:3.0.0-centos"
restart: always
depends_on:
- etcd
volumes:
##这里的配置文件使用all-in-one/apisix-dashboard/conf.yaml即可
- ./apisix-dashboard/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml:ro
ports:
- "9000:9000/tcp"
networks:
- apisix
###测试用的服务,测完负载均衡可删除
web1:
image: nginx:1.19.0-alpine
restart: always
volumes:
- ./upstream/web1.conf:/etc/nginx/nginx.conf
ports:
- "8081:80/tcp"
environment:
- NGINX_PORT=80
networks:
apisix:
###测试用的服务,测完负载均衡可删除
web2:
image: nginx:1.19.0-alpine
restart: always
volumes:
- ./upstream/web2.conf:/etc/nginx/nginx.conf
ports:
- "8082:80/tcp"
environment:
- NGINX_PORT=80
networks:
apisix:
###监控工具,很有必要
prometheus:
image: prom/prometheus:v2.25.0
restart: always
volumes:
- ./prometheus_conf/prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
networks:
apisix:
###上面这个监控工具的图形化展示,很有必要
grafana:
image: grafana/grafana:7.3.7
restart: always
ports:
- "3000:3000"
volumes:
- "./grafana_conf/provisioning:/etc/grafana/provisioning"
- "./grafana_conf/dashboards:/var/lib/grafana/dashboards"
- "./grafana_conf/config/grafana.ini:/etc/grafana/grafana.ini"
networks:
apisix:
####使用独立的网络名为apisix
networks:
apisix:
driver: bridge
volumes:
etcd_data:
driver: local
四、如果只是跑起来试一下,以上就OK了,接着就是启动
##在当前目录下执行,前提是安装了docker和compose
docker-compose -p docker-apisix up -d
五、如果要用到生产环境,有几个地方必须要改一下
apisix_conf/config.yaml中
.......
admin_key:
##这个名称也最好改掉
- name: "admin"
##这个key改掉,随便找个md5工具,输个字符串,输出32位哈希值即可使用
key: edd1c9f034335f136f87ad84b625c8f1
role: admin # admin: manage all configuration data
##名称最好也改掉
- name: "viewer"
##上面都改了,这边也干脆改下
key: 4054f7cf07e344346cd3f287985e76a2
role: viewer
.......
apisix-dashboard/conf.yaml中
authentication:
secret:
##看了注释,这个secret也改掉
secret # secret for jwt token generation.
# NOTE: Highly recommended to modify this value to protect `manager api`.
# if it's default value, when `manager api` start, it will generate a random string to replace it.
expire_time: 3600 # jwt token expire time, in second
users:
###这四个值都改掉,随便你怎么定义,这是dashboard管理页面要输入的地址
- username: admin # username and password for login `manager api`
password: admin
- username: user
password: user
web1、web2两个容器可以删掉,留着没必要,docker-compose.yaml文件中配置删除即可。
另外更安全的做法是把端口全部改掉,一是因为apisix使用到的端口很常见,很难避免不与其他服务端口冲突。
如果没有冲突,或者你的端口不会暴露到公网,不改也没事,但是暴露到公网的端口尽量改掉。
修改端口只要修改docker-compose.yaml中的冒号前面部分,至于配置中的端口号大部分都不需要改,因为他们同属于一个网络组,他们内部通信使用容器端口是可以访问的。
注意点:
apisix-dashboard:3.0.0请使用3.0.0版本,不要用最新的3.0.1,有插件显示空白bug,这个问题在github issue中有人提到。
具体配置请看第二篇 Docker compose部署最新版Apisix网关(二)