/ Ghost

Instalar Ghost en Ubuntu 16.04 - Parte 2 - Configurar NGinx como proxy del puerto 2368 al 80 con PageSpeed

En el post anterior vimos cómo podíamos realizar una instalación de Ghost sobre un servidor en DigitalOcean, pero lo dejamos un poco a medias, ya que lo dejamos configurado para que funcionara sobre el puerto por defecto.

Y es que Ghost tiene configurado el **puerto 2368 **en su archivo de configuración, por lo que no coincide con el puerto 80 que es que ingresa por defecto en el navegador.

En este post vamos a tratar cómo configurar nuestro servidor para instalar NGinx como proxy web de Ghost, y que redirija el tráfico del puerto 80 al 2368 del servicio de Ghost.

Instalación del paquete NGinx

Lo primero, comentar que NGinx es un servidor web, como Apache, que permite múltiples configuraciones. Una de las características principales de NGinx es la capacidad de crear Virtual Hosts, o lo que es lo mismo, varias configuraciones de host para distintos dominios o servicios. Esto nos permite tener varios dominios web apuntando a nuestro servidor.

Otra de las características principales de NGinx es que podemos hacerlo actuar como proxy, controlando todas las entradas en nuestro servidor y redirigiéndolo al puerto que necesitemos.

Vamos a explicar dos formas de instalar Nginx:

Además, vamos a dejar unos últimos pasos importantes para finalizar la configuración básica de Nginx.

Primera opción: Nginx desde repositorios

Lo primero, instalemos el servicio:

$ sudo apt-get update && sudo apt-get install nginx -y

Una vez instalado, podemos comprobar su estado de funcionamiento con:

$ sudo service nginx status

Como la configuración la queremos hacer sobre un servicio concreto que será nuestro blog, y dicho blog lo tendremos configurado para un dominio concreto, lo primero que haremos será eliminar la plantilla por defecto y crearnos un virtual host.

$ cd /etc/nginx
$ sudo rm -f sites-enabled/default
$ sudo touch sites-available/ghost
$ sudo nano sites-available/ghost

Una vez tengamos el fichero creado, lo editamos y pondremos lo siguiente:

server {  
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    server_name tudominio.com *.tudominio.com localhost; # Reemplaza esto por tu dirección de dominio.

    root /usr/share/nginx/html;
    index index.html index.htm;

    client_max_body_size 100M;

    location / {
        proxy_pass http://localhost:2368;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
    }
}

Tras crear el virtual host, lo tendremos que activar, y reiniciamos NGinx.

$ sudo cp sites-available/ghost sites-enabled/ghost
$ sudo service nginx force-reload

Y ya tendremos nuestro servidor accesible a través del navegador normal por el puerto 80. Tan solo tendremos que configurar la zona de DNS de nuestro dominio para apuntar a la ip de nuestro servidor.

En el caso como el mío, en el que no queráis tener el dominio configurado con las www por delante, tan solo tenéis que añadir a dicho archivo unas líneas por abajo:

server {
        ...
}

server {
        server_name www.tudominio.com;
        return 301 $scheme://tudominio.com$request_uri;
}

Una vez realizados los pasos anteriores, ya tendremos acceso a la web a través del puerto 80.

Segunda opción: Nginx desde los sources con Pagespeed

Esta opción es algo más compleja, puesto que necesitaremos de varias configuraciones más personalizadas, ya que la tendremos que adaptar a la distribución con la que estamos trabajando.

Lo primero que haremos sera instalar un par de paquetes que necesitaremos durante el empaquetado:

$ sudo apt-get install libpcre3 libpcre3-dev

Una vez instalado, seguiremos las instrucciones de Google para la instalación de Nginx con Pagespeed integrado. Podéis encontrar la documentación oficial aquí.

Procedemos:

bash <(curl -f -L -sS https://ngxpagespeed.com/install) \
     --nginx-version latest

Comenzará la instalación. Llegara un momento en que se detenga y os pregunte si queréis realizar una instalación base, o en su lugar queréis añadir algún módulo. Os pondrá el ejemplo del módulo SSL. En ese momento, introducís lo siguiente:

--with-http_ssl_module --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path==/var/log/nginx/access.log --user=www-data --group=www-data

Básicamente lo que estamos diciendole es que habilite el módulo SSL, las rutas de los ficheros, y el grupo y el usuario que va a ejecutar el servicio Nginx.

Tras introducirlo, pulsamos enter, y a continuación confirmamos.

Pasados unos minutos, nos volverá a pedir confirmación, y volvemos a confirmar y finalizará la instalación.

La instalación desde los sources no incorpora ni el servicio de NGinx ni la configuración por defecto que trae el del repositorio de Ubuntu, por lo que tendremos que crearlos a mano.

Lo primero, vamos a borrar el fichero de configuración y creamos uno nuevo personalizado.

$ sudo rm /etc/nginx/nginx.conf
$ sudo nano /etc/nginx/nginx.conf

En el contenido pondremos:

user  www-data;
worker_processes  auto;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
	worker_connections  1024;
	#multi_accept on;
}

http {
	##
	# Basic Settings
	##
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# server_tokens off;
        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;
	include       mime.types;
	default_type  application/octet-stream;

        ##
        # SSL Settings
        ##
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
	
        ##
        # Gzip Settings
        ##
        gzip on;
        gzip_disable "msie6";
        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml ap$

        ##
        # Virtual Host Configs
        ##
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Esta configuración es la básica que trae el paquete descargado del repositorio de Ubuntu, y además nos habilita las carpetas para alojar los virtual host.

Ahora, crearemos el servicio de Nginx. Para ello crearemos el fichero /etc/systemd/system/nginx.service.

$ sudo nano /etc/systemd/system/nginx.service

Y como en el servicio que creamos para levantar Ghost, introduciremos:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
#PIDFile=/var/run/nginx.pid
ExecStartPre=/etc/nginx/sbin/nginx -t
ExecStart=/etc/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Ahora tendremos que actualizar la configuración de Systemd para que reconozca el nuevo servicio:

$ sudo systemctl reenable nginx
$ sudo systemctl daemon-reload

Y para finalizar, antes de cargar el servicio de Nginx, crearemos los directorios necesarios para los virtual hosts, y dentro de ellos, crearemos el virtual host para que Nginx haga de proxy entre el puerto 2368 y el puerto 80, del mismo modo que si lo hiciéramos desde los repositorios.

$ sudo mkdir /etc/nginx/sites-enabled
$ sudo mkdir /etc/nginx/sites-available
$ sudo nano /etc/nginx/sites-available/ghost

Dentro del fichero del virtual host, pondremos el siguiente contenido:

server {  
	listen 80 default_server;
	listen [::]:80 default_server ipv6only=on;
	
	server_name tudominio.com *.tudominio.com localhost; # Replace with your domain

	root /usr/share/nginx/html;
	index index.html index.htm;

	client_max_body_size 100M;
	
	access_log /var/log/nginx/eiris.es.access;
        error_log /var/log/nginx/eiris.es.error error;

	location / {
		proxy_pass http://localhost:2368;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $http_host;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_buffering off;
	}
}

Y en el caso, como en este blog, que queráis que sólo sea accesible sin www, añadimos al archivo abajo lo siguiente:

server {
	server_name www.tudominio.com;
	return 301 $scheme://tudominio.com$request_uri;
}

Ahora tan solo tendremos que copiar el virtual host que hemos creado al directorio de hosts activados, y ya podremos arrancar el servicio de Nginx.

$ sudo cp /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost
$ sudo service nginx restart

Por lo tanto, si has redireccionado correctamente tu dominio a la ip de tu servidor, ya tendrás acceso a la instalación de tu sistema Ghost desde el propio puerto 80.

Últimos pasos

Seguridad

Una vez que ya tenemos Nginx configurado para poder ser usado como proxy, ya no es necesario que demos paso en nuestro firmware al puerto correspondiente, por lo que podremos deshabilitarlo.

$ sudo ufw deny 2368/tcp

Una vez denegamos la entrada a dicho puerto, si verificamos el estado del servicio UFW, podremos ver que está siendo bloqueada la entrada externa:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere                  
80                         ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
2368/tcp                   DENY        Anywhere                  
22 (v6)                    ALLOW       Anywhere (v6)             
80 (v6)                    ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)             
2368/tcp (v6)              DENY        Anywhere (v6)  

De hecho, si intentamos entrar a la instalación de Ghost a través del puerto 2368 sin pasar por Nginx, ya no podremos acceder.

Por otro lado, como hemos bloqueado el acceso externo a la instalación de Ghost a través del firewall, también vendría bien que lo hiciéramos en el propio servicio Ghost. Para ello, revisamos la configuración que creamos en el post anterior, donde sustituimos los valores 0.0.0.0 en la parte de servidor, y la dejamos en 127.0.0.1 como se encontraba.

server: {
            host: '0.0.0.0',
            port: '2368'
        }

por...

server: {
            host: '127.0.0.1',
            port: '2368'
        }

Lo tendremos que hacer tanto en producción como en desarrollo.

Esto permitirá que al servicio Ghost solo tengan acceso los servicios que se ejecuten desde el servidor local, por lo que evitaría cualquier intrusión en el caso que el firewall falle.