Thanks for the high praises! Let's also call out Dragan Dosen (he actually integrated mod_defender) and Christopher Faulet for the excellent groundwork on establishing SPOE as a basis for new additions.
There will be more good things coming and we hope to continue to support such success stories as yours! Best regards, Andjelko On 08/18/2017 09:51 PM, Hemant Sabat @ Coscend wrote: > Congratulations, HAProxy community on implementing HTTP/2 support! > > Your reverse proxy load balancer has genuinely helped us build our company > from a "rank startup" that it was a few years ago into an "enterprise-grade > SLA-based startup". Your contributions have given us high-availability, > scalability, Web application security (through WAF), DDOS protection, > content-switching, reliability and performance. To name a few direct > contributors--people whose names popped up in our mailbox: > > Baptiste Assman's LetsEncrypt plugin and articles on reverse proxy, > Thierry Fournier's Web application firewall plugins (SPOE-ModSecurity, Mod > Defender), > Cyril Bonte's easy-to-use documentation, > Alaksandar Lazic's dockerfile and timely insights as well as > timely vectors from Bryan Talbot, Pavlos Parissis and Igor Cicimov, > Plus Willy Tarreau who started this load balancer proxy initiative. > > We will probably never know our indirect contributors...whose names did not > popup in our e-mails, but we utilized their contributions. > > Similar good Samaritans from a few other communities complemented your > contributions to help us scale this venture up. As our company grows > further, hope we can give something back to this and other communities. > > Thank you. > > Sincerely, > > Hemant K. Sabat > > Coscend Communications Solutions > www.Coscend.com > ------------------------------------------------------------------ > Real-time, Interactive Video Collaboration, Tele-healthcare, Tele-education, > Telepresence Services, on the fly… > ------------------------------------------------------------------ > CONFIDENTIALITY NOTICE: See 'Confidentiality Notice Regarding E-mail > Messages from Coscend Communications Solutions' posted at: > http://www.Coscend.com/Terms_and_Conditions.html > > -----Original Message----- > From: Willy Tarreau [mailto:w...@1wt.eu] > Sent: Friday, August 18, 2017 9:49 AM > To: haproxy@formilux.org > Subject: Experimental / broken HTTP/2 support > > ...well, I think everything is in the subject :-) > > Hi, by the way! > > I'm able to gateway http/2 traffic to www.haproxy.org and am getting logs to > prove it : > > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43740 > [18/Aug/2017:15:56:51.282] www~ www/<H2CFRT> -1/13/0/-1/18 0 15 - - ---- > 1/1/0/0/0 0/0 http=1 "<BADREQ>" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.302] www~ www/www 0/0/58/18/104 200 36300 - - CD-- > 1/1/0/0/0 0/0 http=2 "GET / HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.415] www~ www/www 0/0/30/16/46 200 504 - - CD-- > 1/1/0/0/0 0/0 http=2 "GET /size.js HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.466] www~ www/www 0/0/30/16/46 200 215 - - CD-- > 12/12/11/11/0 0/0 http=2 "GET /size.css?1509x761 HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.491] www~ www/www 0/0/25/19/44 200 11198 - - CD-- > 13/13/12/12/0 0/0 http=2 "GET /img/HAProxy_mini_pub.gif HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.492] www~ www/www 0/0/26/19/45 200 10443 - - CD-- > 12/12/11/11/0 0/0 http=2 "GET /img/POM_mini_pub.gif HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.491] www~ www/www 0/0/28/19/47 200 7772 - - CD-- > 11/11/10/10/0 0/0 http=2 "GET /img/ALOHA_mini_pub.gif HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.491] www~ www/www 0/0/29/22/51 200 1731 - - CD-- > 10/10/9/9/0 0/0 http=2 "GET /img/btn_donate_SM_eur.gif HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.489] www~ www/www 0/0/29/24/53 200 3743 - - CD-- > 9/9/8/8/0 0/0 http=2 "GET /img/logo-med.png HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.490] www~ www/www 0/0/29/23/52 200 1729 - - CD-- > 8/8/7/7/0 0/0 http=2 "GET /img/btn_donate_SM_usd.gif HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.500] www~ www/www 0/0/26/18/44 200 3220 - - CD-- > 7/7/6/6/0 0/0 http=2 "GET /img/haproxy-pmode.png HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.501] www~ www/www 0/0/26/18/44 200 2261 - - CD-- > 6/6/5/5/0 0/0 http=2 "GET /img/pwby.gif HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.492] www~ www/www 0/0/26/31/58 200 19247 - - CD-- > 5/5/4/4/0 0/0 http=2 "GET /img/World_IPv6_launch_banner_256.png HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.501] www~ www/www 0/0/25/24/49 200 396 - - CD-- > 4/4/3/3/0 0/0 http=2 "GET /img/fr-off.png HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.501] www~ www/www 0/0/25/25/50 200 441 - - CD-- > 3/3/2/2/0 0/0 http=2 "GET /img/en-off.png HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.514] www~ www/www 0/0/28/15/43 200 850 - - CD-- > 2/2/1/1/0 0/0 http=2 "GET /img/ipv6nok.gif HTTP/1.1" > <134>Aug 18 15:56:51 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.525] www~ www/www 0/0/30/232/262 200 376 - - CD-- > 1/1/0/0/0 0/0 http=2 "GET /img/ipv6back.png HTTP/1.1" > <134>Aug 18 15:57:11 haproxy[6566]: 127.0.0.1:43746 > [18/Aug/2017:15:56:51.300] www~ www/<H2CFRT> -1/2/0/-1/20489 0 99131 - - > cD-- 0/0/0/0/0 0/0 http=1 "<BADREQ>" > > Look at the accept dates for the request, many of them are grouped, and > there's this "http=2" field in the log indicating the on-wire format. > > But you'll also note all the "CD--" flags, the "<BADREQ>" etc... > > The code more or less works. There are still some race conditions that will > occasionally cause some requests to time out, especially if you build with > "-DDEBUG_H2" which will emit a lot of printf. > > At least now with this code in place I could understand what is wrong and > how it should be re-architected. There's still a lot of work to do in this > area (there are some design notes and contradictory thoughts in > doc/internals/h2.txt) but I thought that now that it's more or less working > and that I'm going to break it and restart it from scratch differently, it > could be nice that I share it for those curious who want to play with it a > bit. > > DON'T PUT THIS IN PRODUCTION!!! There are a lot of unhandled errors, there > are occasional leaks due to certain races not being caught etc. > I'm not even going to put it myself in front of haproxy.org nor at home. It > may start a fire in your house, attract UFOs full of man-eating aliens, or > even make me temporarily smart, nothing you want to experience! > > The design for now consists in demultiplexing the H2 streams from the > incoming connection, translating them into H1 and processing H1 requests > just like before. That's why the logs still report "HTTP/1.1", it's what is > presented into the version string. > > Among the things that are still limitations that could possibly be overcome > before the 1.8 release, I can cite : > > - header field names don't have any single upper case letter (as is > the case in H2), so it might be possible that some bogus hard-coded > products don't match "Host" when "host:" is present for example. It's > not very hard to place an upper case after each "-" but for now it's > not done ; I'm interested in interoperability issue reports if any. > > - no server-side keep-alive for now. The cause is simple : the streams > in HTTP/2 only transport a single request so there is no reuse by the > same stream and for now we have nowhere to place our idle connection, > meaning that they have to be closed all the time ; we definitely need > to address this by having per-session lists, but it will not be trivial > so I preferred to focus on protocol processing for now, which already > isn't the easiest thing to implement ; > > - no data upload yet, DATA frames are simply ignoread, so POST, PUT and > CONNECT will not work. It's not a huge work to get them to work now > but doing it in an architecture that's going to die is pointless. > > - CONTINUATION frames are not supported for now, it's due to the current > architecture making this very complicated. > > - it's mandatory that the buffer size (tune.bufsize) is at least 16384 > bytes. There's no such control for now during the config parsing so > it starts and H2 connections are simply aborted when it's discovered > that the buffer is too small and the browser retries using HTTP/1. > > - trailers are not forwarded from the server to the client yet. Not > critical for most tests. > > - logs also report the H2 front connection and bad requests. This will > have to be addressed later. > > - request/response aborts are not translated to RST_STREAM frames yet, > so I guess it's the browser which will detect some inconsistency and > break the connection, or we'll send a GOAWAY frame to break it. > > - no graceful shutdown of the connection (will probably not exist for > the release, we'll see). > > - the HTTP/1 to 2 upgrade method is not supported yet, though I'm not > much worried about it at the moment. > > - no trivial way to report HTTP/2 in the logs. I'm using a sample > fetch function reporting the on-wire format as 1 or 2 for now. I > considered replacing "HTTP/1.1" with "HTTP/2.0" in the logs but > that's inaccurate since we really process "1.1" so it might be > confusing to those dealing with regex which don't seem to match, > and in addition "HTTP/2.0" is not the correct version string, the > correct one is "HTTP/2". But writing this without the dot and the > minor version is going to break some log processing tools. Thus I > was thinking about having some optional fields that are supposed > to be easy to use. Note that we had the same issue with SSL long > ago, ending with "~" after the frontend's name in the logs... > Better avoid this for H2. Ideas are welcome. > > There are some good points as well, proving we're not too far. For example, > the stats work over H2, even when enabling compression! > > I'm pretty sure you'll find a ton of bugs there, and don't look at the code > too closely, sometimes I really had to put a few lines just to plug a hole > through which water was leaking. > > I'm more interested in observations, like "oh too bad you didn't do this" or > "why not report the version this way" etc. You'll all see that it's easierto > think about it when playing with it. > > Currently I'm running it locally on my laptop, listening on 127.0.0.2 for > traffic that my browser sends there when I want to access h2.haproxy.org or > h2.haproxy.com (then the Host header gets rewritten). > I could notice already that loading haproxy.com through this is a bit faster > thanks to the higher parallelism allowing more objects to be loaded at once. > > Those who want to test will have to retrieve branch 20170818-h2-2 from the > git development repository : > > git clone -b 20170818-h2-2 http://git.haproxy.org/git/haproxy.git/ > > It builds as usual. For the config, you have to specify "alpn h2" on the > "bind" line. This requires openssl-1.0.2. If you have an older version you > can try with "npn h2", which some browsers support as well. > The first failed connection in the logs above was made with ALPN then a > fallback to NPN was done. Or maybe both were attempted in parallel, I > haven't checked much. > > The working config I'm using here is the following : > > global > log 127.0.0.1:5514 local0 > stats socket /tmp/sock1 mode 666 level admin > stats timeout 1h > tune.ssl.default-dh-param 1024 > ssl-server-verify none > tune.bufsize 16384 > > defaults > mode http > timeout client 20s > timeout server 20s > timeout connect 1s > > listen www > log global > log-format "%ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC > %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs http=%[http_major] %{+Q}r" > bind 127.0.0.2:443 ssl crt rsa+dh2048.pem alpn h2 > server www www.haproxy.org:443 ssl verify none > http-request set-header host www.haproxy.org > stats uri /stat > > And in my /etc/hosts, I have : > > 127.0.0.2 h2.haproxy.org > > Then I can aim by browser at h2.haproxy.org, get over the cert warning, and > continue from there. It's interesting to see how certain sites with many > objects react, even those which are far away, because the browser visibly > allows much more parallelism than on HTTP/1. If some want to try on > www.haproxy.com (many more objects, it's a modern site :-)) you'll need two > such instances, one for "h2." replacing "www" and another one for "cdn." > running on a different address. And you'll have to modify your /etc/hosts > and later complain that you can't access the site anymore after you forget > your test (it happened to me already). So it's better if you find another > site where most of the objects are on the same host matching the URL bar, > it's much easier to configure and to test. > > I'm not really asking for bug reports at this step, I expect a lot. However > if you manage to find 100% reproducible cases for connection hangs, timeouts > or stuff like this, it can still indicate I missed something, so do not > hesitate. Just don't be sad if I only respond "yeah I know". > > I'm still getting hopes for something working (a bit better) by mid-end of > october, which means we could have a very fresh H2 support in haproxy 1.8, > very likely still tagged experimental. > > Have fun, > Willy > > > > --- > This email has been checked for viruses by AVG. > http://www.avg.com > >