openresty简单使用
下载地址 http://openresty.org/cn/download.html
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 等都进行一致的高性能响应。
参考 组件 可以知道 OpenResty® 中包含了多少软件
参考 上路 学习如何从最简单的 hello world 开始使用 OpenResty® 开发 HTTP 业务,或前往 下载 直接获取 OpenResty® 的源代码包开始体验。
官网的介绍,可以发现OpenResty是nginx为基础,从目录也可以看到nginx的痕迹.
本文介绍如何使用lua脚本,对http路径做分发
lua脚本需要几个文件从下面路径下载
https://github.com/ledgetech/lua-resty-http
赋值http.lua http_connect.lua http_headers.lua 三个文件赋值到
openresty-1.19.9.1-win64\openresty-1.19.9.1-win64\lualib\resty
首先是nginx.conf 主要查看 include lua.conf;这个脚本
http {
include mime.types;
default_type application/octet-stream;
#引入lua.conf脚本
include lua.conf;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 8089;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
lua.conf; 这里也引入了lua脚本,这里的路径要使用据对路径,相对路径找不到
server {
listen 8300;
location /product {
default_type 'text/html;charset=UTF-8';
lua_code_cache on;
content_by_lua_file C:/Users/Administrator/Desktop/openresty-1.19.9.1-win64/openresty-1.19.9.1-win64/distribution.lua;
}
}
distribution.lua脚本
--获取请求路径的参数
local uri_args = ngx.req.get_uri_args()
--获取productId
local productId = uri_args["productId"]
--定义不同的服务器
local host = {"127.0.0.1:9092","127.0.0.1:9093"}
--hash值
local hash = ngx.crc32_long(productId)
hash = (hash % 2) + 1
backend = "http://"..host[hash]
local method = uri_args["method"]
local requestBody = "/"..method.."?productId="..productId
--获取http
local http = require("resty.http")
--httpc是http请求
local httpc = http.new()
--获取返回值,和错误信息固定格式
local resp, err = httpc:request_uri(backend, {
method = "GET",
path = requestBody,
keepalive=false
})
--如果请求结果有错误,返回错误信息
if not resp then
ngx.say("request error :", err)
return
end
--如果没有错误,把返回值,返回给前台
ngx.say(resp.body)
--关闭http
httpc:close()
http://127.0.0.1:8300/product?productId=5&method=hello
productId改变参数,发现请求不同的服务器