Nginx 和 OpenResty 以及 Kong 是有很大渊源的。
Nginx 是模块化设计的反向代理软件,C语言开发;
OpenResty 是以 Nginx 为核心的 Web 开发平台,可以解析执行 Lua 脚本;
Kong 是 OpenResty 的一个应用,是一个 API 网关,具有API管理和请求代理的功能。
介绍
三者实现了功能叠加和增强,并在不同的领域有重要的应用。本文先做一个记录和入门学习。
第一步是准备工作。为了统一环境,屏蔽差异,该模块内均采用了 Centos7 mini 最小安装版 + Docker 运行容器的形式。同时使用 Portainer 图形化工具进行管理 Docker
这里我有篇【CentOS7上Docker的使用,和 Portainer 的介绍】,详细介绍安装 Docker 和 Portainer 的使用,并对容器运行挂载目录做一个全局的约定(后续的容器数据都是通过挂载形式进行)
Docker 安装 Nginx
nginx运行在docker容器中对应的目录如下:
配置文件目录:/etc/nginx;
日志目录:/var/log/nginx;
项目根目录:/usr/share/nginx/html;
了解nginx在docker中运行的目录地址是为了把他们给复制到宿主机的目录下
挂载目录的话,docker启动时查找挂载的宿主机里挂载的配置文件,所以必须先把配置文件拷贝到宿主机目录里面。即运行一个临时的 Nginx 容器提取配置文件,随后删除,重新创建需要的容器
# 创建 nginx 挂载宿主机的绝对目录
mkdir /data/docker_data/nginx -p
# 创建临时容器,提取配置文件
docker run --name nginx -d -p 80:80 nginx:latest
# 将临时容器内的文件拷贝倒宿主机目录
docker cp nginx:/usr/share/nginx/html /data/docker_data/nginx/html
# 将临时容器内的文件拷贝倒宿主机目录
docker cp nginx:/etc/nginx /data/docker_data/nginx/etc
# 将临时容器内的文件拷贝倒宿主机目录
docker cp nginx:/var/log/nginx /data/docker_data/nginx/log
# 强制删除临时容器
docker rm -f nginx
接下来创建真正需要的Nginx容器
docker run --name nginx -p 80:80 \
-v /data/docker_data/nginx/html:/usr/share/nginx/html \
-v /data/docker_data/nginx/log:/var/log/nginx \
-v /data/docker_data/nginx/etc/nginx:/etc/nginx \
-d nginx:latest
访问 Nginx 服务
可以通过 docker ps 或者直接 这台服务器的 ip:端口 访问 nginx 服务
如上图,我重新修改了 Nginx的访问页面内容,具体修改如下:
解决中文乱码,需要指定 utf-8 编码
修改完成后,docker restart nginx 重启 nginx 容器,重新访问验证
Docker 安装 OpenResty
同上,我们依然建立临时OpenResty容器,随后提取配置文件到宿主机,再删除和重新创建真正需要的OpenResty容器
# 创建临时容器
docker run -id --name openresty -p 90:80 openresty/openresty:latest
# 提取容器文件到宿主机
docker cp openresty:/usr/local/openresty /data/docker_data/
# 删除临时容器
docker rm -f openresty
# 创建真正需要的容器,指定挂载目录
docker run --name openresty -p 90:80 \
-v /data/docker_data/openresty:/usr/local/openresty \
-d openresty/openresty:latest
访问 Nginx 服务
依然同上惯例,修改宿主机的 index.html 文件内容
然后运行 docker restart openresty , 重启容器后访问 ip:90 端口,查看效果
Docker 安装 Kong
Kong 在最近的发展中,有两种趋势,第一种 Less DB 即不需要第三方数据库持久化;另外一种是 通过 Cassandra or PostgreSQL 协同完成持久化。因为到了后续,我还想记录 Kong 的 dao 层,动态生成表等功能,所以选择 PostgreSQL 做持久化,这样 Kong 则接近于无状态服务
创建网桥
docker network create kong-net
安装 PostgreSQL 并挂载
##创建本地映射目录
mkdir /data/docker_data/postgresql -p
docker run -d --name kong-database \
--network=kong-net \
-v /data/docker_data/postgresql:/var/lib/postgresql/data \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
postgres:9.6
安装 Kong
# 为了避免账户密码傻傻分不清,统一都叫 kong
docker run --rm --network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_PASSWORD=kong" \
kong/kong-gateway:2.7.1.2-alpine kong migrations bootstrap
docker run -d --name kong-gateway \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
-e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
-p 8002:8002 \
-p 8445:8445 \
-p 8003:8003 \
-p 8004:8004 \
kong/kong-gateway:2.7.1.2-alpine
安装KongA
docker run -d -p 1337:1337 \
--name konga \
--network=kong-net \
-e DB_ADAPTER=postgres \
-e DB_HOST=kong-database \
-e DB_PORT=5432 \
-e DB_USER=kong \
-e DB_PASSWORD=kong \
-e DB_DATABASE=konga \
--restart=always \
pantsel/konga
随后访问 机器的 1337 端口创建账户
访问 kong 的管理端口,连接倒 kong
参考
- [1] Nginx、OpenResty、Kong 的基本概念和区别联系
- [2] Nginx
- [3] OpenResty
- [4] Kong
- [5] Kong在 docker hub 中的介绍