写在前

说来你们可能不信,昨天一个乙方系统的同学发了这么个需求来找我帮忙配……What?!😱😱😱

对于上述需求不予评价,但就这个事来说我觉得我有必要整理下Nginx相关配置的东西了……一是防止自己闹出这种笑话;二也是因为岁数大了记性差了,还是写点东西备查吧。

从一堆timeout说起

proxy_connect_timeout

Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout

这个参数定义的是Nginx与后端服务器(“proxied server”,被代理的服务器)建立连接的超时时间,一般不应大于75s。

proxy_read_timeout

Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout

这个参数定义的是Nginx读后端服务器(“proxied server”,被代理的服务器)响应包的超时时间(需要注意的是这个时间指的是两次成功读取造作的间隔时间而不是读取完整响应包的总时间)。超过这个时间没有收到后端服务器传送数据的话连接就会超时断开。

PS:该值过小可能会导致504的情况出现,如不想遇到可以将此值改为略大于后端服务器响应超时的时间。

proxy_send_timeout

Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location
官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout

这个参数定义的是Nginx给后端服务器(“proxied server”,被代理的服务器)发送请求包的超时时间(需要注意的是这个时间指的是两次成功写取造作的间隔时间而不是发送完整请求包的总时间)。超过这个时间没有发送数据给后端服务器的话连接就会超时断开。

(未完待续)

 

点击数:600

最近在做的两个功能都需要对request body进行读取处理,好在OpenResty提供了相关函数,这里简单记一下。

获取request body

ngx.req.get_body_data

官方文档:https://github.com/openresty/lua-nginx-module#ngxreqget_body_data

简单说这个函数是获取内存中request body。获取成功时它会返回string类型的request body(如果需要table形式的请求参数可以使用ngx.req.get_post_args()函数);获取失败时返回nil,返回nil可能是以下原因造成的:

  1. request body没有被读入;
  2. request body已被写入临时文件(temporary file);
  3. 没有request body(request body大小为0)。

因为Nginx默认不会读取request body,所以为保证可以如期的获取到,我们最好先请求ngx.req.read_body()函数(或者打开lua_need_request_body开关强制读取request body。PS:不建议这样做),再去请求ngx.req.get_body_data();当request body已被写入临时文件时,我们需要通过ngx.req.get_body_file()函数来获取request body。

ngx.req.get_body_file

官方文档:https://github.com/openresty/lua-nginx-module#ngxreqget_body_file

这个函数和上面ngx.req.get_body_data相似,但是是用来获取临时文件中request body的。当还没有读取request body或request body在内存中时会返回nil。

这里需要注意的一件事是这时读出来的数据是只读的,不可以再在Lua代码中进行手工的modified、rename、remote。

Nginx的几个重要配置

讲到这里,感觉前面好像错过了什么重要的细节……对,就是request body到底在哪里?什么时候在内存,什么时候在临时文件?说到这个就需要去翻一下Nginx的文档啦~

client_max_body_size

首先先来看下client_max_body_size,这个参数设置了被允许的最大的request body大小,当一个request超过这个值的时候将会返回413错误(Request Entity Too Large)。如果不需要检查request body的大小将此值置为0即可。

client_body_buffer_size

再来看下client_body_buffer_size,这个参数设置了读取request body的buffer大小(默认值是两个内存页的大小,8k|16k)。当request body大于这个值时就会写在临时文件中。

好了,前面的疑惑解决了,但是还有两个问题:如何让request body只在内存或者临时文件中呢?

强制使用内存存request body

前面讲了client_max_body_size和client_body_buffer_size两个参数,其实将client_body_buffer_size设为client_max_body_size的大小就可以强制把request body放在内存中了。

强制使用临时文件存request body

Nginx配置中有个client_body_in_file_only参数(详见这里),开启后就强制把request body放在临时文件中了。

最后

好了,文章戛然而止,没有“最后”……

 

点击数:1211