Openresty是什么?

重申一下Openresty是什么?截一张Openresty官网,春哥对Openresty的一个官方说明如下图:
Openresty官方说明

我的理解Openresty = Nginx + ngxhttp_lua_module + lua_resty*;它是一个原生Nginx合上一个HTTP_LUA模块,在加上一系列Lua_resty模块组成的一个Ngx_Lua高性能服务生态。

Openresty处理HTTP请求的执行阶段

Openrestry处理HTTP请求的执行阶段来自于Nginx,Nginx的HTTP框架依据常见的处理流程将处理阶段划分为11个阶段,其中每个处理阶段可以由任意多个HTTP模块流水式地处理请求,Openresty通过ngx_http_lua_module将Lua特性嵌入Nginx,ngx_http_lua_module属于一个Nginx的HTTP模块,为高性能服务开发封装了7个相应HTTP请求处理阶段如下:

  • set_by_lua
  • content_by_lua
  • rewrite_by_lua
  • access_by_lua
  • header_filter_by_lua
  • body_filter_by_lua
  • log_by_lua

有同学会发现,Openresty所提供的LUA解析指令还有以下两个:

  • init_by_lua
  • init_worker_by_lua
    init_by_lua作用在配置加载阶段,init_worker_by_lua作用在worker进程初始化阶段,并非HTTP请求处理阶段。

另外,需要重点提一下的是,Nginx输出过滤器是流式处理模型,一个数据块body filter就被调用一次。可以用以下简单的例子测试验证:
nginx.conf

  1. http {
  2. # use sendfile
  3. sendfile on;
  4. # Va initialization
  5. lua_package_path "...;;";
  6. lua_package_cpath "...;";
  7. lua_code_cache off;
  8. init_by_lua_block {ngx.log(ngx.ERR, '=======>init')}
  9. init_worker_by_lua_block {ngx.log(ngx.ERR, '=======>init_worker')}
  10. rewrite_by_lua_block {ngx.log(ngx.ERR, '=======>rewrite')}
  11. access_by_lua_block {ngx.log(ngx.ERR, '=======>access')}
  12. header_filter_by_lua_block {ngx.log(ngx.ERR, '=======>header_filter')}
  13. body_filter_by_lua_block {ngx.log(ngx.ERR, '=======>body_filter')}
  14. log_by_lua_block {ngx.log(ngx.ERR, '=======>log')}
  15. server {
  16. # List port
  17. listen 7200;
  18. set $template_root '';
  19. set_by_lua_block $a {ngx.log(ngx.ERR, '=======>set'); return 'xxx'}
  20. # Access log with buffer, or disable it completetely if unneeded
  21. access_log logs/development-access.log combined buffer=16k;
  22. # access_log off;
  23. # Error log
  24. error_log logs/development-error.log;
  25. # Va runtime
  26. location / {
  27. content_by_lua_block {
  28. ngx.log(ngx.ERR, '=======>content')
  29. ngx.say('----------')
  30. ngx.say('---ccc-------')
  31. ngx.say('---vvvv-------')
  32. ngx.say('---vdddv-------')
  33. ngx.say('---ggvv-------')
  34. }
  35. # content_by_lua_file ./pub/index.lua;
  36. }
  37. }
  38. }

logs/development-error.log截取

  1. set_by_lua:1: =======>set
  2. rewrite_by_lua(development-nginx.conf:31):1: =======>rewrite
  3. access_by_lua(development-nginx.conf:32):1: =======>access
  4. content_by_lua(development-nginx.conf:60):2: =======>content
  5. header_filter_by_lua:1: =======>header_filter
  6. body_filter_by_lua:1: =======>body_filter
  7. body_filter_by_lua:1: =======>body_filter
  8. body_filter_by_lua:1: =======>body_filter
  9. body_filter_by_lua:1: =======>body_filter
  10. body_filter_by_lua:1: =======>body_filter
  11. body_filter_by_lua:1: =======>body_filter
  12. log_by_lua(development-nginx.conf:35):1: =======>log while logging request

可以看出body_filter的执行次数等于ngx.say数量加一