¿Cuáles son los diferentes usos de los sitios disponibles frente al directorio conf.d para nginx?

99

Tengo algo de experiencia usando Linux pero ninguno usando nginx. Me encargaron investigar las opciones de equilibrio de carga para un servidor de aplicaciones.

He usado apt-get para instalar nginx y todo parece estar bien.

Tengo un par de preguntas.

¿Cuál es la diferencia entre la carpeta de sitios disponibles y la carpeta conf.d? Ambas carpetas estaban INCLUIDAS en la configuración de configuración predeterminada para nginx. Los tutoriales usan ambos. ¿Para qué son y cuál es la mejor práctica?

¿Para qué se utiliza la carpeta habilitada para sitios? ¿Como lo uso?

La configuración predeterminada hace referencia a un usuario de www-data? ¿Tengo que crear ese usuario? ¿Cómo le doy a ese usuario permisos óptimos para ejecutar nginx?

Seth Spearman
fuente
Trate de evitar el desplazamiento del alcance cuando haga una pregunta; www-dataEs un tema aparte. La mayoría de los sistemas operativos definen un usuario separado con permisos más bajos que el proceso puede ejecutar después de vincularse al puerto 80 como root. Está definido en el archivo de configuración. Aplicar prácticas básicas de seguridad desde allí; no permita que el usuario escriba en nada en lo que el servidor web no deba escribir, no permita que otros usuarios escriban en los archivos a menos que sea deliberado.
Andrew B

Respuestas:

94

Las carpetas sites- * son administradas por nginx_ensitey nginx_dissite. Para los usuarios de httpd de Apache que encuentran esto con una búsqueda, los equivalentes son a2ensite/ a2dissite.

La sites-availablecarpeta es para almacenar todas las configuraciones de vhost, estén o no habilitadas actualmente.

La sites-enabledcarpeta contiene enlaces simbólicos a archivos en la carpeta de sitios disponibles. Esto le permite desactivar selectivamente vhosts eliminando el enlace simbólico.

conf.dhace el trabajo, pero debe mover algo fuera de la carpeta, eliminarlo o hacer cambios cuando necesite deshabilitar algo. La abstracción de la carpeta sites- * hace que las cosas estén un poco más organizadas y le permite administrarlas con scripts de soporte independientes.

(a menos que sea como yo, y uno de los muchos administradores de Debian que solo administraron los enlaces simbólicos directamente, sin saber sobre los scripts ...)

Andrew B
fuente
12
¿Me equivoqué? No entiendo el voto negativo.
Andrew B
1
Tengo curiosidad, ¿está integrado en nginx? instalé manualmente github.com/perusio/nginx_ensite
lfender6445
18
Es importante tener en cuenta que sites-available|sites-enabledes un Debian-ism y no es algo que hacen nginx o Apache. Probablemente fue bastante útil en el pasado, pero su utilidad es algo limitada en una era de administración de configuración y contenedores.
Michael Hampton
¿Puede comentar cómo la administración de la configuración y los contenedores limitan la utilidad de sitios disponibles | habilitados para sitios?
karthik vee
1
@karthikvee el punto es que hoy en día los servidores a menudo aparecen como contenedores efímeros que sirven solo a un único sitio web / servicio, por lo que esto puede incluirse nginx.confsin pérdida de legibilidad. Esto es opuesto al enfoque de hace unos años cuando los servidores normalmente almacenaban decenas de sitios web.
adamczi
38

Me gustaría agregar a las respuestas anteriores que lo más importante no es cómo llamar a los directorios (aunque es una convención muy útil), sino lo que realmente pones nginx.conf. Configuración de ejemplo:

http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
    include /etc/nginx/sites-enabled/my_own_conf;
...
}

La única directiva utilizada aquí es include , por lo que no hay diferencia interna entre eg conf.d/y sites-enabled/.

De la documentación anterior:

Syntax:     include file | mask;
Default:    —
Context:    any

Includes another file, or files matching the specified mask, 
into configuration. Included files should consist of 
syntactically correct directives and blocks.

Entonces, para responder a la pregunta original: no existe una diferencia interna, y puede usarlas de la mejor manera posible, recordando los consejos de las otras respuestas. Y, por favor, no olvides elegir la respuesta "correcta".

Yaroslav Nikitenko
fuente
1
Correcto, sites-enabledha sido inventado de alguna manera por alguna distribución, confundiéndose como lo hace un molesto intermediario. Vaya a buscar nginx de la fuente oficial : obtendrá un producto actualizado, así como deshacerse de esta basura de la configuración / infierno.
Bernard Rosset
2
Esto explica por qué no hay una sola referencia de esta convención de nombres en la documentación oficial de Nginx. Es un proyecto de terceros! github.com/perusio/nginx_ensite
AxeEffect
30

Normalmente, la sites-enabledcarpeta se usa para definiciones de host virtual, mientras que conf.dse usa para la configuración global del servidor. Si admite varios sitios web, es decir, hosts virtuales, cada uno obtiene su propio archivo, por lo que puede habilitarlos y deshabilitarlos muy fácilmente moviendo sites-enabledy quitando archivos (o creando y eliminando enlaces simbólicos, lo que probablemente sea una mejor idea)

Úselo conf.dpara cosas como la carga de módulos, archivos de registro y otras cosas que no son específicas de un solo host virtual.

La configuración predeterminada hace referencia a un usuario de www-data? ¿Tengo que crear ese usuario?

Debería tener nginx ejecutándose como usuario no root. En algunos casos www-data, se llama así , pero puede nombrarlo como desee.

¿Cómo le doy a ese usuario permisos óptimos para ejecutar nginx?

Estoy menos seguro de la respuesta a esta pregunta (no estoy ejecutando nginx en este momento), pero si se parece a Apache, la respuesta es que el www-datausuario solo necesita permisos de lectura para cualquier archivo estático (y leer + ejecutar en directorios ) que está publicando, o lee / ejecuta permisos en cosas como scripts CGI, y no tiene permisos en ningún otro lugar.

larsks
fuente
1
tener un usuario dedicado para ejecutar el servidor web también es importante debido a que deshabilita la capacidad de inicio de sesión para este usuario al eliminar un registro de shell válido.
DukeLion
> 'Deberías tener nginx ejecutándose como usuario no root'. ¿Podrías dar más detalles sobre esto?
lfender6445
1
Ejecutar como un usuario sin privilegios es una forma de contener el daño que podría resultar de un compromiso remoto. Si está ejecutando un servidor web como rooty hay un compromiso remoto de algún tipo, el atacante inmediatamente tiene acceso completo al sistema. Cuando se ejecuta como un usuario sin privilegios, el acceso administrativo solo estará disponible en combinación con algún tipo de explotación local.
larsks
14

¿Que esta pasando?

Debe estar utilizando Debian o Ubuntu, ya que el mal sites-available / sites-enabledlógica no es utilizado por el paquete ascendente de nginx de http://nginx.org/packages/ .

En cualquier caso, ambos se implementan como una convención de configuración con la ayuda de la includedirectiva estándar en /etc/nginx/nginx.conf.

Aquí hay un fragmento de /etc/nginx/nginx.confun paquete oficial de nginx de nginx.org:

http {
    …
    include /etc/nginx/conf.d/*.conf;
}

Aquí hay un fragmento de /etc/nginx/nginx.confDebian / Ubuntu :

http {
    …
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Por lo tanto, desde el punto de vista de NGINX, la única diferencia sería que los archivos conf.dse procesarán antes y, por lo tanto, si tiene configuraciones que entran en conflicto silenciosamente entre sí, entonces las de conf.dpueden tener prioridad sobre las que se encuentran sites-enabled.


La mejor práctica es conf.d.

Debería usarlo /etc/nginx/conf.d, ya que es una convención estándar, y debería funcionar en cualquier lugar.

Si necesita deshabilitar un sitio, simplemente cambie el nombre del nombre del archivo para que ya no tenga un .confsufijo, es muy fácil, directo y a prueba de errores:

sudo mv -i /etc/nginx/conf.d/default.conf{,.off}

O lo contrario para habilitar un sitio:

sudo mv -i /etc/nginx/conf.d/example.com.conf{.disabled,}


Evitar sites-availabley sites-enableda toda costa.

No veo absolutamente ninguna razón para usar sites-available/ sites-enabled:

  • Algunas personas han mencionado nginx_ensitey nginx_dissitescripts, los nombres de estos scripts son incluso peores que el resto de esta debacle, pero estos scripts tampoco se encuentran en ninguna parte, están ausentes del nginxpaquete incluso en Debian (y probablemente también en Ubuntu) , y no presente en un paquete propio, además, ¿realmente necesita un script de terceros no estándar completo para simplemente mover y / o vincular los archivos entre los dos directorios?

  • Y si no está utilizando los scripts (que, de hecho, es una opción inteligente según lo anterior), entonces surge el problema de cómo administra los sitios:

    • ¿Creas enlaces simbólicos de sites-availablea sites-enabled?
    • Copiar los archivos?
    • Mover los archivos?
    • Editar los archivos en su lugar en sites-enabled?

Lo anterior puede parecer algunos problemas menores que abordar, hasta que varias personas comiencen a administrar el sistema, o hasta que tome una decisión rápida, solo para olvidarse de eso meses o años más adelante ...

Lo que nos lleva a:

  • ¿Es seguro eliminar un archivo sites-enabled? ¿Es un enlace suave? Un enlace duro? ¿O la única copia de la configuración? Un excelente ejemplo de infierno de configuración.

  • ¿Qué sitios han sido deshabilitados? (Con conf.d, simplemente haga una búsqueda de inversión de archivos que no terminen con .conf- find /etc/nginx/conf.d -not -name "*.conf", o use grep -v).

No solo todo lo anterior, sino que también tenga en cuenta la includedirectiva específica utilizada por Debian / Ubuntu /etc/nginx/sites-enabled/*: no se especifica ningún sufijo de nombre de archivo sites-enabled, a diferencia de conf.d.

  • Lo que esto significa es que si un día decides editar rápidamente uno o dos archivos /etc/nginx/sites-enabledy emacscreas un archivo de respaldo como default~, de repente, tienes ambos defaulte default~incluidos como configuración activa, lo que, dependiendo de las directivas utilizadas, puede que ni siquiera te dé le avisa y provoca una sesión de depuración prolongada. (Sí, me pasó a mí; fue durante un hackathon, y estaba totalmente desconcertado de por qué mi conf no estaba funcionando).

Por lo tanto, estoy convencido de que sites-enabledes puro mal!

cnst
fuente
Además de todo lo anterior, aparentemente, ¡también es muy común crear enlaces simbólicos incorrectos! stackoverflow.com/a/14107803/1122270 ¡En caso de que no pensaras que sites-enabledera lo suficientemente malvado!
cnst
O, a veces, puede suceder que alguien decida editar los archivos sites-enabled, y luego otra persona decida deshabilitarlo eliminándolo, posiblemente pensando que era solo un enlace simbólico, que requiere un volcado de memoria posterior de nginx heap para recuperar el archivo conf: stackoverflow.com/q/45852224/1122270
cnst
Tengo que estar en desacuerdo con las afirmaciones sobre sites-availabley sites-enabled; es importante poder preparar archivos de configuración fuera del directorio de recolección 'en vivo' de tal manera que si nginx fuera recargado o reiniciado, no recogería archivos de configuración parciales. También puede ser útil mantener archivos de configuración que ya no están en uso activo. Crear enlaces simbólicos no es una tarea particularmente difícil si tienes la experiencia suficiente para administrar nginx en primer lugar, IMO.
BE77Y
@ BE77Y está adoptando un enfoque más complicado. En programación, se considera la mejor práctica eliminar completamente el código no utilizado, no solo deshabilitarlo o comentarlo; No veo ninguna razón por la que DevOps debería ser diferente: si ya no se necesita una configuración, elimínela (aún debería existir en su VCS). Lo mismo ocurre con los archivos conf parciales: ¿por qué los editaría habilitado y volvería a cargar nginx a sus espaldas? ( USR1que vuelve a abrir registros, no vuelve a cargar conf.) Encuentro que sus comentarios de "experiencia" de enlace simbólico están mal dirigidos: el problema es una cuestión de coherencia, que tiene poco que ver con la experiencia.
cnst
2
Está claro que a) este no es el medio apropiado para esta discusión y quizás aún más importante, b) es probable que sea inútil en cualquier caso. Acordemos estar en desacuerdo.
BE77Y