nginx将请求的处理过程划分为11个phase(阶段),相对于是对请求处理的一种抽象,便于定制处理过程。
ngx_lua针对常用的阶段也实现了自己的阶段控制,总共有12个阶段,和nginx有相似(如rewrite、access、content、log阶段等)也有不同(如balancer、cert阶段等)。
目前项目组有个需求,需要在SSL握手前添加一个session阶段(分布式session cache),用于优化如安卓终端访问https的速度(详见cloudflare的公开资料),具体实现可以参考ssl_certificate_by_lua 。
session cache 的原理是使用 client hello 中的 session id 查询服务端的 session cache,如果服务端有对应的缓存,则直接使用已有的 session 信息提前完成握手,称为简化握手。
session cache 的优点:
(1)session id 是 TLS 协议的标准字段,市面上的浏览器全部都支持 session cache;
session cache 的缺点:
(1)需要消耗服务端内存来存储 session 内容;
(2)目前的开源软件包括 nginx,apache 只支持单机多进程间共享缓存,不支持多机间分布式缓存,对于大型互联网公司而言,单机 session cache 几乎没有作用;
备注:项目组希望通过解决session cache的缺点(2),即通过对 TLS 握手协议及服务器端实现的优化,支持全局的session cache,提升用户的访问速度,节省服务器计算资源。
server { listen 443 default_server http2; ssl_certificate ssl/cert.pem; ssl_certificate_key ssl/cert.key; lua_check_client_abort off; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_fetch_by_lua_file app/src/ ssl_session_fetch.lua; ssl_session_store_by_lua_file app/src/ssl_session_store.lua; }
PS:目前项目组已经实现,如果大家有需要,可以一起讨论(由于细节太多,就不在该博客详述了)。