TLS/SSL 优化
握手性能优化
首先考虑 session cache,但是 session cache 只能在单台 Nginx 上使用。
1 2 3
| Syntax: ssl_session_cache off | none | [builtin[:size]] [shared:name:size]; Default: ssl_session_cache none; Context: http, server
|
- off:不使用 Session 缓存,且 Nginx 在协议中明确告诉客户端 Session 缓存不被使用
- none:不使用 Session 缓存,但是没有告诉客户端不被使用
- builtin:使用 OpenSSL 的 Session 缓存,由于在内存中使用,所以仅当统一客户端的两次连接都命中到同一个 worker 进程时,Session 缓存才会生效,比较少见
- shared:name:size:定义共享内存,为所有 worker 进程提供 Session 缓存服务,1MB 大于可用于 4000 个 Session。最常用
TLS/SSL 中的会话票证 tickets
Nginx 将会话 Session 中的信息作为 tickets 加密发给客户端,当客户端下次发起 TLS 连接时,带上 tickets,由 Nginx 解密验证后复用会话 Session。
tickets 可以在集群中使用,因为只要集群的 Nginx 密钥相同即可。
会话票证虽然更易在 Nginx 集群中使用,但破坏了 TLS/SSL 的安全机制,有安全风险,必须频繁更换 tickets 密钥。
1 2 3
| Syntax: ssl_session_tickets on | off; Default: ssl_session_tickets on; Context: http, server
|
1 2 3
| Syntax: ssl_session_ticket_key file; Default: — Context: http, server
|
HTTP 长连接
- 减少握手次数
- 通过减少并发连接数减少了服务器资源的消耗
- 降低 TCP 拥塞控制的影响
1 2 3 4 5 6 7
| Syntax: keepalive_requests number; Default: keepalive_requests 100; Context: http, server, location
Syntax: keepalive_requests number; Default: keepalive_requests 100; Context: upstream
|
gzip 压缩
- 功能:通过实时压缩 HTTP 包体,提升网络传输效率
- 模块:
ngx_http_gzip_module
,通过 --without-http_gzip_module
禁用模块
1 2 3
| Syntax: gzip on | off; Default: gzip off; Context: http, server, location, if in location
|
压缩哪些请求的响应?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Syntax: gzip_types mime-type ...; Default: gzip_types text/html; Context: http, server, location
Syntax: gzip_min_length length; Default: gzip_min_length 20; Context: http, server, location
Syntax: gzip_disable regex ...; Default: — Context: http, server, location
Syntax: gzip_http_version 1.0 | 1.1; Default: gzip_http_version 1.1; Context: http, server, location
|
是否压缩上游的响应
1 2 3
| Syntax: gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; Default: gzip_proxied off; Context: http, server, location
|
- off:不压缩来自上游的响应
- expired:如果上游响应中含有 Expired 头部,且其值中的时间与系统时间比较后确定不会缓存,则压缩响应
- no-cache:如果上游响应中含有 Cache-Control 头部,且其值含有 no-cache 值,则压缩响应
- no-store:如果上游响应中含有 Cache-Control 头部,且其值含有 no-store值,则压缩响应
- private:如果上游响应中含有 Cache-Control 头部,且其值含有 private 值,则压缩响应
- no_last_modified:如果上游响应中没有 Last-Modified 头部,则压缩响应
- no_etag:如果上游响应中没有 Etag 头部,则压缩响应
- auth:如果客户端请求中含有 Authorization 头部,则压缩响应
- any:压缩所有来自上游的响应
其他压缩参数
还提供了一个变量,可以实时看到压缩率,例如输出到日志中。
1 2 3 4 5 6 7 8 9 10 11
| Syntax: gzip_comp_level level; Default: gzip_comp_level 1; Context: http, server, location
Syntax: gzip_buffers number size; Default: gzip_buffers 32 4k|16 8k; Context: http, server, location
Syntax: gzip_vary on | off; Default: gzip_vary off; Context: http, server, location
|
升级更高的 HTTP/2 协议
向前兼容 HTTP/1.1 协议,传输效率可以大幅提升。