summaryrefslogtreecommitdiffstats
path: root/docs/manual/howto/http2.html
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--docs/manual/howto/http2.html13
-rw-r--r--docs/manual/howto/http2.html.en346
-rw-r--r--docs/manual/howto/http2.html.es421
-rw-r--r--docs/manual/howto/http2.html.fr.utf8429
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="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
+<div id="path">
+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <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">&nbsp;en&nbsp;</a> |
+<a href="../es/howto/http2.html" hreflang="es" rel="alternate" title="Español">&nbsp;es&nbsp;</a> |
+<a href="../fr/howto/http2.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</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=&lt;path&gt;</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
+&lt;VirtualHost ...&gt;
+ ServerName test.example.org
+ Protocols h2 http/1.1
+&lt;/VirtualHost&gt;</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">&lt;IfModule&gt;</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 &lt;/xxx.css&gt;;rel=preload, &lt;/xxx.js&gt;; 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">&lt;Location /xxx.html&gt;
+ Header add Link "&lt;/xxx.css&gt;;rel=preload"
+ Header add Link "&lt;/xxx.js&gt;;rel=preload"
+&lt;/Location&gt;</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 &lt;/xxx.css&gt;;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">&lt;Location /xxx.html&gt;
+ H2PushResource /xxx.css
+ H2PushResource /xxx.js
+&lt;/Location&gt;</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">&nbsp;en&nbsp;</a> |
+<a href="../es/howto/http2.html" hreflang="es" rel="alternate" title="Español">&nbsp;es&nbsp;</a> |
+<a href="../fr/howto/http2.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</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&amp;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&#237;a HTTP/2 - Servidor HTTP Apache Versi&#243;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&#243;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&#243;n 2.4 del Servidor HTTP Apache</p>
+<img alt="" src="../images/feather.png" /></div>
+<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
+<div id="path">
+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Servidor HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentaci&#243;n</a> &gt; <a href="../">Versi&#243;n 2.4</a> &gt; <a href="./">How-To / Tutoriales</a></div><div id="page-content"><div id="preamble"><h1>Gu&#237;a HTTP/2</h1>
+<div class="toplang">
+<p><span>Idiomas disponibles: </span><a href="../en/howto/http2.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
+<a href="../es/howto/http2.html" title="Espa&#241;ol">&nbsp;es&nbsp;</a> |
+<a href="../fr/howto/http2.html" hreflang="fr" rel="alternate" title="Fran&#231;ais">&nbsp;fr&nbsp;</a></p>
+</div>
+<div class="outofdate">Esta traducci&#243;n podr&#237;a estar
+ obsoleta. Consulte la versi&#243;n en ingl&#233;s de la
+ documentaci&#243;n para comprobar si se han producido cambios
+ recientemente.</div>
+
+ <p>
+ Esta es la gu&#237;a para configurar HTTP/2 en Apache httpd. &#201;sta caracter&#237;stica
+ est&#225; <em>lista en produci&#243;n</em> as&#237; que es de esperar que las interfaces
+ y las directivas se mantengan consistentes en cada veri&#243;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&#243;n b&#225;sica</a></li>
+<li><img alt="" src="../images/down.gif" /> <a href="#mpm-config">Configuraci&#243;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 &#250;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&#233;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&#243;n del protocolo de la capa de aplicaci&#243;n con m&#225;s
+ &#233;xito, HTTP. Se centra en hacer un uso m&#225;s eficiente de los recursos de red.
+ No cambia la caracter&#237;stica fundamental de HTTP, la sem&#225;ntica. Todav&#237;a hay
+ olicitudes, respuestas, cabeceras y todo los elementos t&#237;picos de HTTP/1. As&#237;
+ que, si ya conoce HTTP/1, tambi&#233;n conoce el 95% de HTTP/2.</p>
+
+ <p>Se ha escrito mucho sobre HTTP/2 y de c&#243;mo funciona. La norma m&#225;s
+ est&#225;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&#233;n disponible en un
+ formato m&#225;s legible, YMMV</a>). As&#237; que, ah&#237; encontrar&#225; toda la especificaci&#243;n
+ del protocolo.</p>
+
+ <p>Pero, como con todos los RFC, no es ideal como primera lectura. Es mejor
+ entender primero <em>qu&#233;</em> se quiere hacer y despu&#233;s leer el RFC sobre
+ <em>c&#243;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>.
+ &#161;Tambi&#233;n est&#225; disponible cada vez en un mayor n&#250;mero lenguajes!</p>
+
+ <p>Si le parece demasiado largo, o no lo ha leido, hay algunos t&#233;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&#243;n para HTTP 1.1 es que sea
+ legible (por ejemplo capturando el tr&#225;fico de red) mientras que para
+ HTTP/2 no. M&#225;s informaci&#243;n en el FAQ oficial
+ <a href="https://http2.github.io/faq/#why-is-http2-binary">&#191;Por qu&#233; es
+ binario HTTP/2?</a></li>
+
+ <li><strong>h2</strong> es HTTP/2 sobre TLS (negociaci&#243;n de protocolo a
+ trav&#233;s de ALPN).</li>
+
+ <li><strong>h2c</strong> es HTTP/2 sobre TCP.</li>
+
+ <li>Un <strong>frame</strong> es la unidad m&#225;s peque&#241;a de comunicaci&#243;n
+ dentro de una conexi&#243;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&#225;s informaci&#243;n en la documentaci&#243;n oficial
+ <a href="http://httpwg.org/specs/rfc7540.html#FramingLayer">Secci&#243;n de
+ Capa de Frame</a>.</li>
+
+ <li>Un <strong>stream</strong> es un flujo bidireccional de frames dentro
+ de una conexi&#243;n HTTP/2. El concepto correspondiente en HTTP 1.1 es un
+ intercambio de mensajes de solicitud/respuesta. M&#225;s informaci&#243;n en la
+ documentaci&#243;n oficial
+ <a href="http://httpwg.org/specs/rfc7540.html#StreamsLayer">Secci&#243;n Capa
+ de Stream</a>.</li>
+
+ <li>
+ HTTP/2 es capaz de llevar <strong>m&#250;ltiples streams</strong> de datos
+ sobre la misma conexi&#243;n TCP, evitando la cl&#225;sica solicitud lenta
+ "head-of-line blocking" de HTTP 1.1 y evitando generar m&#250;ltiples conexiones
+ TCP para cada solicitud/respuesta (KeepAlive parche&#243; el problema en
+ HTTP 1.1 pero no lo resolvi&#243; 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&#243;dulo httpd, llamado
+ acertadamente <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code>. Incluye el set completo de
+ caracter&#237;sticas descritas por el RFC 7540 y soporta HTTP/2 sobre texto
+ plano (http:), as&#237; 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&#233;s de una solicitud inicial HTTP/1.
+ </p>
+
+ <p>
+ Una caracter&#237;stica de HTTP/2 que ofrece capacidades nuevas para
+ desarrolladores de web es <a href="#push">Server Push</a>. Vea esa secci&#243;n
+ para saber como su aplicaci&#243;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&#237;a <a href="https://nghttp2.org">
+ nghttp2</a>como su implementaci&#243;n base. Para compilar
+ <code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> necesita al menos la versi&#243;n 1.2.1 de
+ <code>libnghttp2</code> instalada en su sistema.
+ </p>
+
+ <p>
+ Cuando usted ejecuta <code>./configure</code> en el c&#243;digo fuente de
+ Apache HTTPD, necesita indicarle '<code>--enable-http2</code>' como una
+ opci&#243;n adicional para activar la compilaci&#243;n de este m&#243;dulo. Si su
+ <code>libnghttp2</code> est&#225; ubicado en una ruta no habitual (cualquiera que
+ sea en su sistema operativo), puede indicar su ubicaci&#243;n con
+ '<code>--with-nghttp2=&lt;path&gt;</code>' para <code>./configure</code>.
+ </p>
+
+ <p>Aunque puede que eso sirva para la mayor&#237;a, habr&#225; quien prefiera un <code>nghttp2</code> compilado est&#225;ticamente para este m&#243;dulo. Para ellos existe la opci&#243;n <code>--enable-nghttp2-staticlib-deps</code>. Funciona de manera muy similar a como uno debe enlazar openssl est&#225;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&#237;a de los navegadores hablan HTTP/2 solo con URLs <code>https:</code>. As&#237; que necesita un servidor con soporte SSL. Pero no solo eso, necesitar&#225; una librer&#237;a SSL que de soporte a la extensi&#243;n <code>ALPN</code>. Si usa OpenSSL, necesita al menos la versi&#243;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&#243;n b&#225;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&#243;n b&#225;sica para activarlo. Lo primero, como con cualquier otro m&#243;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&#241;adir a la configuraci&#243;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&#243;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
+&lt;VirtualHost ...&gt;
+ ServerName test.example.org
+ Protocols h2 http/1.1
+&lt;/VirtualHost&gt;</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&#243;n actual de mod_http2 no fuerza ning&#250;n cifrado pero la mayor&#237;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&#225; al navegador a rehusar e intentar conectar por HTTP 1.1. Esto es un error com&#250;n cuando se configura httpd con HTTP/2 por primera vez, &#161;as&#237; que por favor tenga en cuenta que debe evitar largas sesiones de depuraci&#243;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&#233;n es relevante. Por defecto, el primero es el protocolo preferido. Cuando un cliente ofrece m&#250;ltiples opciones, la que est&#233; m&#225;s a la izquierda ser&#225; 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&#225; seleccionado a menos que el cliente <em>s&#243;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&#225;s respecto al orden: el cliente tambi&#233;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&#243; los Protocols sea irrelevante y s&#243;lo el orden de preferencia del cliente ser&#225; decisorio.</p>
+
+ <p>Una &#250;ltima cosa: cuando usted configura los protocolos no se comprueba si son correctos o est&#225;n bien escritos. Puede mencionar protocolos que no existen, as&#237; que no hay necesidad de proteger <code class="directive"><a href="../mod/core.html#protocols">Protocols</a></code> con ning&#250;n <code class="directive"><a href="../mod/core.html#ifmodule">&lt;IfModule&gt;</a></code> de comprobaci&#243;n.</p>
+
+ <p>Para m&#225;s consejos avanzados de configuraci&#243;n, vea la <a href="../mod/mod_http2.html#dimensioning">
+ secci&#243;n de m&#243;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&#243;n MPM</a></h2>
+
+
+ <p>HTTP/2 est&#225; soportado en todos los m&#243;dulos de multi-proceso que se ofrecen con httpd. Aun as&#237;, si usa el mpm <code class="module"><a href="../mod/prefork.html">prefork</a></code>, habr&#225; 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&#225; una solicitud cada vez por conexi&#243;n. Pero los clientes, como los navegadores, enviar&#225;n muchas solicitudes al mismo tiempo. Si una de ellas tarda mucho en procesarse (o hace un sondeo que dura m&#225;s de la cuenta), las otras solicitudes se quedar&#225;n atascadas.</p>
+
+ <p><code class="module"><a href="../mod/mod_http2.html">mod_http2</a></code> no evitar&#225; este l&#237;mite por defecto. El motivo es que <code class="module"><a href="../mod/prefork.html">prefork</a></code> hoy en d&#237;a solo se escoge si ejecuta motores de proceso que no est&#225;n preparados para multi-hilo, p.ej. fallar&#225; con m&#225;s de una solicitud.</p>
+
+ <p>Si su configuraci&#243;n lo soporta, hoy en d&#237;a <code class="module"><a href="../mod/event.html">event</a></code> es el mejor mpm que puede usar.</p>
+
+ <p>Si realmente est&#225; 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&#237; c&#243;mo otros servidores, est&#225;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&#225;s vers&#225;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 &#250;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&#250;rese de que su versi&#243;n soporta HTTP/2 comprobando sus <code>Caracter&#237;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&#243;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&#233;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> - &#250;til para hacer un stress-test de su servidor.</li>
+ </ul>
+
+ <p>Chrome ofrece logs detallados de HTTP/2 en sus conexiones a trav&#233;s de la <a href="chrome://net-internals/#http2">p&#225;gina especial de net-internals</a>. Tambi&#233;n hay una extensi&#243;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&#243;. El tono de la conversaci&#243;n es: "Aqu&#237; tiene una solicitud que nunca envi&#243; y la respuesta llegar&#225; pronto..."</p>
+
+ <p>Pero hay restricciones: el cliente puede deshabilitar esta caracter&#237;stica y el servidor entonces solo podr&#225; hacer PUSH en una solicitud que hizo previamente del cliente.</p>
+
+ <p>La intenci&#243;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&#225;gina html que el cliente solicit&#243;, un grupo de im&#225;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&#243;n previa de tales solicitudes, pero aun as&#237; se malgastan recursos.</p>
+
+ <p>Resumiendo: no hay una estrategia mejor sobre c&#243;mo usar esta caracter&#237;stica de HTTP/2 y todo el mundo est&#225; experimentando con ella. As&#237; que, &#191;c&#243;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 &lt;/xxx.css&gt;;rel=preload, &lt;/xxx.js&gt;; rel=preload</pre>
+
+
+ <p>
+ Si la conexi&#243;n soporta PUSH, estos dos recursos se enviar&#225;n al cliente.
+ Como desarrollador web, puede configurar estas cabeceras o bien
+ directamente en la respuesta de su aplicaci&#243;n o configurar su servidor con:
+ </p>
+
+ <pre class="prettyprint lang-config">&lt;Location /xxx.html&gt;
+ Header add Link "&lt;/xxx.css&gt;;rel=preload"
+ Header add Link "&lt;/xxx.js&gt;;rel=preload"
+&lt;/Location&gt;</pre>
+
+
+ <p>Si quiere usar enlaces con <code>preload</code> sin activar un PUSH, puede
+ usar el par&#225;metro <code>nopush</code>, como en:</p>
+
+ <pre class="prettyprint lang-config">Link &lt;/xxx.css&gt;;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&#225;s:</p>
+
+ <p>
+ El m&#243;dulo mantiene un registro de lo que se ha enviado con PUSH para cada
+ conexi&#243;n (hashes de URLs, b&#225;sicamente) y no har&#225; PUSH del mismo recurso dos
+ veces. Cuando la conexi&#243;n se cierra, la informaci&#243;n es descartada.
+ </p>
+
+ <p>
+ Hay gente pensando c&#243;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&#233; 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&#225;s importante que influye en la respuesta que se env&#237;a, es la solicitud
+ que se simul&#243;. La url de solicitud de un PUSH es dada por la aplicaci&#243;n,
+ pero &#191;de donde vienen las cabeceras de la petici&#243;n? por ejemplo si el PUSH
+ pide una cabecera <code>accept-language</code> y si es as&#237;, &#191;con qu&#233; valor?
+ </p>
+ <p>Httpd mirar&#225; la petici&#243;n original (la que origin&#243; el PUSH) y copiar&#225; 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&#225;n copiadas.
+ Impulsar los recursos que requieren una cookie para estar presente no
+ funcionar&#225;. Esto puede ser una cuesti&#243;n de debate. Pero a menos que esto se
+ discuta m&#225;s claramente con el navegador, evitemos el exceso de precauci&#243;n y
+ no expongamos las cookies donde podr&#237;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&#233; lista. Esto usa
+ una caracteristica de HTTP que se llama "Early Hints" y est&#225; 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&#225; habilitado por defecto ya q ue algunos navegadores m&#225;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">&lt;Location /xxx.html&gt;
+ H2PushResource /xxx.css
+ H2PushResource /xxx.js
+&lt;/Location&gt;</pre>
+
+ <p>
+ Esto lanzar&#225; 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&#243;n web.
+ </p>
+
+ <p>
+ Si la directiva <code class="directive"><a href="../mod/mod_http2.html#h2push">H2Push</a></code> est&#225;
+ habilitada, esto comenzar&#225; el PUSH justo despu&#233;s de la respuesta 103.
+ Sin embargo, si la directiva <code class="directive"><a href="../mod/mod_http2.html#h2push">H2Push</a></code> est&#225; dehabilitada, la respuesta 103 se le enviar&#225; 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">&nbsp;en&nbsp;</a> |
+<a href="../es/howto/http2.html" title="Espa&#241;ol">&nbsp;es&nbsp;</a> |
+<a href="../fr/howto/http2.html" hreflang="fr" rel="alternate" title="Fran&#231;ais">&nbsp;fr&nbsp;</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&amp;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&#233;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&#243;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="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
+<div id="path">
+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <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">&nbsp;en&nbsp;</a> |
+<a href="../es/howto/http2.html" hreflang="es" rel="alternate" title="Español">&nbsp;es&nbsp;</a> |
+<a href="../fr/howto/http2.html" title="Français">&nbsp;fr&nbsp;</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=&lt;path&gt;</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
+&lt;VirtualHost ...&gt;
+ ServerName test.example.org
+ Protocols h2 http/1.1
+&lt;/VirtualHost&gt;</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">&lt;IfModule&gt;</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 &lt;/xxx.css&gt;;rel=preload, &lt;/xxx.js&gt;; 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">&lt;Location /xxx.html&gt;
+ Header add Link "&lt;/xxx.css&gt;;rel=preload"
+ Header add Link "&lt;/xxx.js&gt;;rel=preload"
+&lt;/Location&gt;</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 &lt;/xxx.css&gt;;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">&lt;Location /xxx.html&gt;
+ H2PushResource /xxx.css
+ H2PushResource /xxx.js
+&lt;/Location&gt;</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">&nbsp;en&nbsp;</a> |
+<a href="../es/howto/http2.html" hreflang="es" rel="alternate" title="Español">&nbsp;es&nbsp;</a> |
+<a href="../fr/howto/http2.html" title="Français">&nbsp;fr&nbsp;</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&amp;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