Este artículo explica cómo realizar una limpieza de un archivo de configuración de Nginx demasiado extenso, implementando una estructura de vhosts como la que utiliza Debian para los servidores Apache, mediante el uso de los subdirectorios sites-available y sites-enabled. Esto permite lograr una mejor organización de la configuración y facilita el mantenimiento de un servidor Nginx (algo muy importante para simplificar la tarea del SysAdmin y evitar errores), especialmente cuando se poseen múltiples instancias para un mismo puerto/protocolo (lo que se conoce como VirtualHost en jerga Apache).



Separar la configuración de virtual hosts en dos directorios, uno para sitios disponibles (sites-available) y otro para sitios habilitados (sites-enabled) permite organizar de forma prolija, eficiente, y mantenible a la configuración de un servidor Web. Con esta estructura, la configuración de cada sitio se aloja en un archivo .conf dentro del directorio sites-available, y para habilitarlo simplemente se crea un enlace simbólico al mismo dentro de sites-enabled. Esto es lo que hace a la configuración de Apache en Debian tan elegante y simple. Lo cual es particularmente útil cuando un servidor posee varios sitios Web configurados.

El objetivo de este artículo es replicar esta estructura de configuración en un servidor Nginx.

Veamos directamente un ejemplo. El siguiente archivo de configuración nginx.conf posee varias secciones server para diferentes sitios:

user www-data www-data;
worker_processes auto;
worker_rlimit_nofile 2048;

pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type text/plain;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    log_format combined_ssl '$remote_addr - $remote_user [$time_local] $ssl_protocol/$ssl_cipher '
                    '"$request" $status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';


    sendfile on;

    keepalive_requests 100;
    keepalive_timeout 30;

    # Compresión GZIP
    # http://nginx.org/en/docs/http/ngx_http_gzip_module.html
    gzip on;
    gzip_proxied any;
    gzip_comp_level 9;
    gzip_buffers 8 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

    # Hardening by Emiliano
    # https://www.linuxito.com/seguridad/610-hardening-de-servidores-nginx-sobre-freebsd
    client_body_buffer_size 1k;
    client_header_buffer_size 1k;
    client_max_body_size 20M;
    large_client_header_buffers 2 2k;
    client_body_timeout 10;
    client_header_timeout 10;
    send_timeout 10;

    add_header Strict-Transport-Security max-age=63072000;
    add_header X-Frame-Option DENY;
    add_header X-Content-Type-Options nosniff;

    server {
        listen 80;
        server_name sitio1.com.ar;

        # etc. etc. etc.
    }

    server {
        listen 80;
        server_name www.sitio1.com.ar;

        # etc. etc. etc.
    }

    server {
        listen 443 ssl;
        server_name sitio1.com.ar;

        # etc. etc. etc.
    }

    server {
        listen 443 ssl;
        server_name www.sitio1.com.ar;

        # etc. etc. etc.
    }

    # etc. etc. etc.

}

Se observa que por un lado se encuentra la configuración global de Nginx, y luego vienen las diferentes secciones server para cada vhost. En este ejemplo estas secciones se muestran vacías para entender mejor el concepto, pero en la realidad incluyen cada una sus configuraciones, lo cual hace que el archivo resulte demasiado extenso y difícil de manejar.

La idea es pasar todas las secciones server a archivos sites-available/*.conf.

Primero, crear los directorios:

root@debian:~# cd /usr/local/nginx/conf
root@debian:/usr/local/nginx/conf# mkdir sites-available sites-enabled

Luego crear diferentes archivos sites-available/*.conf para diferentes sitios:

sites-available/sitio1.conf:

    server {
        listen 80;
        server_name sitio1.com.ar;

        # etc. etc. etc.
    }

        server {
        listen 80;
        server_name www.sitio1.com.ar;

        # etc. etc. etc.
    }

sites-available/sitio1-ssl.conf:

    server {
        listen 443 ssl;
        server_name sitio1.com.ar;

        # etc. etc. etc.
    }

    server {
        listen 443 ssl;
        server_name www.sitio1.com.ar;

        # etc. etc. etc.
    }

Se pueden agrupar varios sitios por protocolo, por server_name, por sitio Web, o uno por cada sección server. Está en cómo prefiera cada uno.

Luego eliminar todas las secciones server del archivo de configuración principal y reemplazarlas por una única sentencia include.

Nuevo archivo de configuración nginx.conf:

user www-data www-data;
worker_processes auto;
worker_rlimit_nofile 2048;

pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type text/plain;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    log_format combined_ssl '$remote_addr - $remote_user [$time_local] $ssl_protocol/$ssl_cipher '
                    '"$request" $status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';


    sendfile on;

    keepalive_requests 100;
    keepalive_timeout 30;

    # Compresión GZIP
    # http://nginx.org/en/docs/http/ngx_http_gzip_module.html
    gzip on;
    gzip_proxied any;
    gzip_comp_level 9;
    gzip_buffers 8 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

    # Hardening by Emiliano
    # https://www.linuxito.com/seguridad/610-hardening-de-servidores-nginx-sobre-freebsd
    client_body_buffer_size 1k;
    client_header_buffer_size 1k;
    client_max_body_size 20M;
    large_client_header_buffers 2 2k;
    client_body_timeout 10;
    client_header_timeout 10;
    send_timeout 10;

    add_header Strict-Transport-Security max-age=63072000;
    add_header X-Frame-Option DENY;
    add_header X-Content-Type-Options nosniff;

    # Configuración de vhosts
    include sites-enabled/*.conf;

}

Notar que se utiliza una sentencia include para incluir todos los archivos con extensión .conf que se encuentren dentro del directorio sites-enabled/.

Finalmente resta habilitar los diferentes sitios y reiniciar Nginx:

root@debian:/usr/local/nginx/conf# cd sites-enabled/
root@debian:/usr/local/nginx/conf/sites-enabled/# ln -s ../sites-available/sitio1.conf
root@debian:/usr/local/nginx/conf/sites-enabled/# ln -s ../sites-available/sitio1-ssl.conf
root@debian:/usr/local/nginx/conf/sites-enabled/# service nginx restart

La ventaja es que esto permite deshabilitar un sitio simplemente eliminando el enlace simbólico correspondiente y reiniciando Nginx.

De esta forma se logra organizar mucho mejor la configuración del servidor Nginx y se simplifica notáblemente su mantenimiento.

Referencias


Tal vez pueda interesarte


Compartí este artículo