至于为什么要单拉出来来讲这个模块,以及这个模块的作用,目标是什么,理由如下:

  • 场景:开发者对nginx的性能调优 或者 一些自定义的nginx功能。
  • 目标:使用kong完全替代nginx代理。
  • 需求程度:
  • 注入kong已集成的nginx参数;
  • 注入nginx指令包含的文件;
  • 自定义nginx模板;
  • 准备工作:
  • 可运行的kong、konga环境

实战场景:自定义kong的日志格式

这个模块整体分为3个应用场景,分为为:

  1. kong已集成的nginx参数;
  2. nginx指令包含的文件;
  3. 自定义nginx模板。

接下来我们来一一介绍以下~~

kong已集成的nginx参数

场景:设置单个nginx命令(kong已集成的)

对于此类需求,解决比较简单,官方文档也说的比较清楚了,我这里简述一下把。

  • 对于kong已集成的nginx参数,我们怎么知道呢?打开kong.conf文件(此文件是由kong.conf.default文件拷贝出来的),全局搜索nginx开头的配置,看是否有你需要的配置。
  • 规则
  • 带有nginx_http_前缀的条目将被注入整个http块指令。
  • 带有nginx_proxy_前缀的条目将被注入到处理Kong的代理端口的Service块指令中。
  • 带有nginx_admin_前缀的条目将被注入到处理Kong的Admin API端口的服务器块指令中。
  • 注意事项
  • 意shell的引用规则,指定包含空格的值;
  • 某些指令依赖于特定的Nginx模块,其中一些模块可能不包含在Kong的官方版本中。
  • example如果在kong.conf文件中设置
nginx_proxy_large_client_header_buffers=16 128k

其意思就相当于是在nginx的Service模块中添加

large_client_header_buffers 16 128k;

nginx指令包含的文件

场景:kong官方提供的模块是nginx_kong.conf,如果你想自定义接口,又不想跟nginx_kong耦合,那么就单拉出来一个独立的把

新建my_nginx.conf文件,存放至/usr/local/kong/目录下,模板:

# custom server
server {
  listen 80;
  location /rich/ {
      default_type 'text/plain';
      return 200 "success";
  }
}

新建完成之后,你得告知kong在初始化的时候给你的模板加进去

nginx_http_include = /usr/local/kong/my_nginx.conf

重新启动kong,访问http://ip/rich即可看到详情

注意,保证你的docker环境对外开放了80端口!!!!

接下来,你就可以在这里新增接口了

自定义nginx模板

在此之前,如果操作过此模块的话,我还是先说一下关于kong加载nginx这块的坑把:

在/usr/local/kong目录下,你可能会发现有这么几个配置文件:nginx.conf,nginx-kong.conf,nginx-kong-stream.conf,然后你突然这么灵机一动,既然有这些文件,那我岂不是直接在上面添加我需要的参数不就行了?然后添加完之后,你发现,卧槽,不管用啊,什么鬼???

其实上述那三个文件是kong通过一个模板自动生成的文件,所以你在上面修改,然后重新启动,就又会被模板覆盖了,所以没有用,所以你得修改模板,才能生效

模板的位置:/usr/local/share/lua/5.1/kong/templates

应用场景:

  • 自定义nginx的参数,或者修改kong官方的源码参数;
  • 在已经运行的OpenResty实例中嵌入Kong,则Nginx section Permalink可以重用Kong生成的配置并将其包含在现有配置中。

官方提供的模板:https://github.com/kong/kong/tree/master/kong/templates

直接在/usr/local/share/lua/5.1/kong/templates目录下的nginx.lua改你相对应的参数

自定义日志格式

以修改kong的nginx日志格式为例(这里用的是nginx-kong.lua,根据自身需求修改对应的模板就行):

官方默认日志:

kong配置生成nginx kong替代nginx_lua

自定义日志:

首先在nginx-kong.lua中引入你的日志格式:

log_format  main  'remote_addr=[$remote_addr] http_x_forward=[$http_x_forwarded_for] time=[$time_local] request=[$request] remote_user=[$remote_user] status=[$status] byte=[$body_bytes_sent] http_referer=[$http_referer] http_user_agent=[$http_user_agent]';

对应的位置:

kong配置生成nginx kong替代nginx_日志格式_02

kong配置生成nginx kong替代nginx_日志格式_03

然后在 server kong 与kong admin的access_log处填写你日志的别名,

重启kong

修改日志格式之后的日志:

kong配置生成nginx kong替代nginx_kong_04

踩坑点

  1. 因为项目业务需要,自己修改了nginx.lua文件,对于修改其他参数暂时没测出出来其他问题,但是 pid的位置尽可能的别自定义目录,因为会出问题。
return [[
error_log  /home/nginx/logs/error.log warn;
pid pids/nginx.pid;

# injected nginx_main_* directives
> for _, el in ipairs(nginx_main_directives) do
$(el.name) $(el.value);
> end
...
]]

如果修改了位置,会导致kong自身的检查机制出现问题,命令:

kong health

正常出现的结果为:

bash-5.1# kong health
nginx.......running

Kong is healthy at /usr/local/kong

修改pid位置之后则会:

/ # kong health
nginx.......not running

Error: Kong is not running at /usr/local/kong

  Run with --v (verbose) or --vv (debug) for more details
/ # kong health --v
2021/09/25 08:03:31 [verbose] Kong: 2.5.0
2021/09/25 08:03:31 [verbose] prefix in use: /usr/local/kong
2021/09/25 08:03:31 [verbose] reading config file at /usr/local/kong/.kong_env
2021/09/25 08:03:31 [verbose] prefix in use: /usr/local/kong
2021/09/25 08:03:31 [info] nginx.......not running
2021/09/25 08:03:31 [info]
Error:
/usr/local/share/lua/5.1/kong/cmd/health.lua:39: Kong is not running at /usr/local/kong
stack traceback:
        [C]: in function 'assert'
        /usr/local/share/lua/5.1/kong/cmd/health.lua:39: in function 'cmd_exec'
        /usr/local/share/lua/5.1/kong/cmd/init.lua:88: in function </usr/local/share/lua/5.1/kong/cmd/init.lua:88>
        [C]: in function 'xpcall'
        /usr/local/share/lua/5.1/kong/cmd/init.lua:88: in function </usr/local/share/lua/5.1/kong/cmd/init.lua:45>
        /usr/local/bin/kong:9: in function 'file_gen'
        init_worker_by_lua:47: in function <init_worker_by_lua:45>
        [C]: in function 'xpcall'
        init_worker_by_lua:54: in function <init_worker_by_lua:52>

但是业务线的使用是正常的,很奇怪…就只是这个命令有问题(暂时只发现了这些…)