如何获取nginx服务器http请求头或参数?用lua呀

本文适用于需要在nginx里获取http请求头信息或者传递的参数进行一些计算和处理的情况,笔者也是个新手,如有不当之处还望留言指教

目录

1.安装openresty

安装

服务命令

2.配置nginx.conf

3.写脚本


1.安装openresty

        这里我选择把nginx.conf文件备份一个,然后把nginx卸载了,安装openresty,openresty是一个国人开发的很成熟的开源产品,他把nginx和luajit以及很多lua的好用的脚本整合到了一起,安装后可用性很高,你如果自己安装nginx再集成一个luajit的话很多功能都要自己去找一些lua的包扩展才能用,当然,你也可以不用去卸载nginx,用 systemctl stop nginx 给停止了。因为后面启动openresty会启动一个nginx要使用80端口,如果不停止的话或报错80端口被占用

安装

下面的教程来至www.openresty.org官方教程

你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum check-update 命令)。 运行下面的命令就可以添加我们的仓库(对于 CentOS 8 或以上版本,应将下面的 yum 都替换成 dnf):

# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/
​
# update the yum index:
sudo yum check-update

然后就可以像下面这样安装软件包,比如 openresty

sudo yum install -y openresty

如果你想安装命令行工具 resty,那么可以像下面这样安装 openresty-resty 包:

sudo yum install -y openresty-resty

命令行工具 opmopenresty-opm 包里,而 restydoc 工具在 openresty-doc 包里头。

列出所有 openresty 仓库里头的软件包:

sudo yum --disablerepo="*" --enablerepo="openresty" list available

参考 OpenResty RPM 包页面获取这些包更多的细节。

对于 CentOS 8 及更新版本,我们只需要将上面的 yum 命令都替换成 dnf 即可。

服务命令

启动

systemctl start openresty.service

停止

systemctl stop openresty.service

重新加载配置文件

systemctl reload openresty.service

启动时可能会报错

systemctl status openresty.service

可以查看到错误日志

2.配置nginx.conf

#到根目录
cd /
#找到nginx的目录
find | grep nginx
#进入nginx目录
cd /usr/local/openresty/nginx/conf/
#修改nginx.conf文件,用vim把你之前备份的nginx.conf文件的内容写进去,或者直接替换掉
vim nginx.conf

写lua代码

 server {
        listen       80;
        server_name  www.zhangdragon.top zhangdragon.top;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #第一种写lua代码的方式
        location /lua1 {
            #设置mime
            default_type text/html;
            #content_by_lua是一个关键字,后面接lua代码,要用两个单引号把lua代码包起来
            #'ngx.say()'是调用ngx的say()方法,用来打印输出,可以写html标签
            content_by_lua 'ngx.say("<b>Hello world~</b>不粗")';
        }
        #第二种
         location /lua2 {
            default_type text/html;
            #content_by_lua_file是读取lua文件的关键字,nginx的家目录是/usr/local/openresty/nginx, 我的001.lua文件时放在/usr/local/openresty/nginx/conf/lua/目录下的,所以相对路径是conf/lua/001.lua
            #001.lua文件下面会有
            content_by_lua_file conf/lua/001.lua;
        }
        #第三种
         location /lua3 {
            access_log logs/lua3.access.log main;
            default_type text/html;
            #引入一个lua.conf文件,这个文件里面写 content_by_lua_file conf/lua/001.lua;
            #就是第二种的那一条命令,这样做是应为你可能会引入多个.lua文件,把他们写入一个文件
            #这里的路径nginx是从/usr/local/openresty/nginx/conf/开始的,所以我这个lua.conf
            #文件是写在/usr/local/openresty/nginx/conf下的
            include lua.conf;
        }
        #第四种,写代码块
        location /lua4 {
            default_type text/html;
            content_by_lua_block {
                ngx.say("<h1>hello, lua4</h1><br/>")
                ngx.say("<h1>hello, lua4</h1><br/>")
                ngx.say("<h1>hello, lua4</h1><br/>")
            }
        }
}

记住,每次修改完nginx.conf后一定要systemctl reload openresty,不然修改不生效!!!

lua.conf文件

顶顶顶

3.写脚本

新建一个目录,创建的lua文件放在里面

#新建目录
mkdir /usr/local/openresty/nginx/conf/lua
#进入目录
cd /usr/local/openresty/nginx/conf/lua
#新建文件
vim 001.lua
#按键 i 插入模式写代码
ngx.say("<h1>say hello</h1>")
#依次按 esc  :  x 三个键然后回车保存 

下面是一些简单的lua语言的代码

#打印出uri上的a参数的值
ngx.say(ngx.var.arg_a)

#打印出uri的所有参数
定义一个变量get_args,将ngx.req.get_uri_args()这个方法获取到的值赋给他
local get_args = ngx.req.get_uri_args()
#循环,k是参数名,v是值
for k,v in pairs(get_args) do
    #如果v是一个table(就是比如参数是一个list--->arg:18,19这种)
    if type(v)== "table" then
        #用concat()这个方法,把他的值遍历后连接成一个字符串
        ngx.say(k ,":", table.concat(v,","),"<br/>")
    else
        ngx.say(k,":",v,"<br/>")
    end
end

#获取请求头里的参数
local headers = ngx.req.get_headers()

ngx.say("Host : ",headers["Host"],"<br/>")
ngx.say("user-agent : ",headers["user-agent"],"<br/>")
ngx.say("user-agent : ",headers.user_agent,"<br/>")
for k,v in pairs(headers) do
    if type(v)=="table" then
        ngx.say(k,":",table.concat(v,","),"<br/>")
    else
        ngx.say(k,":",v,"<br/>")
    end
end

#获取body里的参数
ngx.req.read_body()  

ngx.say("post args begin", "<br/>")  

local post_args = ngx.req.get_post_args()  

for k, v in pairs(post_args) do  

    if type(v) == "table" then  

        ngx.say(k, " : ", table.concat(v, ", "), "<br/>")  

    else  

        ngx.say(k, ": ", v, "<br/>")  

    end  
end

#http协议版本
ngx.say("ngx.req.http_version : ", ngx.req.http_version(), "<br/>")

#请求方法
ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "<br/>") 
 
#原始的请求头内容  
ngx.say("ngx.req.raw_header : ",  ngx.req.raw_header(), "<br/>")  

#body内容体  
ngx.say("ngx.req.get_body_data() : ", ngx.req.get_body_data(), "<br/>")

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值