Openresty一 | 初探
概述
OpenResty®是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty®通过汇聚各种设计精良的Nginx模块(主要由 OpenResty 团队自主开发),从而将Nginx有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动Nginx支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
OpenResty®的目标是让你的Web服务直接跑在Nginx服务内部,充分利用Nginx的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
我的目的
项目中有个用到http请求,我用shell脚本+curl简单实现了一下.但是我想用一个我不熟悉的语言来做该功能, 在网上搜索到可以通过lua来实现我的需求… 于是我找到了OpenResty框架 . lua发送http请求一般有两种方式, 使用 socket.http 或者 resty.http
环境&安装 OpenResty
参考:https://openresty.org/cn/linux-packages.html
环境:Ubuntu
安装
$ sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates
$ echo "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/openresty.list
$ sudo apt-get update
$ sudo apt-get -y install openresty
设置环境变量
$ sudo vim ~/.bashrc
/usr/local/openresty/nginx/sbin/
$ source ~/.bashrc
开始第一个程序
创建项目目录
mkdir ~/openrestry
cd ~/openrestry
mkdir logs/ conf/
写配置文件
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 8080;
location / {
default_type text/html;
content_by_lua_block {
ngx.say("<p>hello, world</p>")
}
}
}
}
启动
nginx -p `pwd`/ -c conf/nginx.conf
验证是否成功
curl http://localhost:8080/
返回结果<p>hello, world </p>
OpenResty使用lua脚本写http 请求
lua脚本可以写在 conf/nginx.conf 配置文件的 localtion 中.也可以写在单独的 lua 脚本文件中.需加上配置参数 content_by_lua_file
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 8080;
location / {
default_type text/html;
content_by_lua_file hello.lua;
}
}
}
Get请求
hello.lua脚本
//hello.lua
local http = require('resty.http')
local httpc = http.new()
local res, err = httpc:request_uri('http://localhost/hello', {
keepalive_timeout = 2000 -- 毫秒
})
if not res or res.status then
ngx.log(ngx.ERR, "request error#", err)
return
end
ngx.log(ngx.ERR, "request status#", res.status)
ngx.say(res.body)
Post请求
hello.lua脚本
//hello.lua
local http = require "resty.http"
local httpc = http.new()
local res, err = httpc:request_uri("http://localhost/hello", {
method = "POST",
body = "a=1&b=2",
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
},
keepalive_timeout = 60,
keepalive_pool = 10
})
if not res or res.status then
ngx.log(ngx.ERR, "request error#", err)
return
end
ngx.log(ngx.ERR, "request status#", res.status)
ngx.say(res.body)
重启nginx
nginx -p `pwd`/ -s reload
验证
curl http://localhost:8080
常用方法
创建HTTP
请求对象,失败返回nil
和错误信息。
httpc = http.new()
发送请求,填入请求链接和参数。
res, err = httpc:request_uri(uri, params)
设置请求超时时间,单位:毫秒。
httpc:set_timeout(time)
遇到的问题
OpenResty返回中文乱码问题
描述
接口中使用ngx.say(json.encode)
编码json
字符串,返回中文乱码。
{"msg":"请求æˆåŠŸ","code":0}`
解决
设置Content-Type
时加上charset=utf8
。
server {
listen 8080;
server_name localhost;
default_type text/html;
charset utf-8;
...
}
也可以在header_filter
阶段赋值header
。
ngx.header.content_type="application/json;charset=utf8"
--完--
- 原文作者: 留白
- 原文链接: https://zfunnily.github.io/2020/11/OpenResty%E5%88%9D%E6%8E%A2/
- 更新时间:2024-04-16 01:01:05
- 本文声明:转载请标记原文作者及链接