Before we begin anything, let these information sink in. Watch the following video:
Long back when I was serving an eCommerce major, our team evaluated HTTP2 over http and it was concluded that the gains were minimal. TBH, I felt our premise was wrong, our approach for evaluating http2 was unduly done (read ahead to know). It was later concluded that we were not going for http2 because it had low ROI.
Right now, in my current org., I tried to push through http2 along with https (https because of the reasons mentioned ahead). My proposal wasn’t accepted, again because of Low ROI.
There are several costs associated with going with http2 + https viz
- Investing on procuring an SSL certificate
- Evaluating nginx 1.9.5
- Reading through the documentation and setting up the nginx.conf
- Troubleshooting on staging / prod environments
- Change in build script to optimize the outputs for http2 protocol
- Despite being least of our concern, lack of support in legacy browsers is kind of inhibiting if your priority is to get everyone onboard.
- Another small concern is over 3rd party tools – all web apps use premium (not free) 3rd party tools to study user behavior. Checking their compatibility with https is important again. (Small concern – because most 3rd party tools realize this & they serve their contents from https. But there could be smaller players who do not have this capability).
- Change of origin – A change in protocol i.e. from http to https will change the port from :80 to :443. This alters the URI schema. Hence, it’d also imply that the origins have changed. Although, I’ve not validated this or the areas of impact, but it impacts the current SEO or anything else, it’ll be a bigger concern to us than anything else
- Non-secure content – We load our static assets from CDNs and thankfully, Amazon cloudfront supports both http and https. But, if any of our providers failed to provide us with an https endpoint, we’ll be hopeless
Reason for going with https:
- The idiosyncrasies associated with proxy servers and anti virus software to sniff unencrypted http1.1 content. And, if they spot any anomaly in headers e.g. the http version, they’ll simply flag the content as malicious
- Google Chrome is anyway going to shame non-https websites
- https has elevated priority in SEO ranking over non-https. At least, Google obeys this and as a JS-dynamic-template-heavy website, my sole hope for SEO is Google’s Page Rank algorithm alone.
What went wrong with our previous http2 evaluation
http2 is not just the version digit incremented. The transition of the version no. indicates that the new version is a total paradigm shift from the earlier version. http2 protocol works better on small splitted files – hence, our age-old practice of concat-minify-obfuscate-revv won’t work.
Key takeaway 1:
To get the best out of http2, you need many small files minified-obfuscated-revved, not concatenated into single file.
Check these link to get a better idea on the goodness of many small files:
Bonus tip: For a cherry on top the cake, you can further use AMD to load modules whenever needed.
Our last evaluations were based on testing speeds with single-large files. Hence, the gains looked minimal. HTTP2 wasn’t designed perform better with large files.
Key takeaway 2:
Domain sharding is no longer a requirement.
To parallelize static asset loading, we heavily depended on domain sharding i.e. splitting resource requests across multiple domains thereby opening multiple TCP connections.
http2 doesn’t require that. Multiple static resources should be requested over one and only one TCP connection. Unfortunately, this was not how we evaluated.
Key takeaway 3:
Encrypted connection i.e. https is not slow. Google’s SPDY protocol, which could be enabled by just enabling another flag, was the best way for loading resources https, until http2 came in.
It had to be good enough for Google to declare its annihilation/ further usage & support.
What to do next to convince your team to go for http2 + https
Every decision in an organization should be based on facts, based on data a.k.a. Data driven decisions. Decisions can’t be made on the basis of popular remarks/opinions. So
- Gather data about https adoption across industry
- gather all benchmarking studies and results
- gather its success stories
- perform your perf tests on your existing system and gather benchmarking data
- analyze performance data from http2 & utilize this data to show comparisons
- e.g. if your new server gives a time boost of even a thousand milisconds, that’s a major save
- PS: performance tests can be baffling and overwhelming. One feels as if they’re part of some Formular 1 team doing performance improvements
- Clearly explain the need of encryption and how encryption leads to greater trust and security
- Make everyone understand that SSL certificates are no longer hard-to-obtain
- Companies like startssl can offer you a free ssl certificate to get started with
- Additionally, your bash console comes powered with openssl tools. You can leverage it to create a self-signed certificate for your dev environments
- Start your POC
- fork your repo, create an experimental branch
- Perform benchmarking tests
- and, do an A/B test
- Check the conversion rates on each system
I’m using Node.JS / Apache. How can I go for http2?
At the time of writing this article, I’ve n’t explored about Node.JS support for http2. There could be libraries to help you out with this. Or may be, Node inherently support http2 out of the box. I do not know yet. (will update this post when I figure it out). Same applies to Apache as well.
However, nginx 1.9.5 has http2 enabled. Therefore, you can always put an nginx proxy in front of your current server – be it node.js or apache, or any server.
- Setup nginx 1.9.5 on your box
- Specify http2 with ssl along with http
- Upload your certificates & configure the server correctly
- Run your nodejs server on a different (system unreserved) port (you can block this port from public access too)
- Configure the nginx proxy to consume data from nodejs server
This will ensure that nginx (which is well maintained and free and also supports the required http2 + https setup) will take charge of encrypting & http2-fying your site while your nodejs app keeps working the way it has always been.