如果只有客户端 <-> 负载均衡器是 HTTP/2 而实际的 Web 服务器不是,那么 HTTP/2 的性能优势会损失多少?我猜这取决于负载均衡器和服务器之间的延迟和带宽,但如果您必须猜测平均情况,这有什么关系吗?
我们最近从 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 出现问题。
我正在尝试将负载均衡器配置为使用Lets Encrypt提供的证书在 HTTPS 中提供服务,尽管我还无法做到这一点,但阅读本文提供了如何配置的步骤
由于我只对 HTTPS 感兴趣,我想知道这两者之间有什么区别:
但我的意思不是明显的原因,即第一个从负载均衡器到后端没有加密,我的意思是在性能和 HTTP2 连接方面,例如我会继续从http2中获得所有好处,如多路复用和流式传输吗?或者是第一个选项
带非 TLS 后端的 HTTPS 负载均衡器
只是一个幻觉,但我不会得到http2?
ssl load-balancing google-compute-engine google-cloud-platform http2
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 一起工作?
我正在使用带有处理服务器发送事件流的快速应用程序的节点服务器。这是通过启用 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 在云运行中向我的服务器发送 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
谢谢,迪恩
我想使用 Node.js 的http2库通过代理将 HTTP/2 请求发送到服务器。
出于测试目的,我使用 Charles v4.2.7 作为代理,但 Charles 无法代理请求。Charles 显示Malformed request URL "*"错误,因为它收到的请求是PRI * HTTP/2.0(HTTP/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) 我正在尝试通过 python-requests 复制以下客户端请求。
在客户端连接下,我看到 HTTP 版本为 2.0,TLS 版本为 1.3,据我所知,我知道请求使用 TLS 1.3。到目前为止,我的请求失败了。
我想知道我是否需要通过证书。我想了解此请求与常规请求有何不同
r = requests.get('someurl')
Run Code Online (Sandbox Code Playgroud)
如何使用请求来使用请求中显示的确切客户端连接?我不完全理解每个指针,我将如何使用具有特定密码名称的 h2 ALPN/?我不期望对这个问题有一个可靠的答案,而解释会更有帮助!
我有以下代码...
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 一起工作呢?
这样,客户端可以在没有ALPN的情况下连接服务器并使用http/2默认值.
那可能吗?
http2 ×10
node.js ×3
ssl ×2
amazon-ec2 ×1
amazon-elb ×1
eventsource ×1
go ×1
guzzle ×1
heroku ×1
javascript ×1
nginx ×1
php ×1
proxy ×1
python ×1