diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 06:33:50 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 06:33:50 +0000 |
commit | fe39ffb8b90ae4e002ed73fe98617cd590abb467 (patch) | |
tree | b80e5956907d8aeaaffe4e4f0c068c0e6157ce8b /docs/manual/howto/http2.html | |
parent | Initial commit. (diff) | |
download | apache2-fe39ffb8b90ae4e002ed73fe98617cd590abb467.tar.xz apache2-fe39ffb8b90ae4e002ed73fe98617cd590abb467.zip |
Adding upstream version 2.4.56.upstream/2.4.56upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | docs/manual/howto/http2.html | 13 | ||||
-rw-r--r-- | docs/manual/howto/http2.html.en | 346 | ||||
-rw-r--r-- | docs/manual/howto/http2.html.es | 421 | ||||
-rw-r--r-- | docs/manual/howto/http2.html.fr.utf8 | 429 |
4 files changed, 1209 insertions, 0 deletions
diff --git a/docs/manual/howto/http2.html b/docs/manual/howto/http2.html new file mode 100644 index 0000000..7de4a43 --- /dev/null +++ b/docs/manual/howto/http2.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: http2.html.en +Content-Language: en +Content-type: text/html; charset=UTF-8 + +URI: http2.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: http2.html.fr.utf8 +Content-Language: fr +Content-type: text/html; charset=UTF-8 diff --git a/docs/manual/howto/http2.html.en b/docs/manual/howto/http2.html.en new file mode 100644 index 0000000..8e96089 --- /dev/null +++ b/docs/manual/howto/http2.html.en @@ -0,0 +1,346 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head> +<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> +<!-- + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + This file is generated from xml source: DO NOT EDIT + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + --> +<title>HTTP/2 guide - Apache HTTP Server Version 2.4</title> +<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" /> +<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" /> +<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" /> +<script src="../style/scripts/prettify.min.js" type="text/javascript"> +</script> + +<link href="../images/favicon.ico" rel="shortcut icon" /></head> +<body id="manual-page"><div id="page-header"> +<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p> +<p class="apache">Apache HTTP Server Version 2.4</p> +<img alt="" src="../images/feather.png" /></div> +<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div> +<div id="path"> +<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.4</a> > <a href="./">How-To / Tutorials</a></div><div id="page-content"><div id="preamble"><h1>HTTP/2 guide</h1> +<div class="toplang"> +<p><span>Available Languages: </span><a href="../en/howto/http2.html" title="English"> en </a> | +<a href="../es/howto/http2.html" hreflang="es" rel="alternate" title="Español"> es </a> | +<a href="../fr/howto/http2.html" hreflang="fr" rel="alternate" title="Français"> fr </a></p> +</div> + + <p>This is the howto guide for the HTTP/2 implementation in Apache httpd. This + feature is <em>production-ready</em> and you may expect interfaces and directives to + remain consistent releases. + </p> + </div> +<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#protocol">The HTTP/2 protocol</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#implementation">HTTP/2 in Apache httpd</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#building">Build httpd with HTTP/2 support</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#basic-config">Basic Configuration</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#mpm-config">MPM Configuration</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#clients">Clients</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#tools">Useful tools to debug HTTP/2</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#push">Server Push</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#earlyhints">Early Hints</a></li> +</ul><h3>See also</h3><ul class="seealso"><li><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code></li><li><a href="#comments_section">Comments</a></li></ul></div> +<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="protocol" id="protocol">The HTTP/2 protocol</a></h2> + + <p>HTTP/2 is the evolution of the world's most successful application layer protocol, HTTP. + It focuses on making more efficient use of network resources. It does not change the fundamentals + of HTTP, the semantics. There are still request and responses and headers and all that. So, if + you already know HTTP/1, you know 95% about HTTP/2 as well.</p> + <p>There has been a lot written about HTTP/2 and how it works. The most normative is, of course, + its <a href="https://tools.ietf.org/html/rfc7540">RFC 7540</a> + (<a href="http://httpwg.org/specs/rfc7540.html">also available in more readable formatting, YMMV</a>). + So, there you'll find the nuts and bolts.</p> + <p>But, as RFC do, it's not really a good thing to read first. It's better to first understand + <em>what</em> a thing wants to do and then read the RFC about <em>how</em> it is done. A much + better document to start with is <a href="https://daniel.haxx.se/http2/">http2 explained</a> + by Daniel Stenberg, the author of <a href="https://curl.haxx.se">curl</a>. It is available in + an ever growing list of languages, too!</p> + <p>Too Long, Didn't read: there are some new terms and gotchas that need to be kept in mind while reading this document:</p> + <ul> + <li>HTTP/2 is a <strong>binary protocol</strong>, as opposed to HTTP 1.1 that is plain text. The latter is meant to be human readable (for example sniffing network traffic) meanwhile the former is not. More info in the official FAQ <a href="https://http2.github.io/faq/#why-is-http2-binary">question</a>.</li> + <li><strong>h2</strong> is HTTP/2 over TLS (protocol negotiation via ALPN).</li> + <li><strong>h2c</strong> is HTTP/2 over TCP.</li> + <li>A <strong>frame</strong> is the smallest unit of communication within an HTTP/2 connection, consisting of a header and a variable-length sequence of octets structured according to the frame type. More info in the official documentation <a href="http://httpwg.org/specs/rfc7540.html#FramingLayer"> section</a>.</li> + <li>A <strong>stream</strong> is a bidirectional flow of frames within the HTTP/2 connection. The correspondent concept in HTTP 1.1 is a request/response message exchange. More info in the official documentation <a href="http://httpwg.org/specs/rfc7540.html#StreamsLayer"> section</a>.</li> + <li>HTTP/2 is able to run <strong>multiple streams</strong> of data over the same TCP connection, avoiding the classic HTTP 1.1 head of blocking slow request and avoiding to re-instantiate TCP connections for each request/response (KeepAlive patched the problem in HTTP 1.1 but did not fully solve it).</li> + </ul> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="implementation" id="implementation">HTTP/2 in Apache httpd</a></h2> + + <p>The HTTP/2 protocol is implemented by its own httpd module, aptly named + <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code>. It implements the complete set + of features described by RFC 7540 and supports HTTP/2 over cleartext (http:), as + well as secure (https:) connections. The cleartext variant is named '<code>h2c</code>', + the secure one '<code>h2</code>'. For <code>h2c</code> it allows the <em>direct</em> + mode and the <code>Upgrade:</code> via an initial HTTP/1 request.</p> + <p>One feature of HTTP/2 that offers new capabilities for web developers is + <a href="#push">Server Push</a>. See that section on how your web application + can make use of it.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="building" id="building">Build httpd with HTTP/2 support</a></h2> + + <p><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> uses the library of <a href="https://nghttp2.org">nghttp2</a> + as its implementation base. In order to build <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> you need at least version 1.2.1 of + <code>libnghttp2</code> installed on your system.</p> + <p>When you <code>./configure</code> your Apache httpd source tree, you need to give it + '<code>--enable-http2</code>' as additional argument to trigger the build of the module. + Should your <code>libnghttp2</code> reside in an unusual place (whatever that is on your + operating system), you may announce its location with '<code>--with-nghttp2=<path></code>' + to <code>configure</code>.</p> + <p>While that should do the trick for most, they are people who might prefer a statically + linked <code>nghttp2</code> in this module. For those, the option <code>--enable-nghttp2-staticlib-deps</code> + exists. It works quite similar to how one statically links openssl to <code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code>.</p> + <p>Speaking of SSL, you need to be aware that most browsers will speak HTTP/2 only on <code>https:</code> + URLs, so you need a server with SSL support. But not only that, you will need a SSL library + that supports the <code>ALPN</code> extension. If OpenSSL is the library you use, you need + at least version 1.0.2.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="basic-config" id="basic-config">Basic Configuration</a></h2> + + + <p>When you have a <code>httpd</code> built with <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> you need some + basic configuration for it becoming active. The first thing, as with every Apache module, + is that you need to load it:</p> + <pre class="prettyprint lang-config">LoadModule http2_module modules/mod_http2.so</pre> + + + <p>The second directive you need to add to your server configuration is</p> + <pre class="prettyprint lang-config">Protocols h2 http/1.1</pre> + + <p>This allows h2, the secure variant, to be the preferred protocol on your server + connections. When you want to enable all HTTP/2 variants, you simply write:</p> + <pre class="prettyprint lang-config">Protocols h2 h2c http/1.1</pre> + + <p>Depending on where you put this directive, it affects all connections or just + the ones to a certain virtual host. You can nest it, as in:</p> + <pre class="prettyprint lang-config">Protocols http/1.1 +<VirtualHost ...> + ServerName test.example.org + Protocols h2 http/1.1 +</VirtualHost></pre> + + + <p>This allows only HTTP/1 on connections, except SSL connections to <code>test.example.org</code> + which offer HTTP/2.</p> + <div class="note"><h3>Choose a strong SSLCipherSuite</h3> + <p>The <code class="directive"><a href="../mod/mod_ssl.html#sslciphersuite">SSLCipherSuite</a></code> needs to be configured with + a strong TLS cipher suite. The current version of <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> does not enforce any cipher but most + clients do so. Pointing a browser to a <code>h2</code> enabled server with a inappropriate + cipher suite will force it to simply refuse and fall back to HTTP 1.1. This is a common mistake + that is done while configuring httpd for HTTP/2 the first time, so please keep it in mind to avoid + long debugging sessions! If you want to be sure about the cipher suite to choose please avoid + the ones listed in the <a href="http://httpwg.org/specs/rfc7540.html#BadCipherSuites">HTTP/2 TLS reject list</a>.</p> + </div> + <p>The order of protocols mentioned is also relevant. By default, the first one is the + most preferred protocol. When a client offers multiple choices, the one most to the + left is selected. In</p> + <pre class="prettyprint lang-config">Protocols http/1.1 h2</pre> + + <p>the most preferred protocol is HTTP/1 and it will always be selected unless a + client <em>only</em> supports h2. Since we want to talk HTTP/2 to clients that + support it, the better order is</p> + <pre class="prettyprint lang-config">Protocols h2 h2c http/1.1</pre> + + + <p>There is one more thing to ordering: the client has its own preferences, too. If + you want, you can configure your server to select the protocol most preferred by + the client:</p> + <pre class="prettyprint lang-config">ProtocolsHonorOrder Off</pre> + + <p>makes the order <em>you</em> wrote the Protocols irrelevant and only the client's + ordering will decide.</p> + <p>A last thing: the protocols you configure are not checked for correctness + or spelling. You can mention protocols that do not exist, so there is no need + to guard <code class="directive"><a href="../mod/core.html#protocols">Protocols</a></code> with any + <code class="directive"><a href="../mod/core.html#ifmodule"><IfModule></a></code> checks.</p> + <p>For more advanced tips on configuration, see the <a href="../mod/mod_http2.html#dimensioning"> + modules section about dimensioning</a> and <a href="../mod/mod_http2.html#misdirected"> + how to manage multiple hosts with the same certificate</a>.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="mpm-config" id="mpm-config">MPM Configuration</a></h2> + + + <p>HTTP/2 is supported in all multi-processing modules that come with httpd. However, if + you use the <code class="module"><a href="../mod/prefork.html">prefork</a></code> mpm, there will be severe restrictions.</p> + <p>In <code class="module"><a href="../mod/prefork.html">prefork</a></code>, <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> will only process one request at at time + per connection. But clients, such as browsers, will send many requests at the same time. + If one of these takes long to process (or is a long polling one), the other requests will + stall.</p> + <p><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> will not work around this limit by default. The reason is that + <code class="module"><a href="../mod/prefork.html">prefork</a></code> is today only chosen, if you run processing engines that are not + prepared for multi-threading, e.g. will crash with more than one request.</p> + <p>If your setup can handle it, configuring <code class="module"><a href="../mod/event.html">event</a></code> mpm is nowadays + the best one (if supported on your platform).</p> + <p>If you are really stuck with <code class="module"><a href="../mod/prefork.html">prefork</a></code> and want multiple requests, + you can tweak the <code class="directive"><a href="../mod/mod_http2.html#h2minworkers">H2MinWorkers</a></code> to make + that possible. If it breaks, however, you own both parts.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="clients" id="clients">Clients</a></h2> + + <p>Almost all modern browsers support HTTP/2, but only over SSL connections: Firefox (v43), + Chrome (v45), Safari (since v9), iOS Safari (v9), Opera (v35), Chrome for Android (v49) + and Internet Explorer (v11 on Windows10) (<a href="http://caniuse.com/#search=http2">source</a>).</p> + <p>Other clients, as well as servers, are listed + <a href="https://github.com/http2/http2-spec/wiki/Implementations">on the Implementations wiki</a>, + among them implementations for c, c++, common lisp, dart, erlang, haskell, java, nodejs, php, + python, perl, ruby, rust, scala and swift.</p> + <p>Several of the non-browser client implementations support HTTP/2 over cleartext, h2c. The + most versatile being <a href="https://curl.haxx.se">curl</a>.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="tools" id="tools">Useful tools to debug HTTP/2</a></h2> + + <p>The first tool to mention is of course <a href="https://curl.haxx.se">curl</a>. Please make sure that + your version supports HTTP/2 checking its <code>Features</code>:</p> + <pre class="prettyprint lang-config"> $ curl -V + curl 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4 + Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 [...] + Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP <strong>HTTP2</strong> + </pre> + + <div class="note"><h3>Mac OS homebrew notes</h3> + brew install curl --with-openssl --with-nghttp2 + </div> + <p>And for really deep inspection <a href="https://wiki.wireshark.org/HTTP2">wireshark</a>.</p> + <p>The <a href="https://nghttp2.org">nghttp2</a> package also includes clients, such as:</p> + <ul> + <li><a href="https://nghttp2.org/documentation/nghttp.1.html">nghttp</a> - useful to visualize the HTTP/2 frames and get a better idea of the protocol.</li> + <li><a href="https://nghttp2.org/documentation/h2load-howto.html">h2load</a> - useful to stress-test your server.</li> + </ul> + <p>Chrome offers detailed HTTP/2 logs on its connections via the + <a href="chrome://net-internals/#http2">special net-internals page</a>. There is also an + interesting extension for <a href="https://chrome.google.com/webstore/detail/http2-and-spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin?hl=en">Chrome</a> + and <a href="https://addons.mozilla.org/en-us/firefox/addon/spdy-indicator/">Firefox</a> + to visualize when your browser is using HTTP/2.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="push" id="push">Server Push</a></h2> + + <p>The HTTP/2 protocol allows the server to PUSH responses to a client it never + asked for. The tone of the conversation is: "here is a request that you + never sent and the response to it will arrive soon..."</p> + <p>But there are restrictions: the client can disable this feature and the + server may only ever PUSH on a request that came from the client.</p> + <p>The intention is to allow the server to send resources to the client that + it will most likely need: a css or javascript resource that belongs to a html + page the client requested. A set of images that is referenced by a css, etc.</p> + <p>The advantage for the client is that it saves the time to send the request which + may range from a few milliseconds to half a second, depending on where on the + globe both are located. The disadvantage is that the client may get sent + things it already has in its cache. Sure, HTTP/2 allows for the early cancellation + of such requests, but still there are resources wasted.</p> + <p>To summarize: there is no one good strategy on how to make best use of this + feature of HTTP/2 and everyone is still experimenting. So, how do you experiment + with it in Apache httpd?</p> + <p><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> inspect response header for <code>Link</code> headers + in a certain format:</p> + <pre class="prettyprint lang-config">Link </xxx.css>;rel=preload, </xxx.js>; rel=preload</pre> + + <p>If the connection supports PUSH, these two resources will be sent to the + client. As a web developer, you may set these headers either directly in + your application response or you configure the server via</p> + <pre class="prettyprint lang-config"><Location /xxx.html> + Header add Link "</xxx.css>;rel=preload" + Header add Link "</xxx.js>;rel=preload" +</Location></pre> + + <p>If you want to use <code>preload</code> links without triggering a PUSH, you + can use the <code>nopush</code> parameter, as in</p> + <pre class="prettyprint lang-config">Link </xxx.css>;rel=preload;nopush</pre> + + <p>or you may disable PUSHes for your server entirely with the directive</p> + <pre class="prettyprint lang-config">H2Push Off</pre> + + <p>And there is more:</p> + <p>The module will keep a diary of what has been PUSHed for each connection + (hashes of URLs, basically) and will not PUSH the same resource twice. When + the connection closes, this information is discarded.</p> + <p>There are people thinking about how a client can tell a server what it + already has, so PUSHes for those things can be avoided, but this is all + highly experimental right now.</p> + <p>Another experimental draft that has been implemented in <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> + is the <a href="https://tools.ietf.org/html/draft-ruellan-http-accept-push-policy-00"> + Accept-Push-Policy Header Field</a> where a client can, for each request, define + what kind of PUSHes it accepts.</p> + <p> + PUSH might not always trigger the request/response/performance that one expects or + hopes for. There are various studies on this topic to be found on the web that explain + benefits and weaknesses and how different features of client and network influence + the outcome. For example: just because the server PUSHes a resource does not mean + a browser will actually use the data.</p> + <p>The major thing that influences the response being PUSHed is the request that was + simulated. The request URL for a PUSH is given by the application, but where do the + request headers come from? For example, will the PUSH request a <code>accept-language</code> + header and if yes with what value?</p> + <p>Apache will look at the original request (the one that triggered the PUSH) and copy the + following headers over to PUSH requests: <code>user-agent</code>, <code>accept</code>, + <code>accept-encoding</code>, <code>accept-language</code>, <code>cache-control</code>.</p> + <p>All other headers are ignored. Cookies will also not be copied over. PUSHing resources + that require a cookie to be present will not work. This can be a matter of debate. But + unless this is more clearly discussed with browser, let's err on the side of caution and + not expose cookie where they might ordinarily not be visible.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="earlyhints" id="earlyhints">Early Hints</a></h2> + + <p>An alternative to PUSHing resources is to send <code>Link</code> headers to the + client before the response is even ready. This uses the HTTP feature called "Early Hints" and + is described in <a href="https://tools.ietf.org/html/rfc8297">RFC 8297</a>.</p> + <p>In order to use this, you need to explicitly enable it on the server via</p> + <pre class="prettyprint lang-config">H2EarlyHints on</pre> + + <p>(It is not enabled by default since some older browser tripped on such responses.)</p> + <p>If this feature is on, you can use the directive <code class="directive"><a href="../mod/mod_http2.html#h2pushresource">H2PushResource</a></code> to + trigger early hints and resource PUSHes:</p> + <pre class="prettyprint lang-config"><Location /xxx.html> + H2PushResource /xxx.css + H2PushResource /xxx.js +</Location></pre> + + <p>This will send out a <code>"103 Early Hints"</code> response to a client as soon + as the server <em>starts</em> processing the request. This may be much early than + the time the first response headers have been determined, depending on your web + application.</p> + <p>If <code class="directive"><a href="../mod/mod_http2.html#h2push">H2Push</a></code> is enabled, this will also start the PUSH right after the + 103 response. If <code class="directive"><a href="../mod/mod_http2.html#h2push">H2Push</a></code> is disabled however, the 103 response will be send + nevertheless to the client.</p> + </div></div> +<div class="bottomlang"> +<p><span>Available Languages: </span><a href="../en/howto/http2.html" title="English"> en </a> | +<a href="../es/howto/http2.html" hreflang="es" rel="alternate" title="Español"> es </a> | +<a href="../fr/howto/http2.html" hreflang="fr" rel="alternate" title="Français"> fr </a></p> +</div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comments</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our <a href="https://httpd.apache.org/lists.html">mailing lists</a>.</div> +<script type="text/javascript"><!--//--><![CDATA[//><!-- +var comments_shortname = 'httpd'; +var comments_identifier = 'http://httpd.apache.org/docs/2.4/howto/http2.html'; +(function(w, d) { + if (w.location.hostname.toLowerCase() == "httpd.apache.org") { + d.write('<div id="comments_thread"><\/div>'); + var s = d.createElement('script'); + s.type = 'text/javascript'; + s.async = true; + s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier; + (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s); + } + else { + d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>'); + } +})(window, document); +//--><!]]></script></div><div id="footer"> +<p class="apache">Copyright 2023 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p> +<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!-- +if (typeof(prettyPrint) !== 'undefined') { + prettyPrint(); +} +//--><!]]></script> +</body></html>
\ No newline at end of file diff --git a/docs/manual/howto/http2.html.es b/docs/manual/howto/http2.html.es new file mode 100644 index 0000000..81fd4b3 --- /dev/null +++ b/docs/manual/howto/http2.html.es @@ -0,0 +1,421 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"><head> +<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" /> +<!-- + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + This file is generated from xml source: DO NOT EDIT + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + --> +<title>Guía HTTP/2 - Servidor HTTP Apache Versión 2.4</title> +<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" /> +<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" /> +<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" /> +<script src="../style/scripts/prettify.min.js" type="text/javascript"> +</script> + +<link href="../images/favicon.ico" rel="shortcut icon" /></head> +<body id="manual-page"><div id="page-header"> +<p class="menu"><a href="../mod/">Módulos</a> | <a href="../mod/directives.html">Directivas</a> | <a href="http://wiki.apache.org/httpd/FAQ">Preguntas Frecuentes</a> | <a href="../glossary.html">Glosario</a> | <a href="../sitemap.html">Mapa del sitio web</a></p> +<p class="apache">Versión 2.4 del Servidor HTTP Apache</p> +<img alt="" src="../images/feather.png" /></div> +<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div> +<div id="path"> +<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">Servidor HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentación</a> > <a href="../">Versión 2.4</a> > <a href="./">How-To / Tutoriales</a></div><div id="page-content"><div id="preamble"><h1>Guía HTTP/2</h1> +<div class="toplang"> +<p><span>Idiomas disponibles: </span><a href="../en/howto/http2.html" hreflang="en" rel="alternate" title="English"> en </a> | +<a href="../es/howto/http2.html" title="Español"> es </a> | +<a href="../fr/howto/http2.html" hreflang="fr" rel="alternate" title="Français"> fr </a></p> +</div> +<div class="outofdate">Esta traducción podría estar + obsoleta. Consulte la versión en inglés de la + documentación para comprobar si se han producido cambios + recientemente.</div> + + <p> + Esta es la guía para configurar HTTP/2 en Apache httpd. Ésta característica + está <em>lista en produción</em> así que es de esperar que las interfaces + y las directivas se mantengan consistentes en cada verión. + </p> + </div> +<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#protocol">El protocolo HTTP/2</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#implementation">HTTP/2 en Apache httpd</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#building">Compilar httpd con soporte HTTP/2</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#basic-config">Configuración básica</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#mpm-config">Configuración MPM</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#clients">Clientes</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#tools">Herramientas útiles para depurar HTTP/2</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#push">Server Push</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#earlyhints">"Early Hints"</a></li> +</ul><h3>Consulte también</h3><ul class="seealso"><li><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code></li><li><a href="#comments_section">Comentarios</a></li></ul></div> +<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="protocol" id="protocol">El protocolo HTTP/2</a></h2> + + + <p>HTTP/2 es la evolución del protocolo de la capa de aplicación con más + éxito, HTTP. Se centra en hacer un uso más eficiente de los recursos de red. + No cambia la característica fundamental de HTTP, la semántica. Todavía hay + olicitudes, respuestas, cabeceras y todo los elementos típicos de HTTP/1. Así + que, si ya conoce HTTP/1, también conoce el 95% de HTTP/2.</p> + + <p>Se ha escrito mucho sobre HTTP/2 y de cómo funciona. La norma más + estándar es, por supuesto, su + <a href="https://tools.ietf.org/html/rfc7540">RFC 7540</a> + (<a href="http://httpwg.org/specs/rfc7540.html"> también disponible en un + formato más legible, YMMV</a>). Así que, ahí encontrará toda la especificación + del protocolo.</p> + + <p>Pero, como con todos los RFC, no es ideal como primera lectura. Es mejor + entender primero <em>qué</em> se quiere hacer y después leer el RFC sobre + <em>cómo</em> hacerlo. Un documento mucho mejor con el que empezar es + <a href="https://daniel.haxx.se/http2/">http2 explicado</a> + por Daniel Stenberg, el autor de <a href="https://curl.haxx.se">curl</a>. + ¡También está disponible cada vez en un mayor número lenguajes!</p> + + <p>Si le parece demasiado largo, o no lo ha leido, hay algunos términos + y elementos a tener en cuenta cuando lea este documento:</p> + <ul> + <li>HTTP/2 es un <strong>protocolo binario</strong>, al contrario que + HTTP 1.1 que es texto plano. La intención para HTTP 1.1 es que sea + legible (por ejemplo capturando el tráfico de red) mientras que para + HTTP/2 no. Más información en el FAQ oficial + <a href="https://http2.github.io/faq/#why-is-http2-binary">¿Por qué es + binario HTTP/2?</a></li> + + <li><strong>h2</strong> es HTTP/2 sobre TLS (negociación de protocolo a + través de ALPN).</li> + + <li><strong>h2c</strong> es HTTP/2 sobre TCP.</li> + + <li>Un <strong>frame</strong> es la unidad más pequeña de comunicación + dentro de una conexión HTTP/2, que consiste en una cabecera y una secuencia + de octetos de longitud variable estructurada de acuerdo con el tipo de + frame. Más información en la documentación oficial + <a href="http://httpwg.org/specs/rfc7540.html#FramingLayer">Sección de + Capa de Frame</a>.</li> + + <li>Un <strong>stream</strong> es un flujo bidireccional de frames dentro + de una conexión HTTP/2. El concepto correspondiente en HTTP 1.1 es un + intercambio de mensajes de solicitud/respuesta. Más información en la + documentación oficial + <a href="http://httpwg.org/specs/rfc7540.html#StreamsLayer">Sección Capa + de Stream</a>.</li> + + <li> + HTTP/2 es capaz de llevar <strong>múltiples streams</strong> de datos + sobre la misma conexión TCP, evitando la clásica solicitud lenta + "head-of-line blocking" de HTTP 1.1 y evitando generar múltiples conexiones + TCP para cada solicitud/respuesta (KeepAlive parcheó el problema en + HTTP 1.1 pero no lo resolvió completamente). + </li> + </ul> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="implementation" id="implementation">HTTP/2 en Apache httpd</a></h2> + + + <p> + El protocolo HTTP/2 se implementa con su propio módulo httpd, llamado + acertadamente <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code>. Incluye el set completo de + características descritas por el RFC 7540 y soporta HTTP/2 sobre texto + plano (http:), así como conexiones seguras (https:). La variante de texto + plano se llama '<code>h2c</code>', la segura '<code>h2</code>'. Para + <code>h2c</code> permite el modo <em>direct</em> + y el <code>Upgrade:</code> a través de una solicitud inicial HTTP/1. + </p> + + <p> + Una característica de HTTP/2 que ofrece capacidades nuevas para + desarrolladores de web es <a href="#push">Server Push</a>. Vea esa sección + para saber como su aplicación web puede hacer uso de ella. + </p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="building" id="building">Compilar httpd con soporte HTTP/2</a></h2> + + + <p> + <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> usa la librería <a href="https://nghttp2.org"> + nghttp2</a>como su implementación base. Para compilar + <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> necesita al menos la versión 1.2.1 de + <code>libnghttp2</code> instalada en su sistema. + </p> + + <p> + Cuando usted ejecuta <code>./configure</code> en el código fuente de + Apache HTTPD, necesita indicarle '<code>--enable-http2</code>' como una + opción adicional para activar la compilación de este módulo. Si su + <code>libnghttp2</code> está ubicado en una ruta no habitual (cualquiera que + sea en su sistema operativo), puede indicar su ubicación con + '<code>--with-nghttp2=<path></code>' para <code>./configure</code>. + </p> + + <p>Aunque puede que eso sirva para la mayoría, habrá quien prefiera un <code>nghttp2</code> compilado estáticamente para este módulo. Para ellos existe la opción <code>--enable-nghttp2-staticlib-deps</code>. Funciona de manera muy similar a como uno debe enlazar openssl estáticamente para <code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code>.</p> + + <p>Hablando de SSL, necesita estar al tanto de que la mayoría de los navegadores hablan HTTP/2 solo con URLs <code>https:</code>. Así que necesita un servidor con soporte SSL. Pero no solo eso, necesitará una librería SSL que de soporte a la extensión <code>ALPN</code>. Si usa OpenSSL, necesita al menos la versión 1.0.2.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="basic-config" id="basic-config">Configuración básica</a></h2> + + + <p>Cuando tiene un <code>httpd</code> compilado con <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> necesita una configuración básica para activarlo. Lo primero, como con cualquier otro módulo de Apache, es que necesita cargarlo:</p> + + <pre class="prettyprint lang-config">LoadModule http2_module modules/mod_http2.so</pre> + + + <p>La segunda directiva que necesita añadir a la configuración de su servidor es:</p> + + <pre class="prettyprint lang-config">Protocols h2 http/1.1</pre> + + + <p>Esto permite h2, la variante segura, para ser el protocolo preferido de las conexiones en su servidor. Cuando quiera habilitar todas las variantes de HTTP/2, entonces simplemente configure:</p> + + <pre class="prettyprint lang-config">Protocols h2 h2c http/1.1</pre> + + + <p>Dependiendo de dónde pone esta directiva, afecta a todas las conexiones o solo a las de ciertos host virtuales. La puede anidar, como en:</p> + + <pre class="prettyprint lang-config">Protocols http/1.1 +<VirtualHost ...> + ServerName test.example.org + Protocols h2 http/1.1 +</VirtualHost></pre> + + + <p>Esto solo permite HTTP/1, excepto conexiones SSL hacia <code>test.example.org</code> que ofrecen HTTP/2.</p> + + <div class="note"><h3>Escoger un SSLCipherSuite seguro</h3> + <p>Es necesario configurar <code class="directive"><a href="../mod/mod_ssl.html#sslciphersuite">SSLCipherSuite</a></code> con una suite segura de cifrado TLS. La versión actual de mod_http2 no fuerza ningún cifrado pero la mayoría de los clientes si lo hacen. Encaminar un navegador hacia un servidor con <code>h2</code> activado con una suite inapropiada de cifrados forzará al navegador a rehusar e intentar conectar por HTTP 1.1. Esto es un error común cuando se configura httpd con HTTP/2 por primera vez, ¡así que por favor tenga en cuenta que debe evitar largas sesiones de depuración! Si quiere estar seguro de la suite de cifrados que escoja, por favor evite los listados en la <a href="http://httpwg.org/specs/rfc7540.html#BadCipherSuites">Lista Negra de TLS para HTTP/2</a>.</p> + </div> + + <p>El orden de los protocolos mencionados también es relevante. Por defecto, el primero es el protocolo preferido. Cuando un cliente ofrece múltiples opciones, la que esté más a la izquierda será la escogida. En</p> + <pre class="prettyprint lang-config">Protocols http/1.1 h2</pre> + + + <p>el protocolo preferido es HTTP/1 y siempre será seleccionado a menos que el cliente <em>sólo</em> soporte h2. Puesto que queremos hablar HTTP/2 con clientes que lo soporten, el orden correcto es:</p> + + <pre class="prettyprint lang-config">Protocols h2 h2c http/1.1</pre> + + + <p>Hay algo más respecto al orden: el cliente también tiene sus propias preferencias. Si quiere, puede configurar su servidor para seleccionar el protocolo preferido por el cliente:</p> + + <pre class="prettyprint lang-config">ProtocolsHonorOrder Off</pre> + + + <p>Hace que el orden en que <em>usted</em> escribió los Protocols sea irrelevante y sólo el orden de preferencia del cliente será decisorio.</p> + + <p>Una última cosa: cuando usted configura los protocolos no se comprueba si son correctos o están bien escritos. Puede mencionar protocolos que no existen, así que no hay necesidad de proteger <code class="directive"><a href="../mod/core.html#protocols">Protocols</a></code> con ningún <code class="directive"><a href="../mod/core.html#ifmodule"><IfModule></a></code> de comprobación.</p> + + <p>Para más consejos avanzados de configuración, vea la <a href="../mod/mod_http2.html#dimensioning"> + sección de módulos sobre dimensionamiento</a> y <a href="../mod/mod_http2.html#misdirected"> + como gestionar multiples hosts con el mismo certificado</a>.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="mpm-config" id="mpm-config">Configuración MPM</a></h2> + + + <p>HTTP/2 está soportado en todos los módulos de multi-proceso que se ofrecen con httpd. Aun así, si usa el mpm <code class="module"><a href="../mod/prefork.html">prefork</a></code>, habrá restricciones severas.</p> + + <p>En <code class="module"><a href="../mod/prefork.html">prefork</a></code>, <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> solo procesará una solicitud cada vez por conexión. Pero los clientes, como los navegadores, enviarán muchas solicitudes al mismo tiempo. Si una de ellas tarda mucho en procesarse (o hace un sondeo que dura más de la cuenta), las otras solicitudes se quedarán atascadas.</p> + + <p><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> no evitará este límite por defecto. El motivo es que <code class="module"><a href="../mod/prefork.html">prefork</a></code> hoy en día solo se escoge si ejecuta motores de proceso que no están preparados para multi-hilo, p.ej. fallará con más de una solicitud.</p> + + <p>Si su configuración lo soporta, hoy en día <code class="module"><a href="../mod/event.html">event</a></code> es el mejor mpm que puede usar.</p> + + <p>Si realmente está obligado a usar <code class="module"><a href="../mod/prefork.html">prefork</a></code> y quiere multiples solicitudes, puede configurar la directiva <code class="directive"><a href="../mod/mod_http2.html#h2minworkers">H2MinWorkers</a></code> para hacerlo posible. Sin embargo, si esto falla, es bajo su cuenta y riesgo.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="clients" id="clients">Clientes</a></h2> + + + <p>Casi todos los navegadores modernos dan soporte a HTTP/2, pero solo en conexiones SSL: Firefox (v43), Chrome (v45), Safari (since v9), iOS Safari (v9), Opera (v35), Chrome para Android (v49) e Internet Explorer (v11 en Windows10) (<a href="http://caniuse.com/#search=http2">Fuente</a>).</p> + + <p>Otros clientes, así cómo otros servidores, están listados en la + <a href="https://github.com/http2/http2-spec/wiki/Implementations">wiki de Implementaciones</a>, entre ellos, implementaciones para c, c++, common lisp, dart, erlang, haskell, java, nodejs, php, python, perl, ruby, rust, scala y swift.</p> + + <p>Muchos de las implementaciones de clientes que no son navegadores soportan HTTP/2 sobre texto plano, h2c. La más versátil es <a href="https://curl.haxx.se">curl</a>.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="tools" id="tools">Herramientas útiles para depurar HTTP/2</a></h2> + + + <p>La primera herramienta a mencionar es por supuesto <a href="https://curl.haxx.se">curl</a>. Por favor asegúrese de que su versión soporta HTTP/2 comprobando sus <code>Características</code>:</p> + <pre class="prettyprint lang-config"> $ curl -V + curl 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4 + Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 [...] + Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP <strong>HTTP2</strong> + </pre> + + <div class="note"><h3>Notas sobre Mac OS homebrew</h3> + brew install curl --with-openssl --with-nghttp2 + </div> + <p>Y para una inspección en gran profundidad <a href="https://wiki.wireshark.org/HTTP2">wireshark</a>.</p> + <p>El paquete <a href="https://nghttp2.org">nghttp2</a> también incluye clientes, tales como:</p> + <ul> + <li><a href="https://nghttp2.org/documentation/nghttp.1.html">nghttp + </a> - util para visualizar la frames de HTTP/2 y tener una mejor idea de como funciona el protocolo.</li> + <li><a href="https://nghttp2.org/documentation/h2load-howto.html">h2load</a> - útil para hacer un stress-test de su servidor.</li> + </ul> + + <p>Chrome ofrece logs detallados de HTTP/2 en sus conexiones a través de la <a href="chrome://net-internals/#http2">página especial de net-internals</a>. También hay una extensión interesante para <a href="https://chrome.google.com/webstore/detail/http2-and-spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin?hl=en">Chrome</a> y <a href="https://addons.mozilla.org/en-us/firefox/addon/spdy-indicator/">Firefox</a> con la que visualizar cuando su navegador usa HTTP/2.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="push" id="push">Server Push</a></h2> + + + <p>El protocolo HTTP/2 permite al servidor hacer PUSH de respuestas a un cliente que nunca las solicitó. El tono de la conversación es: "Aquí tiene una solicitud que nunca envió y la respuesta llegará pronto..."</p> + + <p>Pero hay restricciones: el cliente puede deshabilitar esta característica y el servidor entonces solo podrá hacer PUSH en una solicitud que hizo previamente del cliente.</p> + + <p>La intención es permitir al servidor enviar recursos que el cliente seguramente vaya a necesitar, p. ej. un recurso css o javascript que pertenece a una página html que el cliente solicitó, un grupo de imágenes a las que se hace referencia en un css, etc.</p> + + <p>La ventaja para el cliente es que ahorra tiempo para solicitudes que pueden tardar desde unos pocos milisegundos a medio segundo, dependiendo de la distancia entre el cliente y el servidor. La desventaja es que el cliente puede recibir cosas que ya tiene en su cache. Por supuesto que HTTP/2 soporta cancelación previa de tales solicitudes, pero aun así se malgastan recursos.</p> + + <p>Resumiendo: no hay una estrategia mejor sobre cómo usar esta característica de HTTP/2 y todo el mundo está experimentando con ella. Así que, ¿cómo experimenta usted con ella en Apache httpd?</p> + + <p><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> busca e inspecciona las cabeceras de respuesta + <code>Link</code> con cierto formato:</p> + + <pre class="prettyprint lang-config">Link </xxx.css>;rel=preload, </xxx.js>; rel=preload</pre> + + + <p> + Si la conexión soporta PUSH, estos dos recursos se enviarán al cliente. + Como desarrollador web, puede configurar estas cabeceras o bien + directamente en la respuesta de su aplicación o configurar su servidor con: + </p> + + <pre class="prettyprint lang-config"><Location /xxx.html> + Header add Link "</xxx.css>;rel=preload" + Header add Link "</xxx.js>;rel=preload" +</Location></pre> + + + <p>Si quiere usar enlaces con <code>preload</code> sin activar un PUSH, puede + usar el parámetro <code>nopush</code>, como en:</p> + + <pre class="prettyprint lang-config">Link </xxx.css>;rel=preload;nopush</pre> + + + <p>o puede desactivar PUSH para su servidor por completo con la directiva </p> + + <pre class="prettyprint lang-config">H2Push Off</pre> + + + <p>Y hay más:</p> + + <p> + El módulo mantiene un registro de lo que se ha enviado con PUSH para cada + conexión (hashes de URLs, básicamente) y no hará PUSH del mismo recurso dos + veces. Cuando la conexión se cierra, la información es descartada. + </p> + + <p> + Hay gente pensando cómo un cliente puede decirle al servidor lo que ya + tiene, para evitar los PUSH de esos elementos, pero eso algo muy + experimental ahora mismo. + </p> + + <p>Otro borrador experimental que ha sido implementado en + <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> es el <a href="https://tools.ietf.org/html/draft-ruellan-http-accept-push-policy-00"> Campo de Cabecera + Accept-Push-Policy</a> en la que un cliente puede, para cada solicitud, definir + qué tipo de PUSH acepta.</p> + + <p> + Puede que PUSH no siempre lance la peticion/respuesta/funcionamiento que + uno espera. Hay varios estudios sobre este tema en internet, que explican + el beneficio y las debilidades de como diferentes funcionalidades del + cliente y de la red influyen en el resultado. + Por Ejemplo, que un servidor haga "PUSH" de recursos, no significa que el + navegador vaya a usar dichos datos. + </p> + <p> + Lo más importante que influye en la respuesta que se envía, es la solicitud + que se simuló. La url de solicitud de un PUSH es dada por la aplicación, + pero ¿de donde vienen las cabeceras de la petición? por ejemplo si el PUSH + pide una cabecera <code>accept-language</code> y si es así, ¿con qué valor? + </p> + <p>Httpd mirará la petición original (la que originó el PUSH) y copiará las + siguientes cabeceras a las peticiones PUSH: + <code>user-agent</code>, <code>accept</code>, <code>accept-encoding</code>, + <code>accept-language</code>, <code>cache-control</code>. + </p> + <p> + Todas las otras cabeceras son ignorados. Las cookies tampoco serán copiadas. + Impulsar los recursos que requieren una cookie para estar presente no + funcionará. Esto puede ser una cuestión de debate. Pero a menos que esto se + discuta más claramente con el navegador, evitemos el exceso de precaución y + no expongamos las cookies donde podrían o no ser visibles. + </p> + +</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="earlyhints" id="earlyhints">"Early Hints"</a></h2> + + + <p>Una alternativa de "Pushear" recursos es mandar una cabecera + <code>Link</code> al cliente antes que la respuesta esté lista. Esto usa + una caracteristica de HTTP que se llama "Early Hints" y está descrita en + la <a href="https://tools.ietf.org/html/rfc8297">RFC 8297</a>.</p> + <p>Para poder usar esto, necesita habilitarlo explicitamente en el servidor + via</p> + + <pre class="prettyprint lang-config">H2EarlyHints on</pre> + + + <p>(No está habilitado por defecto ya q ue algunos navegadores más antiguos + se caen con dichas respuestas.) + </p> + + <p>si esta funcionalidad esta activada, puede usar la directiva + <code class="directive"><a href="../mod/mod_http2.html#h2pushresource">H2PushResource</a></code> para que lance + "Early hints" y recursos mediante push: + </p> + <pre class="prettyprint lang-config"><Location /xxx.html> + H2PushResource /xxx.css + H2PushResource /xxx.js +</Location></pre> + + <p> + Esto lanzará una respuesta <code>"103 Early Hints"</code> a un cliente + tan pronto como el servidor <em>comience</em> a procesar la solicitud. + Esto puede ser mucho antes que en el momento en que se determinaron los + primeros encabezados de respuesta, dependiendo de su aplicación web. + </p> + + <p> + Si la directiva <code class="directive"><a href="../mod/mod_http2.html#h2push">H2Push</a></code> está + habilitada, esto comenzará el PUSH justo después de la respuesta 103. + Sin embargo, si la directiva <code class="directive"><a href="../mod/mod_http2.html#h2push">H2Push</a></code> está dehabilitada, la respuesta 103 se le enviará al cliente. + </p> + </div></div> +<div class="bottomlang"> +<p><span>Idiomas disponibles: </span><a href="../en/howto/http2.html" hreflang="en" rel="alternate" title="English"> en </a> | +<a href="../es/howto/http2.html" title="Español"> es </a> | +<a href="../fr/howto/http2.html" hreflang="fr" rel="alternate" title="Français"> fr </a></p> +</div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comentarios</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our <a href="https://httpd.apache.org/lists.html">mailing lists</a>.</div> +<script type="text/javascript"><!--//--><![CDATA[//><!-- +var comments_shortname = 'httpd'; +var comments_identifier = 'http://httpd.apache.org/docs/2.4/howto/http2.html'; +(function(w, d) { + if (w.location.hostname.toLowerCase() == "httpd.apache.org") { + d.write('<div id="comments_thread"><\/div>'); + var s = d.createElement('script'); + s.type = 'text/javascript'; + s.async = true; + s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier; + (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s); + } + else { + d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>'); + } +})(window, document); +//--><!]]></script></div><div id="footer"> +<p class="apache">Copyright 2023 The Apache Software Foundation.<br />Licencia bajo los términos de la <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p> +<p class="menu"><a href="../mod/">Módulos</a> | <a href="../mod/directives.html">Directivas</a> | <a href="http://wiki.apache.org/httpd/FAQ">Preguntas Frecuentes</a> | <a href="../glossary.html">Glosario</a> | <a href="../sitemap.html">Mapa del sitio web</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!-- +if (typeof(prettyPrint) !== 'undefined') { + prettyPrint(); +} +//--><!]]></script> +</body></html>
\ No newline at end of file diff --git a/docs/manual/howto/http2.html.fr.utf8 b/docs/manual/howto/http2.html.fr.utf8 new file mode 100644 index 0000000..9694f09 --- /dev/null +++ b/docs/manual/howto/http2.html.fr.utf8 @@ -0,0 +1,429 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head> +<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> +<!-- + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + This file is generated from xml source: DO NOT EDIT + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + --> +<title>Guide HTTP/2 - Serveur HTTP Apache Version 2.4</title> +<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" /> +<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" /> +<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" /> +<script src="../style/scripts/prettify.min.js" type="text/javascript"> +</script> + +<link href="../images/favicon.ico" rel="shortcut icon" /></head> +<body id="manual-page"><div id="page-header"> +<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p> +<p class="apache">Serveur HTTP Apache Version 2.4</p> +<img alt="" src="../images/feather.png" /></div> +<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div> +<div id="path"> +<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">Serveur HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.4</a> > <a href="./">How-To / Tutoriels</a></div><div id="page-content"><div id="preamble"><h1>Guide HTTP/2</h1> +<div class="toplang"> +<p><span>Langues Disponibles: </span><a href="../en/howto/http2.html" hreflang="en" rel="alternate" title="English"> en </a> | +<a href="../es/howto/http2.html" hreflang="es" rel="alternate" title="Español"> es </a> | +<a href="../fr/howto/http2.html" title="Français"> fr </a></p> +</div> + + <p>Ce document est le guide de l'utilisateur de l'implémentation de HTTP/2 + dans Apache httpd. Cette fonctionnalité en est au stade + <em>de production</em>, et les interfaces et directives devraient donc être + dorénavant relativement stables. + </p> + </div> +<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#protocol">Le protocole HTTP/2</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#implementation">HTTP/2 dans Apache httpd</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#building">Compilation de httpd avec le support de HTTP/2</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#basic-config">Configuration de base</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#mpm-config">Configuration du MPM</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#clients">Clients</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#tools">Outils efficaces pour déboguer HTTP/2</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#push">Push serveur</a></li> +<li><img alt="" src="../images/down.gif" /> <a href="#earlyhints">Suggestions précoces</a></li> +</ul><h3>Voir aussi</h3><ul class="seealso"><li><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code></li><li><a href="#comments_section">Commentaires</a></li></ul></div> +<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="protocol" id="protocol">Le protocole HTTP/2</a></h2> + + <p>HTTP/2 est une évolution du protocole de la couche application le plus + utilisé au monde, HTTP. Cette évolution permet en particulier une utilisation + plus efficace des ressources réseau. Il ne modifie pas les aspects + fondamentaux de HTTP (sa sémantique). Entre autres, il y a toujours des + requêtes, des réponses et des en-têtes. Par conséquent, si vous connaissez + HTTP/1, vous connaissez déjà 95% de HTTP/2.</p> + <p>Beaucoup a déjà été écrit à propos de HTTP/2 et de son fonctionnement. La + documentation la plus officielle est bien entendu sa <a href="https://tools.ietf.org/html/rfc7540">RFC 7540</a> (ou <a href="http://httpwg.org/specs/rfc7540.html">cette version au format plus + lisible</a>). Vous trouverez ici une description des rouages de HTTP/2 dans + leurs moindres détails.</p> + <p>Le premier document à lire lorsqu'on ne connaît pas un mécanisme n'est + cependant pas sa RFC. Il est préférable de comprendre tout d'abord <em>ce + que</em> ce mécanisme est censé faire, et seulement ensuite de lire sa RFC + pour comprendre <em>comment</em> il fonctionne. <a href="https://daniel.haxx.se/http2/">http2 explained</a> de Daniel Stenberg + (l'auteur de <a href="https://curl.haxx.se">curl</a>) + est un bien meilleur document pour démarrer l'étude de HTTP/2. En outre, de + nouveaux langages s'ajoutent régulièrement à sa liste de traductions + disponibles !</p> + <p>Si vous n'avez pas envie de le lire parce que vous le trouvez trop long, + voici certains pièges à éviter et nouveaux termes à connaître avant de lire + ce document :</p> + <ul> + <li>A la différence de HTTP/1 qui est en texte pur, HTTP/2 est un + <strong>protocole binaire</strong>, et alors que le premier est lisible par + un humain (par exemple pour sniffer le trafic réseau), le second ne + l'est pas. Voir la <a href="https://http2.github.io/faq/#why-is-http2-binary">FAQ + officielle</a> pour plus de détails.</li> + <li><strong>h2</strong> correspond à HTTP/2 sur TLS (négociation de + protocole via ALPN).</li> + <li><strong>h2c</strong> correspond à HTTP/2 sur TCP.</li> + <li>Une <strong>frame</strong> ou trame est la plus petite unité de + communication au sein d'une connexion HTTP/2 et comporte une en-tête et + une séquence d'octets de longueur variable dont la structure correspond + au type de trame. Voir la <a href="http://httpwg.org/specs/rfc7540.html#FramingLayer">section + correspondante</a> de la documentation officielle pour plus de + détails.</li> + <li>Un <strong>stream</strong> est un flux bidirectionnel de frames au + sein d'une connexion HTTP/2. La notion correspondante dans HTTP/1 est un + échange de messages de type requête et réponse. Voir la <a href="http://httpwg.org/specs/rfc7540.html#StreamsLayer">section + correspondante</a> de la documentation officielle pour plus de détails.</li> + <li>HTTP/2 peut gérer <strong>plusieurs streams</strong> de données sur + la même connexion TCP, ce qui permet d'éviter le point de blocage + classique de HTTP/1 pour les requêtes lentes, et de ne pas avoir à + ouvrir de nouvelles connexions TCP pour chaque requête/réponse (les + connexions persistantes ou KeepAlive avaient contourné le problème dans + HTTP/1 mais ne l'avaient pas entièrement résolu)</li> + </ul> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="implementation" id="implementation">HTTP/2 dans Apache httpd</a></h2> + + <p>Le protocole HTTP/2 est implémenté dans Apache httpd via un module + propre, pertinemment nommé <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code>. Ce + module implémente toutes les fonctionnalités décrites par la RFC 7540 et + supporte les connexions en texte pur (http:), ou sécurisées (https:). + La variante texte pur se nomme '<code>h2c</code>', et la variante sécurisée + '<code>h2</code>'. <code>h2c</code> peut être en mode <em>direct</em> ou + <code>Upgrade:</code> via une requête initiale en HTTP/1.</p> + <p><a href="#push">Server Push</a> est une nouvelle fonctionnalité offerte + aux développeurs web par HTTP/2. La section correspondante de ce document + vous indiquera comment votre application peut en tirer parti.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="building" id="building">Compilation de httpd avec le support de HTTP/2</a></h2> + + <p><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> se base sur la bibliothèque + de <a href="https://nghttp2.org">nghttp2</a> pour son implémentation. Pour + pouvoir compiler <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code>, <code>libnghttp2</code> version + 1.2.1. ou supérieure doit être installée dans votre système.</p> + <p>Pour déclencher la compilation de <code>mod_http2</code>, vous devez + ajouter l'argument '<code>--enable-http2</code>' au script + <code>./configure</code> que vous exécutez à la racine de l'arborescence des + sources de httpd. Si <code>libnghttp2</code> est installée dans un + répertoire non connu du chemin de vos bibliothèques, vous devez indiquer ce + répertoire au script <code>./configure</code> via l'argument + '<code>--with-nghttp2=<path></code>'.</p> + <p>Alors que cette méthode de compilation conviendra à la plupart, certains + préféreront lier statiquement <code>nghttp2</code> à ce module. Pour ce + faire, utilisez l'argument <code>--enable-nghttp2-staticlib-deps</code>. + Cette méthode est pratiquement la même que celle utilisée pour lier + statiquement openssl à <code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code>.</p> + <p>En parlant de SSL, vous devez savoir que la plupart des navigateurs ne + communiqueront en HTTP/2 que sur des URLs sécurisées de type + <code>https:</code> ; votre serveur doit donc supporter SSL. Mais de plus, + votre bibliothèque SSL devra supporter l'extension <code>ALPN</code>. Enfin, + si la bibliothèque que vous utilisez est OpenSSL, sa version devra être + 1.0.2. ou supérieure.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="basic-config" id="basic-config">Configuration de base</a></h2> + + + <p>Maintenant que vous disposez d'un binaire <code>httpd</code> compilé avec le + module <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code>, l'activation de ce dernier nécessite un + minimum de configuration supplémentaire. En premier lieu, comme pour tout + module Apache, vous devez le charger :</p> + <pre class="prettyprint lang-config">LoadModule http2_module modules/mod_http2.so</pre> + + + <p>La seconde directive que vous devez ajouter à votre fichier de + configuration est</p> + <pre class="prettyprint lang-config">Protocols h2 http/1.1</pre> + + <p>Ceci permet de définir h2, la variante sécurisée, comme le protocole + préféré pour les connexions à votre serveur. Si vous souhaitez que toutes les + variantes soient disponibles, utilisez la directive suivante :</p> + <pre class="prettyprint lang-config">Protocols h2 h2c http/1.1</pre> + + <p>Selon l'endroit où vous placez cette directive, elle affectera l'ensemble + de votre serveur, ou seulement un ou plusieurs serveurs virtuels. Vous + pouvez aussi l'imbriquer comme dans l'exemple suivant :</p> + <pre class="prettyprint lang-config">Protocols http/1.1 +<VirtualHost ...> + ServerName test.example.org + Protocols h2 http/1.1 +</VirtualHost></pre> + + + <p>Seules les connexions en HTTP/1 seront alors permises, sauf pour le serveur + virtuel <code>test.example.org</code> qui acceptera aussi les connexions SSL + en HTTP/2.</p> + <div class="note"><h3>Utilisez une chaîne d'algorithmes de chiffrement forte</h3> + <p>La directive <code class="directive"><a href="../mod/mod_ssl.html#sslciphersuite">SSLCipherSuite</a></code> doit + être définie avec une chaîne d'algorithmes de chiffrement TLS forte. Même si + la version actuelle de <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> n'impose pas d'algorithmes + de chiffrement particuliers, la plupart des clients le font. Faire pointer + un navigateur vers un serveur où <code>h2</code> est activé avec une chaîne + d'algorithmes de chiffrement inappropriée entraînera un rejet et une + retrogradation vers HTTP 1.1. C'est une erreur que l'on fait couramment + lorsqu'on configure httpd pour HTTP/2 pour la première fois ; donc gardez la + à l'esprit si vous voulez éviter de longues sessions de débogage ! Si vous + voulez être sûr de définir une chaîne d'algorithmes de chiffrement + appropriée, évitez ceux qui sont listés dans la <a href="http://httpwg.org/specs/rfc7540.html#BadCipherSuites"> </a>liste des + algorithmes de chiffrement TLS HTTP/2 à proscrire.</p> + </div> + <p>L'ordre des protocoles indiqués est aussi important. Par défaut, le + premier sera le protocole préféré. Lorsqu'un client offre plusieurs choix, + c'est le plus à gauche qui sera sélectionné. Dans</p> + <pre class="prettyprint lang-config">Protocols http/1.1 h2</pre> + + <p>le protocole préféré sera HTTP/1 et il sera toujours sélectionné sauf si + un client ne supporte <em>que</em> h2. Comme nous souhaitons communiquer en + HTTP/2 avec les clients qui le supportent, la meilleure définition de la + directive est</p> + <pre class="prettyprint lang-config">Protocols h2 h2c http/1.1</pre> + + + <p>Toujours à propos de l'ordre des protocoles, le client a lui aussi ses + propres préférences en la matière. À ce titre, si vous le souhaitez, vous + pouvez configurer votre serveur pour qu'il sélectionne non plus son + protocole préféré, mais au contraire le protocole préféré + du client :</p> + <pre class="prettyprint lang-config">ProtocolsHonorOrder Off</pre> + + <p>Avec cette directive, l'ordre des protocoles que <em>vous</em> avez + défini devient caduque et seul l'ordre défini par le client sera pris en + compte.</p> + <p>Une dernière chose : les protocoles que vous définissez ne sont pas + vérifiés quant à leurs validité ou orthographe. Vous pouvez très bien + définir des protocoles qui n'existent pas, et il n'est donc pas nécessaire + de filtrer le contenu de la directive <code class="directive"><a href="../mod/core.html#protocols">Protocols</a></code> avec des vérifications de type + <code class="directive"><a href="../mod/core.html#ifmodule"><IfModule></a></code>.</p> + <p>Pour des conseils plus avancés à propos de la configuration, voir la <a href="../mod/mod_http2.html">Documentation de mod_http2</a>, et en particulier + la section à propos de la <a href="../mod/mod_http2.html#dimensioning">consommation supplémentaire de + ressources</a>, ainsi que la section expliquant comment gérer les <a href="../mod/mod_http2.html#misdirected">serveurs multiples avec certificat + commun</a>.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="mpm-config" id="mpm-config">Configuration du MPM</a></h2> + + + <p>Tous les modules multiprocessus (MPM) fournis avec httpd supportent + HTTP/2. Cependant, si vous utilisez le MPM <code class="module"><a href="../mod/prefork.html">prefork</a></code>, vous allez + faire face à de sévères restrictions.</p> + <p>Avec le MPM <code class="module"><a href="../mod/prefork.html">prefork</a></code>, <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> ne traitera + qu'une requête à la fois par connexion alors que les clients tels que les + navigateurs internet envoient de nombreuses requêtes au même moment. Si + l'une d'entre elles est longue à traiter (ou implique une longue + interrogation), les autres requêtes seront mises en attente.</p> + <p>Par défaut, <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> ne passe pas outre cette limitation pour + la simple et bonne raison que le MPM <code class="module"><a href="../mod/prefork.html">prefork</a></code> n'est aujourd'hui + choisi que si vous exécutez des moteurs de traitement qui ne sont pas préparés + pour le multithreading (par exemple qui se crashent lorsque plusieurs + requêtes arrivent).</p> + <p>Si votre plateforme et votre installation de httpd le supportent, la + meilleur solution consiste actuellement à utiliser le MPM + <code class="module"><a href="../mod/event.html">event</a></code>. + </p> + <p>Si vous n'avez pas d'autre choix que d'utiliser le MPM + <code class="module"><a href="../mod/prefork.html">prefork</a></code>, mais souhaitez tout de même traiter plusieurs requêtes + simultanément, vous pouvez jouer avec la directive <code class="directive"><a href="../mod/mod_http2.html#h2minworkers">H2MinWorkers</a></code>, sans garantie que cela + fonctionne.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="clients" id="clients">Clients</a></h2> + + <p>La plupart des navigateurs modernes supportent HTTP/2, mais seulement sur + des connexions SSL : Firefox v43, Chrome v45, Safari v9, iOS Safari v9, + Opera v35, Chrome pour Android v49 et + Internet Explorer v11 sous Windows10 (selon cette <a href="http://caniuse.com/#search=http2">source</a>).</p> + <p>D'autres clients et serveurs sont listés dans le <a href="https://github.com/http2/http2-spec/wiki/Implementations">wiki des + implémentations</a> ; entre autres des implémentations pour c, c++, common + lisp, dart, erlang, haskell, java, nodejs, php, python, perl, ruby, rust, + scala et swift.</p> + <p>De nombreuses implémentations clientes autres que les navigateurs + supportent HTTP/2 en texte pur, h2c. L'une des plus efficaces d'entre elles + est <a href="https://curl.haxx.se">curl</a>.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="tools" id="tools">Outils efficaces pour déboguer HTTP/2</a></h2> + + <p>Le premier d'entre eux est bien entendu <a href="https://curl.haxx.se">curl</a>. Assurez-vous au préalable que votre + version supporte HTTP/2 en vérifiant ses <code>Fonctionnalités</code> :</p> + <pre class="prettyprint lang-config"> $ curl -V + curl 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4 + Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 [...] + Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP <strong>HTTP2</strong> + </pre> + + <div class="note"><h3>homebrew sous Mac OS :</h3> + brew install curl --with-openssl --with-nghttp2 + </div> + <p>Pour une inspection en profondeur : <a href="https://wiki.wireshark.org/HTTP2">wireshark</a>.</p> + <p>Le paquet <a href="https://nghttp2.org">nghttp2</a> inclut aussi des + outils comme :</p> + <ul> + <li><a href="https://nghttp2.org/documentation/nghttp.1.html">nghttp</a> + - permet de visualiser les trames HTTP/2 et ainsi de se faire une meilleure + idée du protocole.</li> + <li><a href="https://nghttp2.org/documentation/h2load-howto.html">h2load</a> - + permet de tester votre serveur dans des conditions extremes.</li> + </ul> + <p>Chrome fournit des journaux détaillés des connexions HTTP/2 via la page + <a href="chrome://net-internals/#http2">special net-internals page</a>. Il y + a aussi cette extension intéressante pour <a href="https://chrome.google.com/webstore/detail/http2-and-spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin?hl=en">Chrome</a> + et <a href="https://addons.mozilla.org/en-us/firefox/addon/spdy-indicator/">Firefox</a> + qui permet d'indiquer que votre navigateur utilise HTTP/2.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="push" id="push">Push serveur</a></h2> + + <p>Le protocole HTTP/2 permet au serveur de proposer (PUSH) des réponses + pour lesquelles le client n'a rien demandé. La communication autour de ces + réponses est du style : "voici une requête que vous n'avez jamais + envoyée, et la réponse vous parviendra bientôt tout de même ..."</p> + <p>Il y a cependant des conditions : le client peut désactiver cette + fonctionnalité et le serveur ne pourra alors lui proposer des réponses que + pour les requêtes qu'il a effectivement envoyées.</p> + <p>Cette fonctionnalité a pour but de permettre au serveur d'envoyer au + client des ressources dont il va probablement avoir besoin : par exemple une + ressource css ou javascript appartenant à une page html que le client a + demandée, un jeu d'images référencé par un css, etc...</p> + <p>Cette anticipation a pour avantage de permettre au client d'économiser le + temps qu'il lui aurait fallu pour envoyer une requête, quelques + millisecondes à une demi-seconde en fonction de l'éloignement du serveur. + Elle a cependant pour inconvénient d'imposer au client le téléchargement de + ressources qu'il possède peut-être déjà dans son cache. Bien entendu, HTTP/2 + permet d'annuler prématurément de telles requêtes, mais des ressources sont + tout de même gaspillées.</p> + <p>En résumé : il n'existe pas encore de stratégie efficace pour faire le + meilleur usage de cette fonctionnalité de HTTP/2 et tout le monde en est + encore au stade de l'expérimentation. À ce titre, voici des conseils pour + procéder vous-même à ces expérimentations :</p> + <p><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> inspecte l'en-tête de la réponse et recherche les + en-têtes <code>Link</code> sous un certain format :</p> + <pre class="prettyprint lang-config">Link </xxx.css>;rel=preload, </xxx.js>; rel=preload</pre> + + <p>Si la connexion supporte PUSH, ces deux ressources seront envoyées au + client. En tant que développeur web vous pouvez définir ces en-têtes soit + directement au niveau de la réponse de votre application, soit en + configurant votre serveur via</p> + <pre class="prettyprint lang-config"><Location /xxx.html> + Header add Link "</xxx.css>;rel=preload" + Header add Link "</xxx.js>;rel=preload" +</Location></pre> + + <p>Si vous souhaitez utiliser des liens <code>preload</code> sans déclencher + de PUSH, vous pouvez utiliser le paramètre <code>nopush</code> comme suit :</p> + <pre class="prettyprint lang-config">Link </xxx.css>;rel=preload;nopush</pre> + + <p>Vous pouvez aussi désactiver les PUSHes pour l'ensemble de votre + serveur via la directive</p> + <pre class="prettyprint lang-config">H2Push Off</pre> + + <p>À savoir aussi :</p> + <p>Le module maintient un journal des ressources ayant fait l'objet d'un + PUSH pour chaque connexion (en général des condensés hash des URLs), et + n'effectuera pas deux fois un PUSH pour la même ressource. Cependant, + lorsque la connexion est fermée, le journal de ses PUSHes est supprimé.</p> + <p>Certains développeurs planchent sur la manière de permettre au client + d'informer le serveur des ressources qu'il possède déjà dans son cache afin + d'éviter les PUSHes pour ces dernières, mais ceci n'en est actuellement qu'à + un stade très expérimental.</p> + <p>L'<a href="https://tools.ietf.org/html/draft-ruellan-http-accept-push-policy-00"> + en-tête Accept-Push-Policy</a> est un autre dispositif expérimental + implémenté dans <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> ; il permet au client de définir pour + chaque requête quels genres de PUSHes il accepte.</p> + + + <p> + La fonctionnalité PUSH n'apportera pas toujours le gain de performances dans + l'obtention de réponses aux requêtes. Vous trouverez plusieurs études sur ce + sujet sur internet qui en expliquent les avantages et inconvénients et + comment les particularités des clients et du réseau en influencent le + fonctionnement. Par exemple, le seul fait que le serveur PUSHes une + ressource n'implique pas forcément que le navigateur l'utilisera.</p> + <p>Ce qui influence le plus la réponse PUSHed, c'est la requête qui a été + simulée. En effet, l'URL de la requête pour un PUSH est fournie par + l'application, mais d'où viennent les en-têtes ? Par exemple, La requête + PUSH requiert-elle un en-tête <code>accept-language</code> et si oui, quelle + sera sa valeur ?</p> + <p>httpd va consulter la requête originale (celle qui a déclenché le PUSH) + et copier les en-têtes suivants vers la requête PUSH : + <code>user-agent</code>, <code>accept</code>, <code>accept-encoding</code>, + <code>accept-language</code> et <code>cache-control</code>.</p> + <p>Tous les autres en-têtes sont ignorés. Les cookies eux non plus ne seront + pas copiés. PUSHer des ressources qui requièrent la présence d'un cookie ne + fonctionnera pas. Ceci peut être sujet à débat, mais tant que ce ne sera pas + clairement discuté avec les navigateurs, restons prudents et évitons + d'exposer les cookies là où ils ne sont pas censés être visibles.</p> + </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> +<div class="section"> +<h2><a name="earlyhints" id="earlyhints">Suggestions précoces</a></h2> + + <p>A l'instar des ressources PUSHées, une autre méthode consiste à envoyer + des en-têtes <code>Link</code> au client avant même que la réponse ne soit + prête. Cette méthode utilise la fonctionnalité appelée "Suggestions + précoces" (Early Hints) décrite dans la <a href="https://tools.ietf.org/html/rfc8297">RFC 8297</a>.</p> + <p>Pour utiliser cette fonctionnalité, vous devez l'activer explicitement + sur le serveur via :</p> + <pre class="prettyprint lang-config">H2EarlyHints on</pre> + + <p>Elle n'est en effet pas activée par défaut car certains navigateurs + anciens perdent pied avec de telles réponses.</p> + <p>Une fois cette fonctionnalité activée, vous pouvez utiliser la directive + <code class="directive"><a href="../mod/mod_http2.html#h2pushresource">H2PushResource</a></code> pour déclencher les + suggestions précoces et les PUSHes de ressources :</p> + <pre class="prettyprint lang-config"><Location /xxx.html> + H2PushResource /xxx.css + H2PushResource /xxx.js +</Location></pre> + + <p>Le serveur enverra alors au client une réponse <code>"103 Early + Hints"</code> dès qu'il <em>commencera</em> à traiter la requête. Selon + votre application web, cet envoi peut intervenir beaucoup plus tôt que le + moment où les premiers en-têtes de réponse auront été déterminés.</p> + <p>Si <code class="directive"><a href="../mod/mod_http2.html#h2push">H2Push</a></code> est activé, ceci + déclenchera aussi le PUSH juste après la réponse 103. Mais si <code class="directive"><a href="../mod/mod_http2.html#h2push">H2Push</a></code> n'est pas activé, la réponse 103 sera + quand-même envoyée au client.</p> + </div></div> +<div class="bottomlang"> +<p><span>Langues Disponibles: </span><a href="../en/howto/http2.html" hreflang="en" rel="alternate" title="English"> en </a> | +<a href="../es/howto/http2.html" hreflang="es" rel="alternate" title="Español"> es </a> | +<a href="../fr/howto/http2.html" title="Français"> fr </a></p> +</div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Commentaires</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our <a href="https://httpd.apache.org/lists.html">mailing lists</a>.</div> +<script type="text/javascript"><!--//--><![CDATA[//><!-- +var comments_shortname = 'httpd'; +var comments_identifier = 'http://httpd.apache.org/docs/2.4/howto/http2.html'; +(function(w, d) { + if (w.location.hostname.toLowerCase() == "httpd.apache.org") { + d.write('<div id="comments_thread"><\/div>'); + var s = d.createElement('script'); + s.type = 'text/javascript'; + s.async = true; + s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier; + (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s); + } + else { + d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>'); + } +})(window, document); +//--><!]]></script></div><div id="footer"> +<p class="apache">Copyright 2023 The Apache Software Foundation.<br />Autorisé sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p> +<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!-- +if (typeof(prettyPrint) !== 'undefined') { + prettyPrint(); +} +//--><!]]></script> +</body></html>
\ No newline at end of file |