OpenResty 最佳实践学习–实战演习笔记(2)

在前面一篇中已经介绍了Openresty的相关知识和一个简单的hello world的访问。本篇依然是延续上一篇进行讲解。 需要提前申明的是我环境有问题。重新安装了一次openresty,这次安装的目录和上一次不一样了。一:环境说明:虚拟机 :CentOs 6.3 32位OpenResty 安装目录 : /opt/openresty/版本: /opt/openresty/nginx/sbi

大家好,又见面了,我是全栈君。

在前面一篇中已经介绍了Openresty的相关知识和一个简单的hello world的访问。本篇依然是延续上一篇进行讲解。
需要提前申明的是我环境有问题。重新安装了一次openresty,这次安装的目录和上一次不一样了。

一:环境说明:

虚拟机 :CentOs 6.3 32位
OpenResty 安装目录 : /opt/openresty/
版本: 
/opt/openresty/nginx/sbin/nginx -V
nginx version: openresty/1.11.2.5
built by gcc 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) 
built with OpenSSL 1.0.0-fips 29 Mar 2010
TLS SNI support enabled
configure arguments: --prefix=/opt/openresty/nginx 

二:实战演习

1、使用content_by_lua 和 content_by_lua_file

[dufy@localhost nginx]$ pwd
/opt/openresty/nginx
[dufy@localhost nginx]$ ls
client_body_temp  conf  fastcgi_temp  html  learn_lua  logs  proxy_temp  readme  sbin  scgi_temp  uwsgi_temp
[dufy@localhost nginx]$ 

# /opt/openresty/nginx 目录下文件简单介绍
#learn_lua :我新建的一个文件目录(linux中没有文件夹改变,一切皆文件),用来保存lua文件
#其他目录安装默认生成的,具体就不一一进行讲解,后面用到在说明

在测试之前启动openresty服务,和nginx相同,修改nginx.conf文件也要重启或者reload。

#启动命令
sudo /opt/openresty/nginx/sbin/nginx -c /opt/openresty/nginx/conf/nginx.conf -p /opt/openresty/nginx/
#重新加载命令
sudo /opt/openresty/nginx/sbin/nginx -c /opt/openresty/nginx/conf/nginx.conf -p /opt/openresty/nginx/ -s reload

#sudo :系统管理员让普通用户执行一些或者全部的root命令的一个工具

(1):测试1:content_by_lua

content_by_lua  :意思是内容中包含的是lua脚本

content_by_lua 这个在上一篇已经讲过了,这里在提一下,
conf 目录备份nginx.conf ,然后在server 中添加如下代码块:

#第一个lua 的 hello world
    location /hello{
       default_type text/html;
       content_by_lua '
            ngx.say("<h1>Hello Wolrd !!</h1>")
        ';
    }

测试脚本:

[dufy@localhost nginx]$ curl http://localhost:8080/hello
<h1>Hello Wolrd !!</h1>

(2)使用content_by_lua_file 引入一个lua文件

content_by_lua_file  :意思是内容中包含的是lua脚本文件

在 learn_lua 目录下面新建一个 hello.lua 文件,文件内容:

ngx.say("<h1>Hello Wrold !! Lua</h1>")

在 nginx.conf 的server中添加如下代码块:

#第一个 Nginx lua的 hw
    location /hello_lua{
       content_by_lua_file learn_lua/hello.lua;
    }

测试脚本:

[dufy@localhost nginx]$ curl http://localhost:8080/hello_lua
<h1>Hello Wrold !! Lua </h1>

(3):lua_code_cache使用

lua_code_cache : 调试的环境使用,方便快速的调试代码,不用重新启动服务!
默认 是on,关闭使用 off ,即lua_code_cache off
可以配置在http server location 块中!

开启这个功能,启动openresty的时候,控制台会提示如下信息:

nginx:  lua_code_cache is off; this will hurt performance in /opt/openresty/nginx/conf/nginx.conf:46

演示示例:修改nginx.conf 在server块中添加

lua_code_cache off

然后修改 hello.lua为下面的内容!

ngx.say("<h1>Hello Wrold !! Lua,I change </h1>")
ngx.say("THis is a settings lua_code_cache off")

不重启服务,然后访问地址,查看测试结果:

[dufy@localhost nginx]$ curl http://localhost:8080/hello_lua
<h1>Hello Wrold !! Lua,I change </h1>
THis is a settings lua_code_cache off


如果不加这个参数的话,修改了hello.lua文件内容,如果不重启服务,那么无法加载修改的内容,这里说的只是lua脚本文件。
记住如果修改了nginx.conf,还是要重新服务的。(可以自行验证)
原因是:使用的缓存数据。所以生产环境这个参数一定不要关闭,否则影响性能!

2、一个简单的Lua小例子

这个例子也是来自OpenResty 最佳实践学习 ,lua的语法这里暂时不做讲解,需要的可以自行了解。我后面也会整理lua语言的一些知识。

在 learn_lua的目录中新建 的 get_random_string.lua

-- 定义变量
local args = ngx.req.get_uri_args()
local salt = args.salt
--判断变量是否存在,不存在则返回错误码
if not salt then
    ngx.exit(ngx.HTTP_BAD_REQUEST)
end
-- 使用md5加密 ,其中 .. 表示 + 的意思
local string = ngx.md5(ngx.time() .. salt)
-- 输出结果: ngx.say() ;相关于java中的System.out.print();
ngx.say(string)
-- 下面这一句,dufy_test没有定义,会返回 nil
ngx.say(dufy_test)

ngx.req.get_headers:获取请求头,默认只获取前100,如果想要获取所以可以调用ngx.req.get_headers(0);获取带中划线的请求头时请使用如headers.user_agent这种方式;如果一个请求头有多个值,则返回的是table;

ngx.req.get_uri_args:获取url请求参数,其用法和get_headers类似;

在 nginx.conf 的server中添加的:

    #一个随机字符串的lua 脚本
    location  /get_random_string{
        content_by_lua_file learn_lua/get_random_string.lua;

    }

验证结果:

[dufy@localhost nginx]$ curl http://localhost:8080/get_random_string?salt=1
edeaff17db2e181d8589aa32bbdfcf6f
nil

# 通过 ngx.req.get_uri_args() 获取 salt=1 ,后面的args.salt = 1;

如果发生错误,结果不对,比如lua 脚本中的 ngx.req.get_uri_args() 写成 ngx.req_uri_args(),去查logs/error.log日志,可以查到错误信息:

2017/11/08 01:35:39 [error] 2054#0: *3 lua entry thread aborted: runtime error: /opt/openresty/nginx/learn_lua/get_random_string.lua:2: attempt to call field 'req_uri_args' (a nil value)

只要在开发中出现错误,进行错误排查的时候,就去看error.log日志的输出!

本次整理就到这里,如果需要关注更多的Lua_nginx模块的一些参数。请参考
https://www.nginx.com/resources/wiki/modules/lua/



如果您觉得这篇博文对你有帮助,请点个赞,谢谢!


如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!
祝你今天开心愉快!


欢迎访问我的csdn博客,我们一同成长!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

博客首页http://blog.csdn.net/u010648555

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121126.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号