¿Cómo configurar nginx para servir contenido estático de RAM?

11

Quiero configurar Nginx como mi servidor web. Quiero tener archivos de imagen en caché en la memoria (RAM) en lugar de en el disco. Estoy sirviendo una página pequeña y quiero algunas imágenes siempre servidas desde RAM. No deseo usar Varnish (ni ninguna otra herramienta similar) para esto, ya que creo que Nginx tiene la capacidad de almacenar en caché el contenido en la RAM. ¿No estoy seguro de cómo puedo configurar Nginx para esto? Intenté algunas combinaciones pero no funcionaron. Nginx usa el disco todo el tiempo para obtener las imágenes.

Por ejemplo, cuando probé el benchmark Apache para probar con el siguiente comando:

ab -c 500 -n 1000 http://localhost/banner.jpg

Obtuve el siguiente error:

socket: Too many open files (24)

Supongo que esto significa que Nginx está intentando abrir demasiados archivos simultáneamente desde el disco y el sistema operativo no permite esta operación. ¿Alguien puede sugerirme una configuración correcta?

Vijayendra
fuente
Seguramente estás adivinando mal. Además, ¿de dónde sacas el error?
womble
@womble Como comento a continuación, el problema podría ser la concurrencia. Hay muchos hilos que intentan simultáneamente antes de que el contenido esté disponible en la memoria. ¿Puede explicar por qué creo que estoy adivinando mal?
Vijayendra

Respuestas:

9

Si se trata de contenido estático, se almacenará en la memoria caché de forma predeterminada (a menos que no quede memoria), pero no por nginx, sino por sistema operativo; todo lo que quedará en el lado del disco será stat ().

Si desea una solución de memoria al 100%, puede configurar ramdisk y servir datos desde allí.

c2h5oh
fuente
Sí, entiendo que el sistema operativo almacena en caché los contenidos en la memoria. Pero se supone que el archivo ya está disponible en la memoria. El problema podría ser la concurrencia. Hay muchos hilos que intentan simultáneamente antes de que el contenido esté disponible desde la memoria. ¿Qué piensas?
Vijayendra
1
Eso es solo un problema si el número de solicitudes va de 0 a 500 en un instante: una vez que se lea el archivo, se almacenará allí hasta que se necesite la memoria (el archivo utilizado menos recientemente se elimina de la memoria caché si la memoria está llena y se necesita un archivo nuevo) ser almacenado en caché). Las probabilidades de que eso ocurra en la vida real son escasas o nulas. Si está seguro de que es un riesgo real, utilice la solución de ramdisk en su lugar, solo asegúrese de restaurar los datos en ramdisk después de cada reinicio; por definición, ramdisk no es un almacenamiento persistente.
c2h5oh
Ok, intentaré ramdisk y veré cómo funciona. Gracias por la respuesta.
Vijayendra
9

Una vez que el servidor ha leído un archivo del disco, se almacenará en la memoria caché en la memoria RAM (y se reemplazará por un archivo diferente si no tiene memoria RAM), el problema está en el límite de su cuenta, no puede abrir tantos archivos ( ejecute 'ulimit -a'),

Si desea cambiar este límite, lea sobre /etc/security/limits.conf

Avi Keinan
fuente
1
Tiene razón, el límite de archivo abierto fue un problema ya que el límite es 256 en mi sistema. Pero aún necesito descubrir cómo configurar Nginx para leer archivos de la memoria en lugar del disco. No deseo cambiar el límite de mi archivo abierto y prefiero lograr el uso de caché para solicitudes posteriores.
Vijayendra
44
"No deseo cambiar mi límite de archivo abierto", lo estás haciendo mal. Oh, muy, muy mal.
womble
3
@womble Entiendo que para solucionar el problema, la solución más fácil es cambiar el límite. La razón por la que no quiero cambiar este límite es para ver qué puedo hacer mejor con la configuración sin cambiar el límite. Creo que puedo mejorar las cosas cambiando algunos otros aspectos del almacenamiento en caché y la configuración. Y, por cierto, ¿puede por favor darle razones / sugerencias mientras afirma por qué alguien está equivocado? Incluso en tu primer comentario hiciste esto sin dar ninguna razón. Este es un lugar para dar sugerencias profesionales, deje de tratarlo como su muro de Facebook.
Vijayendra
7

Así que sé que esto es muy viejo, pero aquí va.

  1. Nginx no hace el almacenamiento en memoria caché de la caja, querrá ver memcache para esto, recomendaría el paquete openresty para esto: http://openresty.org/. Lo que sale de la caja (como se respondió anteriormente es el caché de la página)
  2. Ese mensaje de error, estoy casi seguro, es de ab no de nginx, los errores de nginx para los límites de los archivos se ven así: "falló (24: demasiados archivos abiertos)". Recuerde que en los sockets de Unix también hay archivos, por lo que para el usuario que está ejecutando ab, debe ajustar su ulimit para que esa sesión ejecute ab. Como usted dijo que su límite era 256, le está pidiendo a ab que use 500 conexiones, esto está maximizando su límite.
Ben Whitaker
fuente
Ben Whitaker tenía razón, el problema vino de ab, que intenta crear 500 sockets <=> archivos (en linux os).
bachden
2

¡Un archivo en caché en RAM sigue siendo un archivo!

Intente utilizar el módulo de caché Memcached de Nginx en su lugar. Pero aún así, 1000 conexiones concurrentes son enormes, ¿crees que es tu caso?

Thomas Decaux
fuente