Scrapy 能用 HTTP/2 吗?一条连接上多路复用是不是真的?并发流上限由谁决定?证书默认校验吗?这篇用 nginx 当 HTTPS + HTTP/2 服务器,看连接数、协议和耗时。
默认 HTTP11DownloadHandler:nginx 记录的连接数 20(其中一条连接上最多 3 个请求);协议 {'HTTP/1.1': 41};TLS {'TLSv1.3': 41};response.protocol=HTTP/1.1、ip_address=127.0.0.1、certificate 类型=Certificate;总耗时 0.06 s
H2DownloadHandler:nginx 记录的连接数 1(其中一条连接上最多 40 个请求);协议 {'HTTP/2.0': 41};TLS {'TLSv1.3': 41};response.protocol=h2、ip_address=127.0.0.1、certificate 类型=Certificate;总耗时 0.04 s把 https 映射到 H2DownloadHandler 并安装 h2 库;只支持 TLS 上的 HTTP/2。响应的 protocol 是 h2。
DOWNLOAD_VERIFY_CERTIFICATES 默认 = False
默认(不校验):[{'who': 'callback', 'status': 200}]
DOWNLOAD_VERIFY_CERTIFICATES=True:[{'who': 'errback', 'exc': 'DownloadFailedError', 'msg': "[<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'certificate verify failed"}]同一主机的请求共用一条连接,以流的形式并发;并发流数受服务器上限(http2_max_concurrent_streams)约束,超出的排队。
H2 + 流上限 128:后端并发峰值 20;nginx 连接数 1;总耗时 0.66 s(40 个请求 × 0.3 s ÷ 并发) H2 + 流上限 4:后端并发峰值 4;nginx 连接数 1;总耗时 3.12 s(40 个请求 × 0.3 s ÷ 并发) HTTP11 + nginx 流上限 4(对 1.1 无影响):后端并发峰值 20;nginx 连接数 20;总耗时 0.67 s(40 个请求 × 0.3 s ÷ 并发)
DOWNLOAD_VERIFY_CERTIFICATES 默认关闭,不校验证书;打开后自签名证书会得到 DownloadFailedError。
H2 处理器 + meta proxy:[{'who': 'errback', 'exc': 'NotImplementedError', 'msg': "_ScrapyH2Agent doesn't support proxies."}]不支持代理(抛 NotImplementedError)。