至于为什么要单拉出来来讲这个模块,以及这个模块的作用,目标是什么,理由如下:
- 场景:开发者对nginx的性能调优 或者 一些自定义的nginx功能。
- 目标:使用kong完全替代nginx代理。
- 需求程度:
- 注入kong已集成的nginx参数;
- 注入nginx指令包含的文件;
- 自定义nginx模板;
- 准备工作:
- 可运行的kong、konga环境
实战场景:自定义kong的日志格式
这个模块整体分为3个应用场景,分为为:
- kong已集成的nginx参数;
- nginx指令包含的文件;
- 自定义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,根据自身需求修改对应的模板就行):
官方默认日志:
自定义日志:
首先在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]';
对应的位置:
然后在 server kong 与kong admin的access_log处填写你日志的别名,
重启kong
修改日志格式之后的日志:
踩坑点
- 因为项目业务需要,自己修改了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>
但是业务线的使用是正常的,很奇怪…就只是这个命令有问题(暂时只发现了这些…)