我目前正在尝试为一个项目启用 http2。该系统在 AWS 上的 Ubuntu 16.04 上运行,位于启用了 proxy_protocol 的 ELB 后面。该站点仅使用来自 ppa:ondrej/apache2 的 Apache 2.4 在 mpm_event 模式下运行 SSL,并使用 tomcat 7 作为后端。vhost 配置为:
<VirtualHost *:443>
ProxyProtocol On
ServerName myhostname
DocumentRoot /var/www/html/
<Directory /var/www/html/>
Options +FollowSymLinks -Indexes
AllowOverride None
Require all granted
</Directory>
<Location />
Require all granted
</Location>
Header always set Strict-Transport-Security "max-age=86400"
RequestHeader set X-Forwarded-Proto https
SSLEngine On
SSLCertificateFile mycrt
SSLCertificateKeyFile mykey
ProxyTimeout 1800
ProxyPreserveHost on
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>
如果我们启用 http2,则“正常”的 GET / POST 请求可以正常工作,仅文件上传会导致日志中出现如下消息,并向客户端发送 400 错误请求:
[proxy_protocol:error] [client ] ProxyProtocol: no valid header found
[proxy_http:error] (103)Software caused connection abort: [client ] AH01095: prefetch request body failed to 127.0.0.1:8080 (localhost) from 10.X (), referer:
我进行了一些跟踪,但请求并未发送到 tomcat,而是卡在了 apache 中。代理协议标头看起来也正常,因此第一条消息也让我感到困惑。
有人知道这里发生了什么吗:)?
答案1
看起来像是 mod_proxy_protocol 中的一个错误。它目前与 mod_http2 不兼容。
请参阅此错误以了解更多详细信息:https://github.com/roadrunner2/mod-proxy-protocol/issues/6