一个标准的 Nginx ssl 配置必然包含这两行:ssl_certificate example.com.crt;ssl_certificate_key example.com.key;Nginx 启动时会读取配置的证书内容,并经过一系列解析后,最终通过调用 OpenSSL 的 SSL_use_certificate 来设置证书。对于匹配的私钥,Nginx 调用的是 SSL_use_PrivateKey。
来自互联网上各方的推动,正在让 HTTPS 快速普及起来。如今 HTTPS 的概念已经深入开发者的日常,成为每个 Web developer 不得不做的功课之一。在这个 HTTPS 时代,OpenResty 可以帮助我们实现什么? 接下来的几节,讨论的正是如何结合 OpenResty,开发出易于拓展的 HTTPS 应用。
在 2012 年的时候,加入到奇虎 360 公司,为新的产品做技术选型。由于之前一直混迹在 Python 圈子里面,也接触过 Nginx C 模块的高性能开发,一直想找到一个兼备 Python 快速开发和 Nginx C 模块高性能的产品。看到 OpenResty 后,有发现新大陆的感觉。
看下这个段伪代码:local value = get_from_cache(key)if not value then value = query_db(sql) set_to_cache(value, timeout = 100)endreturn value看上去没有问题,在单元测试情况下,也不会有异常。但是,进行压力测试的时候,你会发现,每隔 100 秒,数据库的查询就会出现一次峰值。
其实针对大多应用场景,DNS 是不会频繁变更的,使用 Nginx 默认的 resolver 配置方式就能解决。对于部分应用场景,可能需要支持的系统众多:win、centos、ubuntu 等,不同的操作系统获取 DNS 的方法都不太一样。再加上我们使用 Docker,导致我们在容器内部获取 DNS 变得更加难以准确。如何能够让 Nginx 使用随时可以变化的 DNS 源,成为我们急待解决的问题。
这个 Lua 库提供了 ngx_lua 模块的 DNS 解析器:lua-resty-dns这个 Lua 库基于 ngx_lua 的 cosocket API 实现,可以确定是 100% 非阻塞的。注意,该模块至少需要 ngx_lua 0.5.12 或 OpenResty 1.2.1.11 版本。Lua bit 模块也是需要的。如果你的 ngx_lua 绑定的 LuaJIT 的版本是 2.0,就已经默认开启了 Lua bit 模块。注意,这个模块在 OpenResty 集成环境中默认是开启的。
最近经常有朋友在使用一个域名地址时发现无法被正确解析比如在使用 Mysql 实例时某些云会给一个私有的域名搭配自有的 nameserver 使用local client = mysql:new()client:connect({ host = "rdsmxxxxxx.mysql.rds.xxxx.com", port = 3306, database = "test", user = "test", password = "123456"})以上代码在直接使用时往往会报一个无法解析的错误。
应用场景整个 OpenResty 启动后,我们有时候需要后台处理某些动作,比如数据定期清理、同步数据等。而这个后台任务实例我们期望是唯一并且安全,这里的安全指的是所有 Nginx worker 任意 crash 任何一个,有机制合理保证后续 timer 依然可以正常工作。这里需要给大家介绍一个重要 API ngx.worker.id()。语法: seq_id = ngx.worker.
笔者认为,cosocket 是 OpenResty 世界中技术、实用价值最高部分。让我们可以用非常低廉的成本,优雅的姿势,比传统 socket 编程效率高好几倍的方式进行网络编程。无论资源占用、执行效率、并发能力都非常出色。鲁迅有句名言“其实世界上本没有路,走的人多了便有了路”,其实对于 cosocket 的中文翻译貌似我也碰到了类似的问题。
可以这样说,任何一个开发语言、开发框架,都有它存在的明确目的,重心是为了解决什么问题。没有说我们学习一门语言或技术,就可以解决所有的问题。同样的,OpenResty 的存在也有其自身适用的应用场景。其实官网 wiki 已经列了出来:在 Lua 中混合处理不同 Nginx 模块输出(proxy, drizzle, postgres, Redis, memcached 等)。
OpenResty 引用第三方 resty 库非常简单,只需要将相应的文件拷贝到 resty 目录下即可。我们以 resty.http ( pintsized/lua-resty-http) 库为例。只要将 lua-resty-http/lib/resty/ 目录下的 http.lua 和 http_headers.lua 两个文件拷贝到 /usr/local/openresty/lualib/resty 目录下即可(假设你的 OpenResty 安装目录为 /usr/local/openresty)。
在 OpenResty 中,连接池在使用上如果不加以注意,容易产生数据写错地方,或者得到的应答数据异常以及类似的问题,当然使用短连接可以规避这样的问题,但是在一些企业用户环境下,短连接 + 高并发对企业内部的防火墙是一个巨大的考验,因此,长连接自有其用武之地,使用它的时候要记住,长连接一定要保持其连接池中所有连接的正确性。
===========执行阶段和主要函数请参考HttpLuaModule#ngx.shared.DICT非队列性质ngx.shared.DICT 的实现是采用红黑树实现,当申请的缓存被占用完后如果有新数据需要存储则采用 LRU 算法淘汰掉“多余”数据。
关注时代Java