标签: http2

HTTP/2 是否需要端到端实现才能发挥作用?

如果只有客户端 <-> 负载均衡器是 HTTP/2 而实际的 Web 服务器不是,那么 HTTP/2 的性能优势会损失多少?我猜这取决于负载均衡器和服务器之间的延迟和带宽,但如果您必须猜测平均情况,这有什么关系吗?

http2

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

AWS/ALB、http/2 和 GOAWAY

我们最近从 ELB 切换到 ELB2/ALB,有时我们的 go http/2 客户端会看到来自我们的应用程序负载均衡器的GOAWAY消息,我无法解释。目标组服务器仅支持 http/1.1,并且我们的负载均衡器应始终轮流至少有一台运行正常的服务器。

在 ALB 中注册新实例时,我可以可靠地重现 GOAWAY。当目标处于“初始”状态时,ALB 返回 GOAWAY。此外,即使 ALB 响应 GOAWAY,该请求也会成功发送到目标组中注册的其他实例。因此,给定实例 web0 和 web1,如果我取消注册 web0 并重新注册该目标,如果我在 web0 处于“初始”状态时发出请求,我可以可靠地重现 GOAWAY。然而我们的日志显示 web1 成功处理了请求。

我们的客户端是一个使用http.DefaultClient的 Go 程序。我可以使用 Go 1.7 和 1.8beta2 重现此行为。

发生这种情况时,我们的客户端会记录有关 HTTP/2 响应的更多详细信息:

http2: server sent GOAWAY and closed the connection; LastStreamID=1, ErrCode=NO_ERROR, debug=""
Run Code Online (Sandbox Code Playgroud)

我想更好地了解这里发生了什么。go http2 包或我们的代码是否应该通过重试请求来自动处理 GOAWAY?我对 http2 不太熟悉,不知道是否需要 GOAWAY,这意味着我们的 Go 客户端不应将其作为错误条件处理,或者这是否表明 ALB 出现问题。

amazon-ec2 go amazon-web-services amazon-elb http2

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

带非 TLS 后端的 HTTPS 负载均衡器和带 TLS 后端的 HTTPS 负载均衡器有什么区别

我正在尝试将负载均衡器配置为使用Lets Encrypt提供的证书在 HTTPS 中提供服务,尽管我还无法做到这一点,但阅读本文提供了如何配置的步骤

  • 自签名证书
  • 带 TLS 后端的网络负载均衡器
  • 带非 TLS 后端的 HTTPS 负载均衡器
  • 带 TLS 后端的 HTTPS 负载均衡器

由于我只对 HTTPS 感兴趣,我想知道这两者之间有什么区别:

  1. 带非 TLS 后端的 HTTPS 负载均衡器
  2. 带 TLS 后端的 HTTPS 负载均衡器

但我的意思不是明显的原因,即第一个从负载均衡器到后端没有加密,我的意思是在性能和​​ HTTP2 连接方面,例如我会继续从http2中获得所有好处,如多路复用和流式传输吗?或者是第一个选项

带非 TLS 后端的 HTTPS 负载均衡器

只是一个幻觉,但我不会得到http2?

ssl load-balancing google-compute-engine google-cloud-platform http2

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

是否可以通过 HTTP/2 设置 Guzzle + Pool?

Guzzle提供了一种发送并发请求的机制:Pool。我使用了文档中的示例:http://docs.guzzlephp.org/en/stable/quickstart.html#concurrent-requests。它工作得很好,发送并发请求,一切都很棒,除了一件事:在这种情况下,Guzzle 似乎忽略了 HTTP/2。

我准备了一个简化的脚本,它向https://stackoverflow.com发送两个请求,第一个是使用 Pool,第二个只是常规的 Guzzle 请求。只有常规请求通过 HTTP/2 连接。

<?php

include_once 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Pool;
use GuzzleHttp\Psr7\Request;

$client = new Client([
    'version' => 2.0,
    'debug' => true
]);

/************************/

$requests = function () {
    yield new Request('GET', 'https://stackoverflow.com');
};
$pool = new Pool($client, $requests());
$promise = $pool->promise();
$promise->wait();

/************************/

$client->get('https://stackoverflow.com', [
    'version' => 2.0,
    'debug' => true,
]);
Run Code Online (Sandbox Code Playgroud)

这是输出: https: //pastebin.com/k0HaDWt6(我用“!!!!!”突出显示了重要部分)

有谁知道为什么 Guzzle 这样做以及如何使 Pool 与 HTTP/2 一起工作?

php guzzle http2

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

Chrome net::ERR_HTTP2_PROTOCOL_ERROR 200 重新连接后

我正在使用带有处理服务器发送事件流的快速应用程序的节点服务器。这是通过启用 http2 的 NginX 代理的。SSE 事件通过 React 应用程序中的 EventSource 使用。我每 10 秒发送一次心跳消息以保持连接有效。

这一切都很好,直到出现某种形式的网络中断,例如让我的笔记本电脑进入睡眠状态然后重新唤醒它。

然后从那时起,流将每 40 秒左右出错一次,出现 net::ERR_HTTP2_PROTOCOL_ERROR 200 错误,然后重新连接而不是仅使用稳定流重新连接一次。

Firefox 工作正常。它不会出错并且仅重新连接一次。

如果我将 Node 配置为直接为 http2 提供服务,而不是通过 NGinx 作为测试(通过 spdy 库),那么一切都按预期工作,所以我认为这不是 Node 问题,而且我的 Nginx 配置和 Chrome 肯定缺少某些内容。

Nginx配置如下(位置/stream为SSE代理)

server {
    listen 28443 ssl http2;
    listen [::]:28443 ssl http2;

    server_name example.com;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    http2_max_field_size 16k;
    http2_max_header_size 128k;

    root /var/www/example.com;
    index index.html index.htm;

    location / {
        client_max_body_size 100M;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://localhost:28080;
        proxy_http_version 1.1;
        proxy_set_header …
Run Code Online (Sandbox Code Playgroud)

google-chrome nginx node.js http2 eventsource

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

我可以让我的 cloudrun 服务器接收 http/2 请求吗?

我可以让 Google 在云运行中向我的服务器发送 http/2 请求吗?

我不确定谷歌如何知道我的服务器支持它,因为谷歌终止负载均衡器上的 SSL 并将 http 发送到云运行中的无状态服务器。

如果可能的话,我正在考虑从 webpieces 中获取一些内容,并为我“知道”只会执行 http/2 的微服务创建一个没有 http1.1 的纯 http/2 服务器。

另外,如果我有一个纯 http/2 服务器,是否有一种方法可以让 google 在需要时将 http1 请求转换为 http/2,以便我也可以托管网站?

我能找到的唯一信息是一个很棒的常见问题解答,它似乎缺少它是否在服务器端(而不是客户端)支持 http/2...

https://github.com/ahmetb/cloud-run-faq

谢谢,迪恩

http2 google-cloud-run

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

如何使用 Node.js 通过代理发送 HTTP/2 请求?

我想使用 Node.js 的http2库通过代理将 HTTP/2 请求发送到服务器。

出于测试目的,我使用 Charles v4.2.7 作为代理,但 Charles 无法代理请求。Charles 显示Malformed request URL "*"错误,因为它收到的请求是PRI * HTTP/2.0HTTP/2 连接前言)。我可以使用 cURL(例如curl --http2 -x localhost:8888 https://cypher.codes)通过我的 Charles 代理成功发送 HTTP/2 请求,所以我认为这不是 Charles 的问题,而是我的 Node.js 实现的问题。

这是我的 Node.js HTTP/2 客户端实现,它尝试通过我的 Charles 代理监听 http://localhost:8888向https://cypher.codes发送 GET 请求:

const http2 = require('http2');

const client = http2.connect('http://localhost:8888');
client.on('error', (err) => console.error(err));

const req = client.request({
  ':scheme': 'https',
  ':method': 'GET',
  ':authority': 'cypher.codes',
  ':path': '/',
});
req.on('response', (headers, flags) …
Run Code Online (Sandbox Code Playgroud)

javascript proxy node.js http2 charles-proxy

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

python-请求如何发送密码名称/http2

我正在尝试通过 python-requests 复制以下客户端请求。

在此处输入图片说明 在客户端连接下,我看到 HTTP 版本为 2.0,TLS 版本为 1.3,据我所知,我知道请求使用 TLS 1.3。到目前为止,我的请求失败了。

我想知道我是否需要通过证书。我想了解此请求与常规请求有何不同

r = requests.get('someurl')
Run Code Online (Sandbox Code Playgroud)

如何使用请求来使用请求中显示的确切客户端连接?我不完全理解每个指针,我将如何使用具有特定密码名称的 h2 ALPN/?我不期望对这个问题有一个可靠的答案,而解释会更有帮助!

python ssl python-requests http2

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

如何在 Heroku 上将 http2 与 Node 结合使用(使用 Koa)

我有以下代码...

const PORT = process.env.PORT || 5000;
const app = new Koa();
...
app.listen(PORT)
Run Code Online (Sandbox Code Playgroud)

这在本地和 Heroku 中都非常有效。所以现在我想使用 Http2 所以我更改为以下内容......

const server = http2.createSecureServer(
    {
        "key": fs.readFileSync('./server-key.pem'),
        "cert": fs.readFileSync('./server-cert.pem')
    }, 
    app.callback()
)
server.listen(PORT);
Run Code Online (Sandbox Code Playgroud)

这在本地工作正常,但是,当我上传到 Heroku 时,我得到......

2021-06-24T00:43:00.383108+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path="/" host=my-app.herokuapp.com request_id=604f4a2c-8dd2-4cfa-9cf2-3cce5ef76070 fwd="..." dyno=web.1 connect=0ms service=1ms status=503 bytes=0 protocol=https
Run Code Online (Sandbox Code Playgroud)

那么如何让 http2 与 Node、Koa 和 Heroku 一起工作呢?

heroku node.js http2

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

我可以在没有ALPN支持的情况下实现http/2服务器吗?

这样,客户端可以在没有ALPN的情况下连接服务器并使用http/2默认值.

那可能吗?

http2 http2-lawyers

3
推荐指数
1
解决办法
1275
查看次数