zoukankan      html  css  js  c++  java
  • openresty router && template 试用

    router 是一个比较方便的 openresty 路由组件,我们可以用来编写灵活强大的 web 应用,类似的
    lua-resty-route 也是很不错的,但是如果是比较简单的直接可以使用 lua-resty-template
    备注: 测试环境使用docker-compose

    环境准备

    • docker-compose 文件
    version: "3"
    services:
      router:
        build: ./
        volumes:
        - "./nginx_lua/:/opt/app/"
        - "./nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf"
        ports:
        - "8080:80"
    • nginx.conf
      包含了template 以及router 的使用
    worker_processes 1;
    user root;  
    events {
        worker_connections 1024;
    }
    http {
        include mime.types;
        default_type application/octet-stream;
        sendfile on;
        keepalive_timeout 65;
        lua_code_cache off;
        lua_need_request_body on;
        gzip on;
        resolver 127.0.0.11 ipv6=off;          
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
        lua_package_path '/opt/app/?.lua;;';
        init_by_lua_block { 
           template = require "resty.template"
         }
        server {
            listen 80;
            server_name localhost;
            charset utf-8;
            default_type text/html;
            location / {
               default_type text/plain;
               content_by_lua_block {
                   require("web/init")()
               }
            }
            location /userlogin {
               set $template_root /opt/app/static;
               content_by_lua_block {
                   require("web/jquery")();
               }
            }
            location /usercom {
                 set $template_root /opt/app/static;
                 content_by_lua_block {
                   require("web/com")();
                 }
            }
            location = /favicon.ico {
                root /opt/app/static;
            }
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
                root html;
            }
    
        }
    }
    • dockerfile
      安装lua 包
    FROM openresty/openresty:alpine-fat
    LABEL author="1141591465@qq.com"
    RUN /usr/local/openresty/luajit/bin/luarocks install luacheck
    RUN /usr/local/openresty/luajit/bin/luarocks install busted
    RUN /usr/local/openresty/luajit/bin/luarocks install luacov
    RUN /usr/local/openresty/luajit/bin/luarocks install luacov-coveralls
    RUN /usr/local/openresty/luajit/bin/luarocks install router
    RUN /usr/local/openresty/luajit/bin/luarocks install lua-resty-template
    EXPOSE 80

    router && template 代码

    • router
      nginx_lua/web/init.lua router 的路由编写还是很清晰的,按照http verb 很清晰
    local router = require 'router'
    function init()
          local r = router.new()
          r:match({
            GET = {
              ["/hello"] = function(params) ngx.print("someone said hello") end,
              ["/hello/:name"] = function(params) ngx.print("hello, " .. params.name) end,
              ["/"] = function(params) ngx.say([[demo app rong]]) end
            },
            POST = {
              ["/app/:id/comments"] = function(params)
                ngx.print("comment " .. params.comment .. " created on app " .. params.id)
              end
            }
          })
    
          local ok, errmsg = r:execute(
            ngx.var.request_method,
            ngx.var.request_uri,
            ngx.req.get_uri_args(), -- all these parameters
            ngx.req.get_post_args(), -- will be merged in order
            {other_arg = 1}) -- into a single "params" table
    
          if ok then
            ngx.status = 200
          else
            ngx.status = 404
            ngx.print("Not found!")
            ngx.log(ngx.ERROR, "some wrong")
          end
    end
    return init

    template 代码,这个主要是需要配置几变量,指定模板文件的位置,如下:

    location /userlogin {
               set $template_root /opt/app/static;
               content_by_lua_block {
                   require("web/jquery")();
               }
    }

    template render 代码,template 使用了全局变量,在init 阶段初始化

    init_by_lua_block { 
           template = require "resty.template"
    }

    render 处理
    nginx_lua/web/juqey.lua

    function init()
        template.render(
            "index.html",
            {
                message = "Hello, World!",
                jquery = '<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>'
            }
        )
    end
    return init

    view 模板
    nginx_lua/static/index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>index page demo</title>
    </head>
    <body>
        {{message}}
        {*jquery*}
        <script >
            $(document).ready(function(){
                alert("is ok")
            })
        </script>
    </body>
    </html>

    运行效果

    • 启动
    docker-compose up -d
    curl -i http://localhost:8080
    HTTP/1.1 200 OK
    Server: openresty/1.13.6.2
    Date: Thu, 24 Jan 2019 00:29:35 GMT
    Content-Type: text/plain; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    
    demo app rong

    view template:

    curl -i http://localhost:8080/userlogin
    HTTP/1.1 200 OK
    Server: openresty/1.13.6.2
    Date: Thu, 24 Jan 2019 00:30:19 GMT
    Content-Type: text/html; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>index page demo</title>
    </head>
    <body>
        Hello, World!
        <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
        <script >
            $(document).ready(function(){
                alert("is ok")
            })
        </script>
    </body>

    说明

    openresty 的开发还是很方便的,可以帮助我们解决好多实际中的问题。简单高效

    参考资料

    https://github.com/rongfengliang/openrety-router-docker-compose
    https://github.com/bungle/lua-resty-route
    https://github.com/APItools/router.lua
    https://github.com/bungle/lua-resty-template

  • 相关阅读:
    nginx设置缓存策略
    http缓存原理理解
    promise教程
    vue项目发布到github演示
    vue路由嵌套子路由不渲染
    hihocoder 1403 1407 1415 后缀数组*3 最长公共子串/最长不重叠重复出现的子串/最长k次重复子串
    hdu 4691 后缀数组+rmq 求子串lcp
    hdu1506+ luogu 1440 单调栈/单调队列裸题
    codeforces 873F 后缀数组+单调栈(fastio)
    HihoCoder
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/10312545.html
Copyright © 2011-2022 走看看