【发布时间】:2020-08-30 02:38:12
【问题描述】:
我有 Envoy 代理处理 SSL 终止。 Nginx(docker 容器中的 1.17.0,编译为 --with-http_v2_module)是多个上游服务之一。结果,Nginx 在 443 端口接收流量,但不使用ssl 模块:
server {
listen 443;
server_name example.com www.example.com;
root /var/www/html;
...
这很好,但如果我尝试将http2 添加到我收到的监听行的末尾:
curl: (1) Received HTTP/0.9 when not allowed
...不仅针对有问题的 example.com,还针对所有服务器。
出于明显的性能原因,我希望 Envoy 通过 HTTP/2 与 Nginx 对话。
是否有一些技巧可以让 nginx 在端口 443 上使用 http2 而无需 SSL 终止?
编辑:
核心nginx.conf:
user nginx;
worker_processes 2;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_max_body_size 64M;
sendfile on;
keepalive_timeout 65;
fastcgi_cache_path /etc/nginx-cache levels=1:2 keys_zone=multipress:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
gzip on;
include /etc/nginx/conf.d/*.conf;
}
请注意,我可以使用明确的 curl --http2 命令成功地 curl 当前的 Envoy HTTP2 服务器。问题是 Envoy 和 Nginx 之间的 HTTP2 连接。
【问题讨论】:
-
你能显示你正在使用的 curl 命令吗?
-
@BarryPollard 这实际上也是 Kubernetes 健康检查返回的错误。但我只是从 docker 容器内部做了一个“curl localhost:443”。当然我的curl版本支持http2,我已经在http/2服务器上测试过了。事实上,当我使用当前 Envoy (http2) -> nginx (http1) 路径卷曲相同的资源时,它就可以工作。
标签: ssl nginx http2 envoyproxy