openresty安装

nginx使用多进程,每个进程单个线程模式,充分利用cpu。复用使用的是epoll sendfile非阻塞IO,因此即使单进程单线程时依然能处理多路复用。

worker_processes  1; #代表开启一个进程。
worker_connections  1024; #每个worker_processes能接受的最大连接数
default_type  application/octet-stream; #二进制类型,会把默认返回的数据当成文件下载
default_type  text/html; #当成文本返回
sendfile        on; ##实现0拷贝
keepalive_timeout  65; #链接的超时时间
rewrite ^/(.*) /$1/api permanent # ^表示以什么开头, (.*)表示所有的符号,$1变量表示第一个匹配组的符号,也就是(.*)的内容;这是一个重写URL,或者称为api重定向,把它转发到/$1/api这个路由上。permanent或者redirect表示在浏览器端输入地址框也帮用户改变api地址。
#一个http进来要执行11个阶段,这个在官网有详细介绍,其中三个顺序是:rewrite->access->content,最后两个表示鉴权访问和返回内容
location /echo_example { #按照在一个location中的访问顺序,先访问rewrite,就会被跳转,下面两个不会被执行。
#在location中,会按访问顺序而不是代码顺序执行这三年个步骤。
		rewrite ^/(.*) /$1/api permanent
		deny all; #不允许所有用户访问 allow和deny后面可以接ip地址和网段 deny 192.168.0.0/24
        echo "Hello, ngx_http_echo!"; #content阶段
}
location /echo_example {
		#proxy_pass 也是处于context阶段的
        proxy_pass https://www.baidu.com; #此时会转发到https://www.baidu.com/echo_example,想要除去echo_example,需要这么写
        #proxy_pass https://www.baidu.com/;#在最后加上/;此时若是location /echo_example/aaa,则会转发到https://www.baidu.com/aaa /会把第一个前缀除去,但不会除去后面的前缀
}

日志调试方法:
此时不仅print的打印会出现在日志里,如果代码编写错误,运行nginx服务时,也会定位到确定的文件和函数,具体到行数,来报出错误地方。在如下路径查看
tail -f /usr/local/openresty/nginx/logs/sher-error.log

在nginx.conf中编辑
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      'req_body:"$request_body"';
    access_log     logs/sher-access.log  main;
    error_log logs/sher-error.log;.lua代码中打印
local var = "some value"
        print("VVariable value: ", var)

以上参考:sunwu51(含墙)bilibili-free-coder
Lua Ngx API和Directives官网:https://openresty-reference.readthedocs.io/en/latest/

openresty官网:http://openresty.org/cn/
openresty官方安装文档:http://openresty.org/cn/installation.html
github地址:https://github.com/openresty

安装前准备,必须安装perl、libpcre、libssl库。
可以用如下命令查看安装情况

sudo ldconfig -v
 sudo apt install libpcre3-dev libssl-dev perl make build-essential curl libreadline-dev libncurses5-dev

到官网下载源码openresty-1.25.3.1后:

 ./configure
sudo make && make install
cd /usr/local/openresty

默认会被安装到/usr/local/openresty目录下
启动Nginx

sudo /usr/local/openresty/nginx/sbin/nginx
ps -ef | grep nginx

查看版本:

/usr/local/openresty/nginx/sbin/nginx -v

编写第一个hellow
OpenResty 是一个基于 NGINX 的全功能 Web 平台,集成了大量的第三方模块和库,其中最重要的是 ngx_lua 模块,它允许在 NGINX 配置中嵌入 Lua 脚本,实现高级的请求处理逻辑、动态内容生成、访问控制等功能。下面是一个简单的OpenResty 示例:

sudo vim /usr/local/openresty/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  localhost;
        location /test {
                default_type 'text/plain'; #加这一句使得可以显示在网页上,如果只有下面代码,那么浏览器访问只会下载文件爱包含这句话。
                content_by_lua_block {
                                        ngx.say("Hello sherlock!, LuaJIT!")
                                     }
                        }
        #charset koi8-r;
        #...伪代码
}

sudo /usr/local/openresty/nginx/sbin/nginx -t //检查以上配置文件的语法
sudo /usr/local/openresty/nginx/sbin/nginx -s reload //加载配置文件, 这里不是重启

访问:

curl -v http://127.0.0.1/test

返回:

Hello sherlock!, LuaJIT!

网页访问:http://127.0.0.1:80/test
显示:

Hello sherlock!, LuaJIT!

以上配置了一个监听 80 端口的 server 块,处理 example.com 的请求。
当访问路径 /test 时,通过 content_by_lua_block 指令执行 Lua 代码,输出 “Hello sherlock!, LuaJIT!”。

这只是一个最简单的演示,OpenResty 的强大之处在于它允许在 NGINX 配置中使用 Lua 脚本,从而实现更复杂的逻辑。以下是一个稍复杂的示例,演示了如何通过 OpenResty 实现简单的 API 访问控制:

http {
    lua_shared_dict my_limit 10m;

    server {
        listen 80;
        server_name api.example.com;

        location /api {
            access_by_lua_block {
                local limit = ngx.shared.my_limit
                local key = ngx.var.remote_addr
                local reqs, err = limit:get(key)
                if reqs then
                    if reqs > 10 then
                        ngx.exit(ngx.HTTP_TOO_MANY_REQUESTS)
                    else
                        limit:incr(key, 1)
                    end
                else
                    limit:set(key, 1, 60)
                end
            }

            default_type 'application/json';
            content_by_lua_block {
                ngx.say('{"message": "API response"}')
            }
        }
    }
}

在这个示例中:

配置了一个共享内存字典 my_limit 用于存储请求计数。
当访问路径 /api 时,通过 access_by_lua_block 指令执行 Lua 代码,实现了一个简单的请求频率限制,每个 IP 地址在 60 秒内最多允许 10 次请求。
如果超过请求限制,将返回 HTTP 429 (TOO MANY REQUESTS) 状态码;否则,继续执行后续 Lua 代码返回 JSON 响应。

这只是 OpenResty 的一小部分功能展示,实际使用中可以结合更多的模块和功能,如 ngx_http_lua_upstream、ngx_http_headers_more、ngx_stream_lua 等,以实现更复杂的 Web 应用和服务。
更多示例,参考:
OpenResty 介绍与实战讲解(nginx&lua)

([0-9a-zA-Z\.:]*)/(.+)
([0-9a-zA-Z\.:]*)第一组匹配,0-9a-zA-Z,":"以及".""*"表示符合以上规则的0个字符及以上的
(.+)其中的"."表示任意单个字符,"+"表示一个及以上的符合上一个规则的字符,其实就是不少于单个字符的任意字符
(.*)跟上面的区别是可以是0个字符,也就是可以匹配空格

http://192.168.35.124:8083/serviceProxy/bondingserver/device/webrtc?serialNumber=2023110200011&ip=192.168.35.124
来匹配
location ~* ^/serviceProxy/([0-9a-zA-Z\.:]*)/(.+)
它首选会把连接分为路径:/serviceProxy/bondingserver/device/webrtc
参数:serialNumber=2023110200011&ip=192.168.35.124
其中$1值为bondingserver,$2为device/webrtc,$args为serialNumber=2023110200011&ip=192.168.35.124
        location ~* ^/serviceProxy/([0-9a-zA-Z\.:]*)/(.+) {
            access_by_lua_file /usr/src/web/api/access.lua;
            resolver 8.8.8.8;
            set $proxy_upstream '';
            set $path_info $2;
            proxy_pass http://$proxy_upstream/$2?$args;

          log_by_lua_block
        {

                ngx.log(ngx.ERR, "####################################proxy_pass URL: " .. "http://" .. ngx.var.proxy_upstream .. "/" .. ngx.var.path_info .. "?" .. ngx.var.args)
        }
	 }

tail -f /usr/local/openresty/nginx/logs/error.log
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、、、、南山小雨、、、、

分享对你有帮助,打赏一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值