如何获取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("Hello world~不粗")';
        }
        #第二种
         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("

hello, lua4


") ngx.say("

hello, lua4


") ngx.say("

hello, lua4


") } } }

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

lua.conf文件

如何获取nginx服务器http请求头或参数?用lua呀_第1张图片顶顶顶

3.写脚本

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

#新建目录
mkdir /usr/local/openresty/nginx/conf/lua
#进入目录
cd /usr/local/openresty/nginx/conf/lua
#新建文件
vim 001.lua
#按键 i 插入模式写代码
ngx.say("

say hello

") #依次按 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,","),"
") else ngx.say(k,":",v,"
") end end #获取请求头里的参数 local headers = ngx.req.get_headers() 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 if type(v)=="table" then ngx.say(k,":",table.concat(v,","),"
") else ngx.say(k,":",v,"
") end end #获取body里的参数 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 if type(v) == "table" then ngx.say(k, " : ", table.concat(v, ", "), "
") else ngx.say(k, ": ", v, "
") end 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(), "
")

你可能感兴趣的:(Linux,nginx,lua,服务器)