HTTPS is quite slow when you're connecting for the first time, but it should be nearly as fast as plain HTTP on subsequent requests. Especially if you're the only person who is using HTTPS on that server.
Your keepalive probably isn't helping because browsers tend to open several simultaneous connections to the same server, one for the page itself and a few more for various CSS, JS, and image files. In the absence of a session cache (see below), each of these connections would need to be renegotiated with a brand new SSL handshake. Several SSL handshakes per page = slow page load.
Here's my typical SSL configuration:
Code:
ssl_certificate /path/to/domain_name.crt;
ssl_certificate_key /path/to/domain_name.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!ADH:!MD5:!aNULL:!eNULL:!MEDIUM:!LOW:!EXP:!kEDH;
ssl_protocols SSLv3 TLSv1;
ssl_prefer_server_ciphers on;
This enables the session cache, so that you can use a previously negotiated key to speed up subsequent connections. (Session timeouts are more or less useless without a working session cache.) Note that "1m" here means 1MB of RAM, not 1 minute. There's no need to increase this value unless you're expecting hundreds of simultaneous visitors. The "5m" in the session timeout, on the other hand, means 5 minutes. You can increase this if you don't want to renegotiate keys every 5 minutes, but it probably won't have a huge impact on page load times.
My example also disables the insecure SSLv2 protocol, as well as a few weak ciphers. It also disables the
extremely slow kEDH cipher, because that's probably overkill for accessing phpmyadmin on your tiny Linode.
If this doesn't help, use Chrome Developer Tools (built into Chrome) or Firebug (a Firefox extension) to see a graph of your page load timeline. This will tell you which elements are loading slowly.