关注这篇关于使用 Lua 提高 nginx 灵活性的文章在减少 Web 堆栈负载方面,我很好奇人们如何使用 Lua 来增强 nginx 的功能。
有什么值得注意的使用 Lua 进行破解、优化和观察? 人们使用过哪些技巧来发现 Nginx 的功能,而这些功能对于 Web 服务器或反向代理来说会很复杂/不可能实现?
编辑:
链接:
http://thechangelog.com/post/3249294699/super-nginx-killer-build-of-nginx-build-for-luajit-plus
http://skillsmatter.com/podcast/home/scripting-nginx-with-lua/te-4729
http://devblog.mixlr.com/2012/06/26/我们如何使用-nginx-lua-and-redis-to-beta-ify-mixlr/
答案1
之前我们编写了一个解决方案,可以根据指定的域或域别名动态获取文档根目录。它使用 mysql 数据库来存储域名到别名的映射。它的链接是http://www.logicwreck.com/index.php/2012/09/11/dynamic-hosts-for-nginx-with-database-storage-of-domain-and-alias-info/
这是一个非常有趣的黑客攻击,因为它可以阻止您配置多个虚拟主机,而只配置一个。
答案2
我的文档根目录解决方案也使用 Lua,但使用的是 bash 脚本而不是数据库。简而言之,它反转域的各个部分并将其用作目录结构。在此结构中,以 _ 为前缀的目录可用于区分文档根目录和子域。
例如 domain.com -> com/domain/_public sub.domain.com -> com/domain/sub/_public
server_name _ ~^(?<www>www\.)?(?<domain>[a-zA-Z0-9-\.]+)$;
set_by_lua $docRoot "
local f = assert(io.popen('/path/to/conversion/script.sh '..ngx.var.domain, 'r'))
local s = assert(f:read('*a'))
f:close()
return s
";
root /var/www/$docRoot/_public;
我的转换脚本如下:
echo $1 | tr "." "\n" | tac | tr "\n" "/" | rev | cut -b 2- | rev | tr -d "\n"
cut 删除了额外的斜线,但最后的 tr 是必需的,因为 nginx 根目录中的换行符会截断 /_public
我运行了几十个这样的域,没有任何问题。它可能比每个域的基于模板的配置生成器慢,但我更喜欢使用单个文件来排除故障。