本文适用于需要在nginx里获取http请求头信息或者传递的参数进行一些计算和处理的情况,笔者也是个新手,如有不当之处还望留言指教
目录
1.安装openresty
安装
服务命令
2.配置nginx.conf
3.写脚本
这里我选择把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
命令行工具 opm
在 openresty-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
可以查看到错误日志
#到根目录
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文件
新建一个目录,创建的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(), "
")