Instalar y configurar varnish 5 en digitalocean ?

Que es Varnish Cache
Varnish Cache es un acelerador de aplicaciones web, también conocido como caché de proxy HTTP inversa. Se instala delante de cualquier servidor HTTP y se configura para almacenar en el caché del servidor una copia del recurso solicitado.

En este vídeo podemos ver mas a detalle que es varnish-cache

Instalacion de Varnish-cache

1.- Creamos un nuevo servidor el cual va a tener varnish al cual llamaremos VPS_varnish y el servidor con nuestra pagina web le llamaremos VPS_lamp

2.- Debemos habilitar nuestras ip privadas como se muestra aqui

3.- Actualizamos e instlamos varnish 5 asi:

curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | sudo apt-key add -
sudo apt-get install debian-archive-keyring
apt-get install -y apt-transport-https
echo "deb https://packagecloud.io/varnishcache/varnish5/ubuntu/ xenial main" | sudo tee -a /etc/apt/sources.list.d/varnishcache5.list
sudo apt update
sudo apt install varnish

Si requerimos usar modulos extras para varnish como modulo de cookies,sticky entre otra, deberiamos seguir los pasos que se muestran en este tutorial.

Y verificamos la version asi:

varnishd -V

4.- Miramos la pagina a nuestro servidor VPS_varnish asi poniendo la ip y el puero 6081

http://Public_IP_VPS_varnish:6081

Nos debe mostrar esto
503 Error

Eso significa que varnish ya esta trabajando pero no ha visto ningun servidor.

Para decirle a varnish de que servidor va a jalar los datos de la pagina tenemos que editar el archivo default.vcl

sudo vim /etc/varnish/default.vcl

Y vamos a ver esto

backend default {
.host = "127.0.0.1";
.port = "8080";
}

Y lo cambiamos por esto

backend default {
.host = "
IP_Privada_VPS_lamp";
.port = "
80";
}
include "custom.vcl";
sudo vim /etc/varnish/custom.vcl

dentro de custom.vcl colocamos el siguiente este contenido  (recuerda cambiar dominio.com por tu dominio)

5.- Configuramos varnish para que sirva la informacion atraves del puerto 80 asi como lo hace apache o ngix asi:

sudo vim /etc/default/varnish

Busamos una linea asi

DAEMON_OPTS="-a :6081 

Y la cambiamos por esta:

DAEMON_OPTS="-a :80 

A partir de ubuntu 15 tambien debemos editar este archivo

vim /lib/systemd/system/varnish.service

Donde cambiamos esta linea

ExecStart=/usr/sbin/varnishd -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

por esta

ExecStart=/usr/sbin/varnishd -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

Y reiniciamos vernish

sudo service varnish restart

6.- En nuestro servidor VPS_lamp debemos editar nuestro virtualhost de nuestra pagina de tal suerte que envie su informacion al servidor VPS_varnish y esto lo logramos editando el virtualhost de nuestro servidor VPS_lamp asi

sudo vim /etc/apache2/sites-available/virtualhost_dominio.conf

Donde vamos a buscar esta linea

<VirtualHost IP_Publica_VPS_lamp:80>

y la cambiamos por esta

<VirtualHost IP_Privada_VPS_Lamp:80>

Esa ip privada la podemos ver haciendo click en el droplet y se muestra esto:

Reiniciamos apache

sudo service apache2 restart

7.- Habilitamos varnish para https, para esto debemos instalar nginx en nuestro VPS_varnish asi

sudo apt-get install nginx

8.- Instalamos y configuramos letsencrypt en VPS_varnish asi:

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx

Editamos el archivo default de ngix asi

sudo vim /etc/nginx/sites-available/default

Buscamos este texto

server_name _;

Y sustituimos _  por el nombre del dominio

server_name example.com www.example.com;

Verificamos la sintaxis de nuestro virtualhost asi:

sudo nginx -t

Reiniciamos nginx

sudo service nginx restart

Obtenemos los certificados de letsencrypt pero agregamos –test-cert para probar que si se pueda sertificar nuestro dominio.

sudo certbot --nginx -d example.com -d www.example.com --test-cert

En caso de que se muestre este error
Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.
Podemos usar la alternativa que se muestra en este tutorial

Si al final obtines un resultado asi significa que si es posible certificar nuestro dominio.


Output

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2017-10-23. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again with the
"certonly" option. To non-interactively renew *all* of your
certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Pero por haber usado –test-cert en realidad no esta certificado, para implementar el certificar debemos poner –force-renew asi:

sudo certbot --nginx -d example.com -d www.example.com --force-renew

Si vamos a SSL Labs Server Test y ponemos nuestro dominio, vamos a ver una B porque faltan  los parametros del demonio, para solucionar este detalle hay que  hacer los iguiente:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Editamos de nuevo el virtualhost default de nginx

sudo vim /etc/nginx/sites-available/default

Ahi colocamos en cualquier parte dentro del bloque server{}

ssl_dhparam /etc/ssl/certs/dhparam.pem;

De nuevo revisamos la sintaxis del virtualhost default

sudo nginx -t

Reiniciamos ngixn

sudo service nginx restart

9.- Configuramos la auto renovación:
Abrimos el crontab asi

sudo crontab -e

Agregamos esta siguiente linea

15 3 * * * /usr/bin/certbot renew --quiet

10.- Editamos el archivo

vim /etc/nginx/sites-available/default

De tal suerte que quede asi

server {
listen 443 ssl default_server; # managed by Certbot
server_name ejemplo.com www.ejemplo.com;
ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

location / {
proxy_pass http://127.0.0.1:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
}

}

Reiniciamos ngixn

sudo service nginx restart

Reiniciamos varnish

sudo service varnish restart

11.- Configurando varnish con wordpress

En el caso del wp-admin de wordpress es importante aclarar que puede llegar a dar el problema de loop de redirecciones para evitar esto hay que agregar en el wp-config.php esta linea de codigo:

define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
Nota importante: las lineas mencionadas anteriormente debe ir al inicio del archivo wp-config.php


12.- Ahora podemos ver las estadisticas de varnish asi

varnishstat

Miraras algo como esto:

Varnish Stats

Diagrama final de nuestro varnish-cache y wordpress

Nota: para ver la fecha de caducidad de nuestros certificados ssl podemos ejecutar el sisguiente comando en cualquier terminal:
echo | openssl s_client -connect dominio.com:443 -servername nombre_del_servidor 2>/dev/null | openssl x509 -noout -dates

Si tenemos acceso al servidor varnish podemos ejecutar este comando

ssl-cert-check -c /etc/letsencrypt/live/dominio.com/cert.pem
Nota: quizas nos pida instalar ssl-cert-check lo cual podemos hacer asi: apt install ssl-cert-check