简述
至于为什么要单拉出来来讲这个模块,以及这个模块的作用,目标是什么,理由如下:
- 场景:开发者对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>
但是业务线的使用是正常的,很奇怪…就只是这个命令有问题(暂时只发现了这些…)