标签: http2

使用maven-jetty-plugin启用HTTP2

我用jetty通过SSL启用了HTTP/2连接器.当我尝试连接浏览器时,出现"ERR_SSL_PROTOCOL_ERROR"错误.如果我切换到HTTP/1.1连接器一切正常.

这是我的码头配置文件:

<!-- ============================================================= -->
<!-- Configure the Jetty Server instance with an ID "Server"       -->
<!-- by adding a HTTP connector.                                   -->
<!-- This configuration must be used in conjunction with jetty.xml -->
<!-- ============================================================= -->
<Configure id="Server" class="org.eclipse.jetty.server.Server">

    <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
        <Set name="secureScheme">https</Set>
        <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
        <Set name="outputBufferSize">32768</Set>
        <Set name="requestHeaderSize">8192</Set>
        <Set name="responseHeaderSize">8192</Set>
        <Set name="sendServerVersion">true</Set>
        <Set name="sendDateHeader">false</Set>
        <Set name="headerCacheSize">512</Set>

        <!-- Uncomment to enable handling of X-Forwarded- style headers
        <Call name="addCustomizer">
          <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
        </Call>
        -->
    </New>

    <!-- =========================================================== …
Run Code Online (Sandbox Code Playgroud)

jetty maven-jetty-plugin jetty-9 http2

4
推荐指数
1
解决办法
1819
查看次数

是否有必要在HTTP/2中缓存半身像?

在HTTP/1中,为了避免额外的网络请求来确定资源是否应该保持缓存,我们将在静态资产上设置一个高值max-ageExpires值,并为每个版本提供一个唯一的URL.但是在HTTP/2中,请求很便宜,所以我们可以在没有缓存破坏的情况下完成,只需依赖ETag,最后修改,等等?

我可以看到继续破坏缓存(除了双重服务HTTP/1和HTTP/2客户端)的唯一优势是在资源过期时节省带宽检查.甚至那可能与HPACK无关.我错过了什么,或者我现在可以阻止缓存破坏吗?

caching http2

4
推荐指数
1
解决办法
743
查看次数

浏览器不会升级到H2,而是发送"升级"标题

在我的网络服务器上,我试图让H2(http2)工作.通过"ondrej"存储库安装Apache 2.4.20.我在Debian 8和Ubuntu 14.04服务器上测试过,但是我一直遇到同样的问题.我有OpenSSL 1.0.2和SSL vhosts运行.

奇怪的是发送升级头(连接:升级和升级:h2).当我做一些外部服务器测试时,我得到了响应,即在ALPN支持下h2正常运行.但问题是我测试的浏览器(Win7上的Chrome和FireFox)不会升级到H2.

我注意到缺少的一件事是HTTP2-Settings标头,但我在任何Apache文档中都找不到任何实现此功能或强制Apache发送此标头的内容.

遗憾的是我无法使用cUrl进行测试,因为我可以访问的服务器不支持任何具有http2支持的版本.

我的SSL vhost设置:

Protocols h2 http/1.1
SSLEngine On
SSLCACertificateFile xxxxxxxx
SSLProtocol all -SSLv2 -SSLv3
SSLCompression Off
SSLHonorCipherOrder On
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RSA+AES RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4 !AES128"
Header always set Strict-Transport-Security "max-age=15552000;includeSubDomains"
SSLCertificateFile xxxxxxxx
SSLCertificateKeyFile xxxxxxxx
Run Code Online (Sandbox Code Playgroud)

我正在使用prefork模块运行Apache而不是使用worker.

谁能告诉我什么是错的?

apache ssl http2 alpn

4
推荐指数
2
解决办法
5287
查看次数

Safari 在使用 HTTP/2 时无法响应

我是 nginx 的新手(过去一直在使用 apache)。

目前我正在尝试设置一个缓存,该缓存将位于 apache 后端,最终我认为(基于我迄今为止对 nginx 的良好经验)我们将切换到只使用 nginx。

一旦我打开 http2 Safari 就无法得到响应。在错误日志中没有任何表明有问题的内容,如果我打开访问日志并检查那里,我可以看到 Safari 客户端进行了很多很多连接,就像它只是不断刷新页面一样。

我已经尝试了许多 nginx 版本,因为我注意到最新的稳定版可能存在问题。所以我尝试降级到 1.9.14 以及升级到 1.11.1,但都没有运气。

Nginx 只编译:

./configure --with-http_ssl_module --with-http_v2_module

Nginx -V 输出:

nginx version: nginx/1.11.1
built by gcc 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1) 
built with OpenSSL 1.0.2g-fips  1 Mar 2016
TLS SNI support enabled
configure arguments: --with-http_ssl_module --with-http_v2_module
Run Code Online (Sandbox Code Playgroud)

我的配置看起来像这样(我的站点可用配置):

upstream backend {
    server 127.0.0.1:8088 weight=100;
}

server {
    listen 443 ssl http2 deferred;
    server_name www.server.name;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK";
    ssl_prefer_server_ciphers on; …
Run Code Online (Sandbox Code Playgroud)

safari ssl nginx http2

4
推荐指数
1
解决办法
2700
查看次数

HTTP/2数据压缩

我试图了解HTTP/2协议压缩数据字段的方式.我没有在rfc中找到算法.我知道它是一个二进制协议.我正在寻找一种方法将二进制协议恢复为人类可读的内容.我认为这是gzip像在标题中写,但它不是任何人有一个源,我可以寻找二进制协议参考?

Frame 55: 151 bytes on wire (1208 bits), 151 bytes captured (1208 bits) on interface 0
Ethernet II, Src: 00:00:00_00:00:00 (00:00:00:00:00:00), Dst:00:00:00_00:00:00 (00:00:00:00:00:00)
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 443 (443), Dst Port: 55300 (55300), Seq: 1087, Ack: 1078, Len: 85
Secure Sockets Layer
HyperText Transfer Protocol 2
Stream: HEADERS, Stream ID: 13, Length 47
    Length: 47
    Type: HEADERS (1)
    Flags: 0x04
    0... .... .... .... .... .... .... .... = Reserved: …
Run Code Online (Sandbox Code Playgroud)

http2

4
推荐指数
1
解决办法
3834
查看次数

HTTP/2 HEADERS和DATA帧

我正在尝试详细了解HTTP/2.我读了这篇关于流,消息和框架的文章:https://hpbn.co/http2/#streams-messages-and-frames.我不知道我的概念是否正确.

我得出以下结论:

  • 消息是HEADER帧和一个或多个DATA帧的组合.
  • DATA帧只能与HEADERS帧一起发送,因为我没有看到任何显示DATA帧流ID的指标(RFC 7540,6.1)
    • 如果是这样,则只能在消息中发送数据帧
  • Stream可以分块为多个Frame,而Stream可以通过Stream ID与Stream相关联

此外:规范中如何表示消息?

http http2

4
推荐指数
1
解决办法
2465
查看次数

如何在Java8项目中使用Http Client API(自java 9起)

Java 9导入一个新的HTTP/2客户端API,它似乎很好用,但有没有办法在Java 8中使用它?

要么

是否有任何shim/ polyfill(来自javascript)可以在Java 8中使用它?

java java-8 http2 java-9 java-http-client

4
推荐指数
1
解决办法
1444
查看次数

HTTP/2 `:authority` 标头是否应该包含端口号?

HTTP“主机”标头参数中是否需要端口号?,同样的逻辑是否适用于 HTTP/2?

即如果浏览器向https://server.com:1234/发出请求,:authority标题应该是server.com还是server.com:1234

http2

4
推荐指数
1
解决办法
4006
查看次数

如何在 Nest.js (Node) 中使用 HTTP/2

我读到 Express 4.x 与 Node.js 原生 HTTP2(从 8.4+ 开始)不兼容,我希望 Express 5.x 上的进展比它更多。但是当我开始考虑 Express5.x 可能会在我的下一个 Node.js 项目中发布的很晚时 - 我来到了 Nest.js。

有谁知道 Nest.js 是否可以与原生 HTTP2 支持一起使用?

我听说过的唯一支持此功能的 Node.js 框架是 Fastify。或者还有其他的吗?最好是支持 Express 插件的。

node.js express http2 nestjs

4
推荐指数
1
解决办法
2990
查看次数

如何使用 Server.TLSNextProto 禁用 HTTP/2

我有一个 Go 服务器处理 https 请求:

package main
import (
        "fmt"
        "net/http"
        "log"
)
const (
        port       = "5966"
        cert       = "/tmp/cert.pem"
        key        = "/tmp/key.pem"
)
func main() {

        listen_at := ":" + port
        fmt.Println("Listening at", listen_at)
        go http.HandleFunc("/job_handler/", job_handler)
        log.Fatal(http.ListenAndServeTLS(listen_at, cert, key, nil))
}
func job_handler(w http.ResponseWriter, r *http.Request) {
       // do somework
}
Run Code Online (Sandbox Code Playgroud)

原来在 https 模式下,Go 对 HTTP/2 协议有透明的支持。我们有一些客户端在 HTTP/2 中的行为明显异常,因此我们需要在服务器端禁用 HTTP/2。

不幸的是,我不能使用 ENV 变量GODEBUG=http2server=0来禁用 HTTP/2。剩下的内容Server.TLSNextProto如此处所述

如何Server.TLSNextProto在上面的服务器代码上使用禁用 https/2?

go http2

4
推荐指数
1
解决办法
1762
查看次数