首页 > 系统相关 >Nginx与LUA(5)

Nginx与LUA(5)

时间:2023-01-19 13:55:54浏览次数:38  
标签:openresty lua local LUA Nginx usr nginx ngx

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~

 


 

 

Nginx诞生以来就获赞无数,反向代理、负载均衡、流量限制与流量扩展都是它的拿手好戏。基本上是互联网应用的主流入口,和计算、即时通讯、存储一样,是一种基础且通用的组件,而且对性能和稳定性有很高的要求。

对业务来讲,Nginx又是业务直接和外部交流的接入点,对二次开发和动态变化又有着强烈的以及一些定制化的需求,因此出现了LUA这种嵌入式的脚本语言,它能揉和以及处理各种不同的Nginx上游输出(proxy、log等)。这就像Java的成功依赖于丰富的生态应用一样,OpenResty就是建立在Nginx + LUA之上的一种「生态」:一个基于Nginx与Lua的高性能Web平台,其内部集成了大量的Lua库、第三方模块以及大多数的依赖项。

通过揉和、拼接众多设计良好的Nginx模块,OpenResty有效地把Nginx转变成一个强大的Web应用服务器,它可以随心所欲地做复杂的访问控制、业务处理和安全检测。

基于OpenResty,开发人员可以使用Lua脚本语言对Nginx核心以及现有的各种Nginx模块进行脚本编程,构建出可以处理一万以上并发请求的超高性能的Web应用,可以随意操控、分发、复制、限制、缓存响应头、Cookie及外部存储中的数据信息。有了OpenResty,Nginx不再是一个简单的HTTP服务器,而是可以扩展成为全功能的Web应用服务器了。

安装也很简单,以CentOS为例:

yum install -y readline-devel pcre-devel openssl-devel gcc

cd ~

wget https://openresty.org/download/openresty-1.17.8.2.tar.gz

tar -xvzf openresty-1.17.8.2.tar.gz

cd openresty-1.17.8.2

./configure

gmake && gmake install

先停止之前的nginx服务:

/usr/local/nginx/sbin/nginx -s stop

将默认启动的原生nginx改为openresty:

vi /etc/rc.local

将/usr/local/nginx/sbin/nginx改为/usr/local/openresty/nginx/sbin/nginx:

启动OpenResty:

/usr/local/nginx/sbin/nginx -p /usr/local/openresty/nginx/

访问页面:http://服务器IP/

如果成功,就会出现欢迎页面:

 

 

如果不加-p /usr/local/openresty/nginx/参数,是无法启动和停止OpenResty的

/usr/local/nginx/sbin/nginx -p /usr/local/openresty/nginx/

/usr/local/nginx/sbin/nginx -s stop -p /usr/local/openresty/nginx/

访问http://服务器IP/正常

访问http://服务器IP/test?username=test1出现404错误

这是因为此时的配置文件启用的是openresty中的配置文件,所以需要修改一下配置:

拷贝/usr/local/nginx/conf/nginx.conf中的内容到/usr/local/openresty/nginx/conf/nginx.conf

打开端口日志

tail -f /home/work/logs/nginx/8080.log

tail -f /home/work/logs/nginx/9090.log

访问http://服务器IP/test?username=test1

发现之前的流量复制功能也能正常工作,说明OpenResty配置完全正常。

也可以直接使用openresty自带的nginx启动(后续服务都以这种方式启动)

启动:/usr/local/openresty/nginx/sbin/nginx

重启:/usr/local/openresty/nginx/sbin/nginx -s reload

停止:/usr/local/openresty/nginx/sbin/nginx -s stop

编辑lua配置文件,先停止单一的nginx服务:

/usr/local/nginx/sbin/nginx -s stop -p /usr/local/openresty/nginx/

编辑nginx.conf文件:

vi /usr/local/openresty/nginx/conf/nginx.conf

在http部分添加配置:

lua_package_path "/usr/local/openresty/lualib/?.lua;;"; #lua 模块

lua_package_cpath "/usr/local/openresty/lualib/?.so;;"; #c 模块

用openresty启动:

/usr/local/openresty/nginx/sbin/nginx

在/usr/local/openresty/nginx/conf目录下创建一个lua.conf:

echo > /usr/local/openresty/nginx/conf/lua.conf

编辑lua.conf文件:

vi /usr/local/openresty/nginx/conf/lua.conf

给lua.conf增加内容:

server {

    listen 80;

    server_name _;

}

在nginx.conf的http中包含lua.conf

 

 

重启openresty并测试是否正常:

/usr/local/openresty/nginx/sbin/nginx -s reload

/usr/local/openresty/nginx/sbin/nginx -t

 

测试用lua打印出「hello world」,就要先在lua.conf中server部分添加配置:

location /lua {

    default_type 'text/html';

    content_by_lua 'ngx.say("hello world")';

}

 

 

测试配置是否正确:

/usr/local/openresty/nginx/sbin/nginx -t

重启服务:

/usr/local/openresty/nginx/sbin/nginx -s reload

访问地址就可以看到打印出来的内容:

http://服务器IP/lua

 

把lua代码放在nginx中,会随着代码的变更导致维护困难,因此应该把lua代码移到外部文件中存储:nginx.conf ⊂ lua.conf ⊂ code.lua(⊂是数学符号中的「包含」的意思,这个的意思是让nginx配置文件包含lua配置文件,让lua配置文件再引用实际的lua代码脚本)。

创建保存lua代码的目录:

mkdir /usr/local/openresty/nginx/conf/lua

增加lua代码文件:

vi /usr/local/openresty/nginx/conf/lua/helloworld.lua

增加一行(最外层没有单引号''):

ngx.say("hello world lua")

修改lua.conf:

content_by_lua_file conf/lua/helloworld.lua; # conf是相对于nginx安装目录而言

lua_code_cache off; # 关闭缓存(便于开发调试,线上生产环境一般都需要打开)

关闭缓存重启后收看到报警:

nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/local/openresty/nginx/conf/lua.conf:7

重启服务:

/usr/local/openresty/nginx/sbin/nginx -s reload

再次访问同样能看到结果:

http://服务器IP/lua

lua可以做很多,包括但不限于:

1、HTTP请求都需要接收请求、处理并输出响应

2、请求包含请求参数、请求头、Body体等信息

3、服务器通过对请求的处理,输出客户端需要的内容

4、响应内容包含响应状态码、响应头和响应内容体

 

例如输出请求的lua脚本,可以这样写:

vi /usr/local/openresty/nginx/conf/lua.conf

server {

    listen       80;

    server_name  _;

 

    location /request {

        default_type 'text/html';

        lua_code_cache off;

        # 设置nginx变量

        set $a $host;

        # nginx内容处理

        content_by_lua_file conf/lua/request.lua;

        # 内容体处理完成后调用

        echo_after_body "ngx.var.a = $a";

    }

}

创建创建request.lua:

vi /usr/local/openresty/nginx/conf/lua/request.lua

-- 声明nginx变量

local var = ngx.var

ngx.say("ngx.var.a : ", var.a)

var.a = 2;

-- 处理请求头

local headers = ngx.req.get_headers()

ngx.say("=== headers begin ===")

ngx.say("Host : ", headers["Host"])

ngx.say("user-agent : ", headers["user-agent"])

ngx.say("user-agent : ", headers.user_agent)

for k, v in pairs(headers) do

  ngx.say(k, ": ", v)

end

ngx.say("=== headers end ===")

-- 处理get参数

ngx.say("=== get args begin ===")

local uri_args = ngx.req.get_uri_args()

for k, v in pairs(uri_args) do

  ngx.say(k, ": ", v)

end

ngx.say("=== get args end ===")

-- 处理post参数

ngx.req.read_body()

ngx.say("=== post args begin ===")

local post_args = ngx.req.get_post_args()

for k, v in pairs(post_args) do

  ngx.say(k, ": ", v)

end

ngx.say("=== post args end ===")

 

-- http协议版本

ngx.say("ngx.req.http_version:", ngx.req.http_version())

-- 请求方法

ngx.say("ngx.req.get_method:", ngx.req.get_method())

-- 未解析的请求头

ngx.say("ngx.req.raw_header:", ngx.req.raw_header())

-- 未解析的请求body

ngx.say("ngx.req.get_body_data:", ngx.req.get_body_data())

可以测试一下看看结果:

重启服务:

/usr/local/openresty/nginx/sbin/nginx -s reload

执行curl命令看看效果:

curl -XPOST 'http://服务器IP/request?a=1&b=2' -d 'c=3&d=4'

 

再比如输出响应的lua脚本,可以这样写:

vi /usr/local/openresty/nginx/conf/lua.conf

server {

    listen       80;

    server_name  _;

 

    location /request {

        default_type 'text/html';

        lua_code_cache off;

        # 设置nginx变量

        set $a $host;

        # nginx内容处理

        content_by_lua_file conf/lua/request.lua;

        # 内容体处理完成后调用

        echo_after_body "ngx.var.a = $a";

    }

 

    location /response {

        default_type "text/html";

        lua_code_cache off;

        content_by_lua_block {

            ngx.print("hello")

            ngx.flush()

            ngx.sleep(1)

            ngx.say("world")

            return ngx.exit(200)

        }

    }

}

重启服务:

/usr/local/openresty/nginx/sbin/nginx -s reload

执行curl命令:

curl 'http://服务器IP/response'

一些开发建议:

OpenResty由于集成了大量的lua库和第三方库,因此最好将这些依赖单独放到一次,便于管理,可以参考其他语言的开发习惯,将代码分项目、分层、分包管理。例如:

com.xiangwang.lua.mysql

com.xiangwang.lua.redis

com.xiangwang.lua.page

com.xiangwang.lua... ...

 

 


 

 

感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

标签:openresty,lua,local,LUA,Nginx,usr,nginx,ngx
From: https://www.cnblogs.com/xiangwang1111/p/17061378.html

相关文章

  • 【反向代理】超全Nginx原理+实战篇
    文章目录​​1.Nginx简介和安装部署​​​​1.1.什么是Nginx​​​​1.2.Nginx的用途​​​​1.3.正向代理服务器​​​​1.4.反向代理服务器​​​​1.5.nginx安装部署​​......
  • Linux环境下nginx给wordpress站点配置http更换成https访问
    一、nginx添加ssl模块首先确认下自己的nginx是否有ssl模块,如没有,需要补安全,可以参考这篇文章《Nginx安装SSL模块教程及注意事项》。二、nginx配置#这个server是为了ht......
  • Nginx安装SSL模块教程及注意事项
    一、引言有的时候我们的Linux服务器上之前安装的nginx已经发布了web项目,但之前并没有用到https访问,之后又有需求了,要配置一个SSL证书,那一开始我们编译的Nginx并没有SSL模......
  • Nginx linux 安装
    (一)、在线安装nginx依赖包yum-yinstallgcczlibzlib-develpcre-developensslopenssl-devel 以下为离线安装依赖包:1.离线安装gcca.从CentOS7的系统安装......
  • Nginx安装配置规范手册(完整版)
    1. 目的本流程旨在保证项目测试环境、生产环境web服务器所使用的nginx版本一致性、配置规范性、管理统一性。2. 适用范围Nginx服务器适用在公有云网络拓扑中的互联网区,......
  • 使用vector采集nginx日志,并输出为prometheus_exporter
    日志示例{"remote_addr":"10.43.144.171","@timestamp":"2023-01-17T17:27:14+08:00","request":"GET/v1/stat_des/?id=20230117170221HTTP/1.1","status":"200","size......
  • docker 安装 nginx 并配置反向代理
    1.安装nginxdocker镜像获取nginx官方镜像1.dockerpullnginx 查看镜像库2. dockerimages   使用nginx镜像来创建nginx容器实例 dockerrun......
  • nginx
    反向代理由服务提供方提供的访问模式、代理方式正向代理由服务调用方主动采取的访问模式、代理方式我们家里的路由器就相当于正向代理服务器(网关)隧道式代理-nginx......
  • Spring Cloud Alibaba Nacos+Nginx+Keepalived高可用集群注册中心搭建
    简介Nacos简介Nacos官网:https://nacos.ioNacos源码:https://github.com/alibaba/nacos下载Nacos服务端压缩包:https://github.com/alibaba/nacos/releasesNacos三种部署......
  • Nginx配置转发代理接口
    cd/etc/nginx/conf.d/vimtest.confupstreammy_server{server192.168.100.100:11105;keepalive2000;......