1. 首页>
  2. 技术文章>
  3. docker安装OpenResty

docker安装OpenResty

4/25/23 4:48:01 PM 浏览 1338 评论 0

OpenResty

yml文件:

version: "3"
services:
  openresty:
    image: openresty/openresty:latest
    container_name: openresty
    cpu_shares: 512 
    mem_limit: 200m
    ports:
      - 80:80 
    volumes:
     - ./config/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf
    restart: unless-stopped

进入容器:

    docker exec -it openresty /bin/bash

nginx.conf内容如下:

worker_processes 4;
events {
    worker_connections 1024;
}
http {
    server {
        listen 80;
        location / {
            default_type "text/plain";
            content_by_lua_block {
                ngx.say("Hello, OpenResty!")
            }
        }
    }
}

如果要输出JSON的话,可以参考:

content_by_lua_block {
    local cjson = require "cjson"
    local data = {
name = "florent",
age = 100
    }
    ngx.say(cjson.encode(data))
}

得到Get请求的值:

local args = ngx.req.get_uri_args()
ngx.say("name: ", args["name"])

 读取post请求的JSON数据:

ngx.req.read_body() -- 读取请求体
local data = ngx.req.get_body_data()
if not data then
    ngx.say("failed to get JSON data")
    return
end
-- 解析 JSON 数据
local json = require("cjson.safe")
local decoded, err = json.decode(data)
if not decoded then
    ngx.say("failed to decode JSON data: ", err)
    return
end
-- 访问 JSON 数据
ngx.say("name: ", decoded["name"])
ngx.say("age: ", decoded["age"])

这个代码将会输出 POST 请求中的 JSON 数据中名为 name 和 age 的字段的值。需要注意的是,在使用 get_body_data() 方法之前,需要先调用 read_body() 方法来读取请求体,否则可能会出现错误。

另外,也可以通过 ngx.req.get_body_file() 方法来获取上传文件的信息和内容。需要注意的是,在使用这些方法获取 HTTP 请求参数和信息时,要遵循最佳实践和指南,并注意安全性和可靠性,以确保服务器和应用程序的安全和稳定性。

获取请求头信息

可以使用 ngx.req.get_headers() 方法来获取请求头信息:

local headers = ngx.req.get_headers()
ngx.say("user-agent: ", headers["User-Agent"])

条件语句的使用:

location /swagger/{
       set $isproxy 0;
       set_by_lua $isproxy ' 
                return 0
       ';
            
       if ($isproxy = 1)
       {
               return 403;
           proxy_pass http://127.0.0.1:8023;
       }
           
        if ($isproxy = 0)
        {
            content_by_lua_block {
                ngx.say("hello")
             }
        }
           
}

限流的使用:

lua_code_cache on;    
lua_shared_dict my_limit_count_store 10M;
   
server
{
    listen 8024;
    index index.html index.htm default.htm default.html;
    location /limit/conn {
        access_by_lua_block {
                ngx.header["Content-Type"] = "text/json"
                local limit_count = require "resty.limit.count"
                local cjson = require "cjson"
                -- 1秒内只能有20个请求
                local lim, err = limit_count.new("my_limit_count_store", 20, 1)
                if not lim then
                    ngx.say(cjson.encode({code=-1}))
                    return
                end
                local key = ngx.var.uri
                local delay, err = lim:incoming(key, true)
                if not delay then
                    if err == "rejected" then
                        ngx.say(cjson.encode({code=-1}))
                        return
                    end
                    ngx.log(ngx.ERR, "failed to limit req: ", err)
                    return ngx.exit(500)
                end
               
                ngx.say(key)
        }
    }
   
}


网友讨论