Probar si el encabezado X-Sendfile está funcionando

3 minutos de lectura

avatar de usuario
dalethedeveloper

Estoy buscando una manera de confirmar si X-Sendfile está manejando correctamente las solicitudes devueltas al servidor web por un script (PHP). Las imágenes se sirven correctamente, pero pensé que vería el encabezado en las solicitudes de curl.

$ curl -I http://blog2.stageserver.net/wp-includes/ms-files.php?file=/2011/05/amos-lee-feature.jpg
HTTP/1.1 200 OK
Date: Wed, 04 Jan 2012 17:19:45 GMT
Server: Cherokee/1.2.100 (Arch Linux)
ETag: "4dd2e306=9da0"
Last-Modified: Tue, 17 May 2011 21:05:10 GMT
Content-Type: image/jpeg
Content-Length: 40352
X-Powered-By: PHP/5.3.8
Content-Disposition: inline; filename="amos-lee-feature.jpg"

Configuración

Cherokee 1.2.100 con PHP-FPM 5.3.8 en FastCGI:
cherokee.conf: vserver!20!rule!500!handler!xsendfile = 1

(Establecido por vServer> Comportamiento> Extensiones php> Controlador: Permitir X-Sendfile [check Enabled])

Red de WordPress / WPMU 3.3.1:
define('WPMU_SENDFILE',true); se establece en el wp-config.php lo siguiente justo antes wp-settings.php está incluido. Esto activará el siguiente código para que se ejecute en wp-includes/ms-files.php:50 de WP sirve archivos para un blog en particular:

header( 'X-Sendfile: ' . $file );
exit;

He confirmado que el fragmento anterior se está ejecutando agregando un encabezado adicional para la disposición justo antes del exit(); llamar. Esa disposición de contenido está presente con los resultados de curl anteriores y no originalmente en el código ms-files.php. El código que se agregó es:
header('Content-Disposition: inline; filename="'.basename($file).'"');


Investigar

Tengo:

  • Se reiniciaron los demonios php-fpm / cherokee después de realizar cambios en la configuración.
  • Intenté varios trucos en los comentarios en php.net/readfile y reemplazó el encabezado simple en ms-files.php con código más completo de ejemplos.
    • php.net/manual/en/function.readfile.php
    • www.jasny.net/articles/how-i-php-x-sendfile/
    • *codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/*
  • Confirmado [cherokee support][5] y probado [with and without][6] compresión aunque no creo que se aplique ya que mis imágenes se están publicando correctamente. También encontré un problema sospechosamente similar en una publicación de lighttpd.
    • *cherokee-project.com/doc/other_goodies.html*
    • code.google.com/p/cherokee/issues/detail?id=1228
    • webdevrefinery.com/forums/topic/4761-x-sendfile/
  • Encontré una propaganda aquí en SO que puede indicar que el encabezado se elimina
    • stackoverflow.com/questions/7296642/django-understanding-x-sendfile
  • Se probó que los encabezados anteriores son consistentes con curl, wget, Firefox, Chrome y web-sniffer.net.
  • Descubrí que todavía no puedo publicar más de 2 enlaces debido a la falta de reputación.

Preguntas

  • Voluntad X-Sendfile estar presente en los encabezados cuando funciona correctamente o se elimina?
  • ¿Se pueden utilizar los registros de acceso para determinar si X-Sendfile ¿está trabajando?

Estoy buscando consejos generales para la solución de problemas o información aquí, no necesariamente específicos de PHP / Cherokee.

Actualizar

Encontré una forma adecuada de confirmar X-Sendfile o X-Accel-Redirect en un entorno de prueba o sandbox: deshabilite X-Sendfile y verifique los encabezados.

Con Permitir X-Sendfile deshabilitado en Cherokee:

$ curl -I http://blog2.stageserver.net/wp-includes/ms-files.php?file=/2011/05/amos-lee-feature.jpg
HTTP/1.1 200 OK
Date: Fri, 06 Jan 2012 15:34:49 GMT
Server: Cherokee/1.2.101 (Ubuntu)
X-Powered-By: PHP/5.3.6-13ubuntu3.3
Content-Type: image/jpeg
X-Sendfile: /srv/http/wordpress/wp-content/blogs.dir/2/files/2011/05/amos-lee-feature.jpg
Content-Length: 40352

La imagen no se cargará en los navegadores, pero puede ver que el encabezado está presente. Después de volver a habilitar Permitir X-Sendfile, la imagen se carga y puede estar seguro de que X-Sendfile está funcionando.

De acuerdo con la fuente en github Se eliminarán los encabezados de X-Sendfile.

Si estoy hojeando el archivo correctamente, solo está registrando correctamente si se ha compilado en modo de depuración.

  • Interesante, además he comprobado la fuente de Cherokee y nginx. Parece que todos eliminan los encabezados o los reconstruyen a partir de un conjunto en blanco.

    – dalethedeveloper

    5 de enero de 2012 a las 15:10


Puede verificar el uso de memoria para enviar archivos grandes con y sin xsendfile.

  • Buena sugerencia, pero no algo para jugar en servidores en un entorno en vivo. Tal vez sea necesario realizar algunas pruebas de sandbox.

    – dalethedeveloper

    5 de enero de 2012 a las 15:18

Se están eliminando, simplemente porque tenerlos presentes evitará una de las razones para usarlo, a saber, hacer que el archivo se entregue sin que el destinatario sepa la ubicación del archivo que se entrega.

¿Ha sido útil esta solución?