Openresty资料之http服务

OpenResty完美地结合了Nginx的事件驱动机制和Lua的协程机制,所有的函数都是同步非阻塞的,处理请求时不需要像其他语言那样编写难以理解的异步回调函数,自然而且高效。

◆ 配置:

以下八个指令可以用在配置文件的http{}里调整OpenResty处理HTTP 请求时的行为。

1、lua_use_default_type on | off

在发送响应数据时是否在响应头宇段“ Content-Type ”里使用默认的MIME 类型,通常应设置为on 。

2、lua_malloc_trim num

设置清理内存的周期,参数num是请求的次数。当处理了num个请求后OpeηRe sty就会调用libc 函数mall oc trim ,把进程内的空闲内存归还给系统,从而最小化内存占用。

参数num 的默认值是1000 ,每1000个请求就会执行一次内存清理,可以根据实际情况设定num 。如果系统的内存足够大,或者不关心OpenResty的内存占用,那么可以设置为0,这将禁用内存清理。

3、lua_need_request_body on | off

是否要求OpenResty在开始处理流程前强制读取请求体数据,默认值是off ,即不会主动读取请求体。不建议把指令置为on状态,这将会增加无谓的读取动作,降低OpenResty的运行效率,可以使用ngx.req.read_body函数按需读取数据,更加灵活。

4、lua_http10_buffering on l off

启用或禁用HTTP1.0 里的缓冲机制,默认值是on。这个指令仅是为了兼容HTTP 1.0/0.9 协议,由于目前HTTP 1 .1 基本己经全面普及,建议把它置为off,可以加快Openresty的处理速度。

5、rewrite_by_lua_no_postpone on l off

是否让“ rewrite_by_lua ”在rewrite阶段的最后执行,默认值是off, 即“rewrite_by_lua ”里的Lua 代码将在其他Nginx rewrite 功能模块之后执行。除非有特殊需要或者对OpenResty的执行阶段有透彻理解,建议使用默认值off。

6、access_by_lua_no_postpone on l off

是否让access_by_lua在access阶段的最后执行,默认值是off , 即access_by_lua里的Lua代码将在其他Nginx access 功能模块之后执行。除非有特殊需要,建议使用默认值off 。

7、lua_transform_underscores_in_response_headers on l off

是否把Lua代码里响应头名字的“_”转换成“-”,默认值是on ,建议保持默认值。

8、lua_check_client_abort on l off

是否启用OpenResty的客户端意外断连检测,默认值是off。如果打开此指令, 则需要在Lua 程序里编写一个handler 来处理断连。

◆ 常量:

1、状态码:

状态码表示HTTP请求的处理状态,目前RFC规范里有一百多个, 在OpenResty 里只定义了少量最常见的,

ngx.HTTP_OK:200,请求己成功处理
ngx.HTTP_MOVED_TEMPORARILY:302,重定向跳转
ngx.HTTP_ BAD_REQUEST:400,客户端请求错误
ngx.HTTP_UNAUTHORIZED:401,未认证
ngx.HTTP_FORBIDDEN:403,禁止访问
ngx.HTTP_NOT_FOUND:404,资源未找到
ngx.HTTP_INTERNAL_SERVER_ERROR:500,服务器内部错误
ηgx. HTTP_BAD_GATEWAY:502,网关错误,反向代理后端无效响应
ngx.HTTP_SERVICE_UNAVAILABLE:503,服务器暂不可用
ngx.HTTP_GATEWAY_TIMEOUT:504,网关超时,反向代理时后端超时

在编写代码时不使用这些常量,直接用200、404这样的数字也是可以的,两者完全等价。

2、请求方法:

HTTP协议里有GET/POST/PUT 等方法,相应地Openresty也定义了这些常量

ngx.HTTP_GET:读操作,获取数据
ngx.HTTP_HEAD:读操作,获取元数据
ngx.HTTP_POST:写操作,提交数据
ngx.HTTP_PUT:写操作,更新数据
ngx.HTTP_DELETE:写操作,删除数据
ngx.HTTP_PATCH:写操作,局部更新数据

要注意的是这些常量并不是字符串,而是数字,主要用于ngx.req.set_method 和ngx.location.capture。

◆ 变量:

OpenResty使用表ngx.var操作Nginx变量,里面包含了所有的内置变量和自定义变量,可以用名字直接访问。

1、读变量:

ngx.var读取Nginx变量使用“.”或“[]”

ngx.var.uri  -- 变量$uri,请求的URI
ngx.var['http_post']  -- 变量$http_host ,请求头里的ho st

if #ngx.var.is_argus > 0 then  -- 检查是否有URI参数,$is_args
	ngx.say(ngx.var.args)  -- 输出URI里的参数, $args
end

ngx.var.xxx 虽然很方便,不过每次调用都会有一点点的额外开销(内部分配少量内存),所以不建议过度使用,应当尽量使用OpenResty 里等价的功能接口,如果必须要使用则最好local化暂存,避免多次调用

local uri = ngx.var.uri  -- -- local化,避免多次调用ngx.var

2、写变量:

Nginx 内置的变量绝大多数是只读的,只有$args 、$limit_rate等极少数可以直接修改,强行修改只读变量会导致程序运行错误:

ngx.var.limit_rate = 1024*2  -- 改写限速变量为2K
ngx.var.uri =”unchangeable "  -- 不可修改,会在运行日志里记录错误信息

配置文件里使用set指令自定义的变量是可写的,允许任意赋值修改,由于变量在处理流程中全局可见,所以我们可以利用它来在请求处理的各个阶段之间传递数,作用类似ngx.ctx。

set $new_log_var = 'a'
ngx.var.new_log_var =”log it"  -- 修改变量,可在之后的log等阶段里使用

set_by_ lua是另一种改写变量的方式,它类似指令set或map,但能够使用Lua代码编写复杂的逻辑赋值给变量

set_by_lua_block $var {  -- 赋值给变量$var
	local len = ngx.var.request_length  -- 获取请求长度♀ request_le ngth
	return tonumber(len)*2  -- 加倍后赋值
}

不建议使用“set_by_lua,它的限制较多(

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值