El error “unknown directive” en Nginx generalmente ocurre cuando tienes un archivo de configuración con una directiva que Nginx no reconoce como valida, el error mas comun es porque al modificar un archivo cometimos algún error de sintaxis, cuando Nginx encuentra dicha directiva erronea, muestra un error de “unknown directive” y no puede iniciar o recargar la configuración.

Para solucionar este problema, lo primero y más básico es verificar el archivo de log de errores de Nginx, archivo que generalmente se encuentra en el directorio /var/log/nginx/ y en el, busca mensajes de error específicos relacionados con el problema de “unknown directive”, eso es lo que te ayudará a identificar la directiva problemática, indicándote que archivo y que línea tiene el error.

El siguiente paso es el más obio, pero a veces no es el más fácil de detectar, se trata de verificar la sintaxis de la línea indicada y los renglones previos y posteriores a  la línea indicada sean correcta, a veces se informa una línea pero el problema es la falta de un punto y coma anterior, asegúrate de no tener errores de escritura, caracteres faltantes o sobrantes,  algunas directivas pueden requerir argumentos específicos o deben usarse en contextos específicos, así que consulta la documentación de Nginx para conocer el uso correcto, tal vez una etiqueta si este bien escrita, solo que está en el lugar equivocado.

Digo que no es facil porque a veces es facil pasar por alto una letra cambiada, o faltante, un punto y coma o lo que sea, a veces no son errores fáciles de detectar, sin embargo, supongamos que no hay ningún error de sintaxis, todo está correcto, tampoco hay problemas de versión o etiquetas fuera de lugar, todo debería funcionar pero no lo hace, a simple vista no hay ningún error ni justificación para que no funcione, no tiene sentido que no funcione.

¿Puede pasar que todo “luce” correcto y aun asi decir que “decir unknown directive”? La respuesta es SI y la clave está en la palabra “luce”.

Supongamos que tenemos el siguiente error:

nginx: [emerg] unknown directive "server " in /etc/nginx/conf.d/proxy.conf:3

El archivo donde se ubica el error es el siguiente, la linea 3 corresponde a la etiqueta “server” que es lo primero del archivo, no se ve nada antes, recalco el no se ve y en lugar de decir que no hay nada, tanto si abrimos el archivo en nano,vim o lo inspeccionamos con un cat el contenido es el siguiente:

server {
    listen [::]:80;
    listen 80;

    server_name ejemplo.com www.ejemplo.com;

    return 301 https://www.ejemplo.com$request_uri;
}

¿Cuál es el problema que hay pero no se visualiza? Todo luce bien, sin embargo hay algo mal definitivamente, así que si revisamos con el comando file obtenemos lo siguiente:

$ file /etc/nginx/conf.d/proxy.conf
/etc/nginx/conf.d/proxy.conf: UTF-8 Unicode (with BOM) text

¿Que diablos es BOM?

“UTF-8 Unicode (with BOM) text” es una definición de la codificación de caracteres utilizada en un archivo de texto, en primer lugar tenemos al ya conocido UTF-8. un estándar de codificación de caracteres que representa caracteres Unicode utilizando una secuencia variable de bytes, UTF-8 es compatible con la mayoría de los caracteres utilizados en diferentes idiomas, luego Unicode es un estándar de codificación que asigna un número único a cada carácter utilizado en los sistemas de escritura del mundo

El problema viene con BOM, que significa “Byte Order Mark” (marca de orden de bytes) y es un caracter especial al principio del archivo que indica la codificación utilizada. En este caso, “UTF-8 Unicode (with BOM) text” significa que el archivo utiliza la codificación UTF-8 y tiene un BOM al principio para indicar esto.

El BOM es opcional en los archivos UTF-8 y se utiliza principalmente para identificar la codificación cuando el archivo se abre en diferentes programas o sistemas operativos. Algunos programas pueden utilizar el BOM para reconocer automáticamente la codificación del archivo y mostrarlo correctamente.

El problema es que aunque no se vean, a Nginx no le gustan estos caracteres, si inspeccionamos el archivo con cat -v, el archivo se ve así:

$ cat -v /etc/nginx/conf.d/proxy.conf
server{
M-BM- M-BM- M-BM- M-BM- listenM-BM- [::]:80;
M-BM- M-BM- M-BM- M-BM- listenM-BM- 80;
M-BM- M-BM- M-BM- M-BM- server_name ejemplo.com www.ejemplo.com;

M-BM- M-BM- M-BM- M-BM- return M-BM- 301 https://www.ejemplo.com$request_uri;
}

Y este es en definitiva el problema, esos caracteres que no se ven, pero están y hacen fallar a Nginx porque este si los ve, pero no sabe qué hacer con ellos.

Solución

La solución es bastante simple, con sed podemos remover todos los caracteres de una vez:

sed -i 's/\xc2\xa0/ /g' /etc/nginx/conf.d/proxy.conf

Si efectuamos un cat -v veremos que el problema se solucionó:

$ cat -v /etc/nginx/conf.d/proxy.conf
server{
    listen [::]:80;
    listen 80;

    server_name ejemplo.com www.ejemplo.com;

    return 301 https://www.ejemplo.com$request_uri;
}

Conclusión

Solo resta probar con nginx -t para verificar que el problema haya quedado solucionado, sin embargo esta solución no aplica solo a Nginx, puede ser útil para cualquier archivo de configuración de cualquier servicio que esté fallando, es muy común que copiemos y peguemos texto de nuestra máquina al servidor, o subamos y remplacemos archivos editados en nuestra computadora y estemos agregando caracteres que no se ven, pero bien que nos complican la vida.

Leave a Reply

Your email address will not be published. Required fields are marked *

Discover more from Alvaro De León

Subscribe now to keep reading and get access to the full archive.

Continue reading