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 服务

image.png

如上图,我重新修改了 Nginx的访问页面内容,具体修改如下:

image.png

解决中文乱码,需要指定 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 文件内容

image.png

然后运行 docker restart openresty , 重启容器后访问 ip:90 端口,查看效果

image.png

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 端口创建账户

image.png

访问 kong 的管理端口,连接倒 kong

image.png

参考