Graphic representation of layers
2016 13 May

Web architecture : Make layers know each other

By Sumit Sinha

This week we had to move some of our non HTTPS Drupal websites over HTTPS. The task is pretty straightforward. All you need to do is get a SSL certificates from your favorite vendor and configure your web server to use it over port 443. Things get a little complicated if you have layers of services over your web server. In our case we have Varnish. As a reverse proxy engine varnish helps you to reduce your response time by caching responses from your web server and keeping them in RAM. Most of our static content reaches you from varnish. But Varnish has a issue it can’t shake hands with client with an SSL certificate yet. So what you do is introduce a new layer of web server over it, one which can handle SSL certificate and pass the request to Varnish.

Web stack for SSL with Varnish

Flow of request from client to web server on SSL connection with Varnish caching.

Both the web server layer in the above architecture can be same software but due to distributed architecture in our case we had Nginx over Varnish and Apache under it. We did setup Nginx with the ability to serve user on port 443 with SSL certificate. Then we forwarded it to the port where Varnish is listening. Which in turn requests Apache for the page requested and stores the copy of it for future.

So far so awesome? But no, our web pages were breaking. It seemed there is some issues with CSS and JS of whole site. Thinking what could go wrong I checked into our configuration.

  1. Whether the site is working nicely on Apache port. It was.

  2. Whether the pages are breaking over Varnish layer.

  3. Ensured that Nginx is, a) redirecting all HTTP requests to HTTPS and b) properly forwarding all HTTPS requests to port where varnish is listening.

  4. Ensured no special .htaccess rule of apache is making the site misbehave.

All seemed fine.

Next, just to ensure things we added print_r($_SERVER); into index.php to echo all the headers being received by Drupal. I cleared varnish cache and reloaded the site. And the reason for misbehaviour was right in front of me.  Drupal gets to know whether the site is being requested over HTTPS or HTTP via the header [HTTPS']='on'. It was missing. That header is how drupal makes the internals ready to serve for HTTPS. In our case, although Nginx was sending ['HTTP_X_FORWARDED_PROTO'] = 'https' & ['HTTP_X_FORWARDED_PORT'] = 443. Drupal was not utilizing it.  So I added the following code into settings.php file of Drupal

// Tell Drupal to utilize the headers sent by nginx to recognize that the communication is happening on HTTPS port

if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')

{

  $_SERVER['HTTPS']='on';

}


Tada! CSS and JS of the site started behaving normally over HTTPS. So to conclude with, in your web stack always try to make all layer know each other.

Featured blog

asdf

Breaking Ajax Poll


Jessy : “Ajax polling became the granda's way to make thing real time ! Why aren't we doing   using socket.io this time ?”

Read More

Say no to captcha

Say no to captcha - Various Spam Protection Methods

Maintaining high traffic websites have their own merits and demerits, the most annoying thing about them is SPAM.

Read More

Install latest Drush 7 version

How to install latest Drush 7 version? So you can use drush with the brand new Drupal 8.

 

It is interesting how when you are trying to do something new in drupal you land up learning (and doing) other newer things!

Read More

Install Memcache on your ubuntu server

Install Memcache on your ubuntu server & make your drupal faster

NOTE: This post explains setting up memcache on Drupal 6. We will very soon follow up for Drupal 7. Why do I need memcache for my drupal site?

Read More