Openresty 入门
以下实践均在Centos下完成
安装
1.编辑配置文件
配置文件内容如下
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 4996;
location / {
default_type text/html;
content_by_lua_block {
ngx.say("I am here")
}
}
}
}
2.加入环境变量
我这里是source ~/.zshrc
,依照自己的shell的配置文件即可
3.让我们使用http_load
来压测一下看看
wget -c http://soft.kwx.gd/tools/http_load-12mar2006.tar.gz
tar -xz http_load-12mar2006.tar.gz
cd http_load-12mar2006
make
echo http://127.0.0.1:4996 > url
./http_load -p 20 -s 5 url
示例一: Openresty Log Response
让我们看一下conf/logresponse.conf
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
log_format log_req_resp '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time req_body:"$request_body" resp_body:"$resp_body"';
server {
listen 4996;
access_log logs/access.log log_req_resp;
lua_need_request_body on;
set $resp_body "";
body_filter_by_lua '
local resp_body = string.sub(ngx.arg[1], 1, 1000)
ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
if ngx.arg[2] then
ngx.var.resp_body = ngx.ctx.buffered
end
';
location / {
echo "I am here!! Log ME Now";
}
}
}
示例二: Openresty with redis
user root root;
worker_processes 2;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 4996;
location /by_lua_file {
default_type text/html;
content_by_lua_file conf/lua/iamhere.lua;
}
location /with_redis {
content_by_lua_file conf/lua/redis.lua;
}
}
}
其他应用还可以,创建灰度发布环境,以及动态路由。
示例三: Openresty with lua-aho-corasick
首先安装依赖yum install lua-devel
, 然后git clone https://github.com/cloudflare/lua-aho-corasick && make && make install
安装之后,进行文件配置,同时在lua脚本之中编写逻辑即可。
user root root;
worker_processes 2;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 4996;
location /with_aho {
content_by_lua_file conf/lua/aho_corasick.lua;
}
}
}
当然你可以配合redis存储一些规则,并用aho-corasick算法进行匹配。 Done
local ac = require "ahocorasick"
local dict = {"string1", "string", "etc"}
local acinst = ac.create(dict)
local r = ac.match(acinst, "etc")
ngx.say("match result: ", r)
告诉我看到这,你明白了Openresty还可以做什么吗?
遇到的问题排查
除了content_by_lua_file
还有以下这些:
location /lua {
rewrite_by_lua_file /path/to/rewrite.lua;
access_by_lua_file /path/to/access.lua;
content_by_lua_file /path/to/content.lua;
}
- 文件权限问题
- 755
- user root root; (不是一个好的选择,应该采用自己的组,而不是采用root的组)
- 路径补全问题
- 及时查看error的log,然后判断路径是不是正确。