欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

安装OpenResty,实现分发层、应用层nginx+lua开发(附加问题:bad argument #2 to ‘set_keepalive‘ (number expected, got nil)

发布时间:2025/3/19 编程问答 80 豆豆
生活随笔 收集整理的这篇文章主要介绍了 安装OpenResty,实现分发层、应用层nginx+lua开发(附加问题:bad argument #2 to ‘set_keepalive‘ (number expected, got nil) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1. 安装OpenResty

1.1 在 /usr 目录下创建servers目录,并进入该目录执行 yum install -y readline-devel pcre-devel openssl-devel gcc 指令安装第三方库。

1.2 使用 wget http://openresty.org/download/ngx_openresty-1.7.7.2.tar.gz 指令下载Nginx并解压

1.3 进入 ngx_openresty-1.7.7.2/bundle/LuaJIT-2.1-20150120/ 目录使用 make clean && make && make install 安装lua,安装后使用 ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit 指令将luajit指令进行软链接。

1.4 返回bundle目录,下载其它两个依赖并解压,指令如下。

cd /usr/servers/ngx_openresty-1.7.7.2/bundle wget http://github.com/FRICKLE/ngx_cache_purge/archive/2.3.tar.gz tar -zxvf 2.3.tar.gzwget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz tar -zxvf v0.3.0.tar.gz

注:当解压v0.3.0.tar.gz压缩包时,最后解压到test目录时会报错,这个错误可不用管,如下图。

1.5 返回nginx主目录 /usr/servers/ngx_openresty-1.7.7.2,执行 ./configure --prefix=/usr/servers --with-http_realip_module --with-pcre --with-luajit --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/ -j2

1.6 然后执行 make && make install 指令进行安装

1.7 最后返回到 /usr/servers 目录执行 nginx/sbin/nginx -V 查看版本,结果如下。

1.8 在 /usr/servers 目录执行 nginx/sbin/nginx 指令就启动了nginx

2. nginx配置

2.1 使用 vi /usr/servers/nginx/conf/lua.conf 指令编辑lua.conf文件,添加如下内容。

server {listen 80;server_name _;location /lua {default_type 'text/html';content_by_lua 'ngx.say("hello lhj")';} }

2.2 使用 vi /usr/servers/nginx/conf/nginx.conf 指令编辑nginx.conf文件,在http部分添加如下三行内容。

lua_package_path "/usr/servers/lualib/?.lua;;"; lua_package_cpath "/usr/servers/lualib/?.so;;"; include lua.conf;

2.3 可使用 nginx/sbin/nginx -t 指令验证是否配置正确,正确结果如下。

2.4 重新启动nginx指令是 /usr/servers/nginx/sbin/nginx -s reload ,启动后浏览器输入IP/lua即可得到输出内容,如下图。

2.5 lua脚本支持内嵌,我们可以在lua.conf中的localtion /lua{}代码块中,使用content_by_lua_file 指令指向某个lua文件,然后相关内容写在那个lua文件即可,如下图。

2.6 查看异常日志指令

tail -f /usr/servers/nginx/logs/error.log

3 分发层nginx的配置

3.1 分发层nginx需要发送http请求给应用层nginx,所以需要安装http相关的依赖,去GitHub这个页面下载依赖,如下图所示。

下载后,把依赖放在 /usr/servers/lualib/resty 目录下,如下所示。

3.2 在分发层nginx中的lua脚本存放目录 /usr/servers/nginx/conf/lua/ 新建一个lua脚本,命名为dis.lua,添加以下代码,实现简单的分发逻辑。

local uri_args = ngx.req.get_uri_args(); local productId = uri_args["productId"];local hosts = {"192.168.56.101", "192.168.56.102"}; local hash = ngx.crc32_long(productId); local index = (hash % 2) + 1; backend = "http://"..hosts[index];local requestPath = uri_args["requestPath"]; requestPath = "/"..requestPath.."?productId="..productIdlocal http = require("resty.http"); local httpc = http.new();local resp, err = httpc:request_uri(backend,{method = "GET",path = requestPath,keepalive = false # 不加这一个参数,会报错bad argument #2 to # 'set_keepalive' (number expected, got nil) })if not resp thenngx.say("request err: ", err);return; endngx.say(resp.body) httpc:close();

并在 /usr/servers/nginx/conf/lua.conf 引入该dis.lua文件。

3.3 效果验证,我们在应用层nginx1和nginx2分别写上不同的输出语句,然后通过nginx分发层传入不同的productId哈希后进行分发,效果如下。

4. Nginx的介绍及优点

4.1 Nginx:一款轻量级的Web服务器;①在高并发响应中性能较好,因为是epoll模型,而Apache采用select模型;②反向代理性能强,可实现负载均衡;③内存和CPU占用率。

4.2 负载均衡:在lua.conf中配置upstream代码段,目前upstream支持的分配算法:①轮询(默认方式):每个请求按时间顺序逐一分配到应用服务器;②权重:通过权重,使轮询几率和访问比率成正比;③ip_哈希算法:对每个请求按照访问ip进行hash,可解决session问题(其它解决session方案:a. 在多台服务器上复制;b. 第三方缓存;c. cookie记录session)。

 4.3 内存和CPU占用率低:采取分阶段资源分配技术,处理静态文件和无缓存的反向代理加速。

 

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是生活随笔为你收集整理的安装OpenResty,实现分发层、应用层nginx+lua开发(附加问题:bad argument #2 to ‘set_keepalive‘ (number expected, got nil)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。