Habilitando la compresión en Heroku usando python

Google ahora penaliza por no ser tan móvil. Así que en un esfuerzo por mejorar las cosas, recomienda comprimir gran parte de mi Javascript con Gzip o Desinflar. He visto algunas recomendaciones antiguas sobre el desbordamiento de stack, pero no hay nada fuera de la caja e intenté buscar complementos, pero hasta ahora no parece haber nada que haga el truco. ¿Cuál es el menos doloroso y robusto de comprimir o habilitar gzip?

Esto es lo que Google sugiere que haga:

Habilitar compresión Los recursos de compresión con gzip o desinflar pueden reducir la cantidad de bytes enviados a través de la red. Habilite la compresión para los siguientes recursos para reducir su tamaño de transferencia en 420 KB (reducción del 74%).

Estoy usando Django si eso lo hace más fácil.

Bottom Line Up Front – Dependerá de los detalles de su aplicación … ¿Flask? Django? uWSGI? whitenoise y gunicorn parecen ser los marcos de “ir a” en Heroku, así que eso es lo que usé en el siguiente ejemplo. Debería traducirse a otros marcos.

Explicación: lo esencial de la recomendación de Google es minimizar el número de bytes transferidos físicamente desde el servidor. Hay varias formas de hacerlo, pero entre el impacto más alto, sin ningún orden en particular:

  • Reducir JavaScript y CSS
  • Fusionar esos archivos juntos
  • Manipular el comportamiento del caché.
  • Comprimir el cuerpo de respuesta HTTP

La recomendación citada se ocupa de ese último bit, y es importante comprender que comprimir el cuerpo de la respuesta es parte de la “negociación de contenido” en la especificación HTTP: el navegador no solo solicita un recurso en particular a través de la URL; también proporciona sugerencias sobre su representación preferida de ese recurso, por ejemplo, qué tipo de contenido, cómo se codifica, puede enviarse en múltiples “fragmentos”, etc.

Por lo tanto, idealmente, la capa de la aplicación que maneja HTTP debería manejar esta tarea en particular. En una stack de aplicaciones típica, eso significaría un servidor web como Apache o nginx, en el cual el servidor web enviará solicitudes de rutas dinámicas específicas a su marco web y manejará el contenido “estático” directamente.

Sin embargo, en Heroku, la capa HTTP se divide entre la plataforma en sí y su aplicación; la “malla de enrutamiento” actúa como un proxy inverso, manejando HTTP básico y HTTPS y mejorando las solicitudes al inyectar encabezados con información de proxy, por ejemplo; Todo lo demás depende de tu aplicación. Sin embargo, su “aplicación” está bastante restringida, ya que no tiene reinado libre para instalar nginx, etc.

La mayoría de los marcos web (Django, Flask, Rails, Play, etc., etc.) están muy generalizados y pueden funcionar en conjunto con un servidor web externo (recomendado para producción) o pueden funcionar de forma independiente, proporcionando sus propios servidores web, generalmente ligeros (Recomendado para el desarrollo). Los marcos también se combinan bien con los “contenedores” que proporcionan el entorno de tiempo de ejecución para la aplicación y el trabajo pesado en la capa HTTP (uWSGI, Gunicorn, Rack, etc.)

Esta es la opción para ir con Heroku. Aunque tengo más experiencia con uWSGI, el siguiente ejemplo es para Flask + Gunicorn + WhiteNoise (la biblioteca preferida para servir archivos estáticos en Heroku en Python). Tenga en cuenta que WhiteNoise también funciona con Django, por lo que adaptarlo debería ser trivial, si Django es el marco de su elección. Entonces, toda esa exposición resulta en dos pasos muy simples para comenzar:

  • Agregue whitenoise a sus requirements.txt
  • Modifique la aplicación WSGI para que WhiteNoise “ajuste” su aplicación.

Por ejemplo:

 from flask import Flask from whitenoise import WhiteNoise flapp = Flask(__name__) #use a subdirectory for root, otherwise, the actual .py files can be served... app = WhiteNoise(flap, root='./static/') #define your routes: @flapp.route('/') def home_page(): #etc. etc. 

Esto le dará contenido gzip si el cliente envía un encabezado “Aceptar-Encoding: gzip”. Hay muchas, muchas otras palancas y mandos para tirar y ajustar, pero este es un punto de partida. Finalmente, te preocuparás por la sobrecarga de la CPU y querrás comprimir previamente los archivos; o puede decidir que descargar archivos estáticos es el camino a seguir.

Para verificar, use una herramienta como cURL para agarrar un archivo estático:

 curl -i -H "Accept-Encoding: gzip" http://yourapp.herokuapp.com/path/to/static 

La bandera -i debe imprimir los encabezados, que le mostrarán los detalles de cómo se atendió la solicitud. Tenga en cuenta la encoding de contenido

 HTTP/1.1 200 OK Connection: keep-alive Server: gunicorn/19.3.0 Date: Wed, 20 May 2015 15:33:35 GMT Last-Modified: Wed, 20 May 2015 15:26:06 GMT Content-Type: text/html; charset="utf-8" Cache-Control: public, max-age=60 Access-Control-Allow-Origin: * Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 662 Via: 1.1 vegur 

Espero que esto ayude…