J’utilise la fonctionnalité de pipeline des ressources de rails dans l’environnement de production. J’ai écrit des parameters dans nginx pour envoyer des fichiers au format gzip et les fichiers arrivent correctement au format gzip. si les fichiers js sont au format gizp ou non.
J’ai mis la commande suivante et je reçois “encodage-contenu: zip” dans la réponse.
curl -v -H 'Accept-Encoding: gzip' -o /dev/null http://www.example.com/assets/style.css 2>&1 | grep -i Content-Encoding
J’ai écrit ci-dessous la configuration de nginx pour envoyer des fichiers au format gzip et les fichiers arrivent correctement au format gzip.
location ~ ^/(assets)/ { root /home/webuser/app/woa/public; gzip_static on; expires max; add_header Cache-Control public; # access_log /dev/null; }
Comment saurai-je que les fichiers arrivent au format gzip ou non?
Veuillez également suggérer d’autres options qui peuvent être utiles pour améliorer les performances du site.
Pas une réponse directe à votre première question (si vous l’avez résolue, veuillez l’expliquer), mais pour améliorer les performances du site, souvenez – vous de la règle d’or Perfomance :
80 à 90% du temps de réponse de l’utilisateur final est consacré au serveur frontal. Commencez par là
Vous trouverez ci-dessous une liste non exhaustive des domaines d’amélioration de la performance dans une application Rails:
Un outil de diagnostic utile pour identifier les problèmes de performance est Yslow ou Google Page Speed. Ce sont des extensions de navigateur qui diagnostiquent et identifient les problèmes courants qui ralentissent votre application (en particulier sur le front-end).
Pour votre back-end Rails, je vous recommande d’incorporer des outils tels que Bullet & NewRelic directement dans vos processus de développement, de sorte que, pendant que vous développiez, vous puissiez détecter immédiatement les mauvaises requêtes tout en restant faciles à corriger.
La vérification des journaux de votre serveur est une méthode efficace pour diagnostiquer les composants de votre application Rails qui prennent le plus de temps. Ci-dessous, par exemple, des exemples de journaux provenant de deux applications Rails de production non liées exécutées dans mon environnement de développement local:
# app1: slowish Rendered shared/_header.html.erb (125.9ms) Rendered clients/details.html.erb within layouts/application (804.6ms) Completed 200 OK in 3655ms (Views: 566.9ms | ActiveRecord: 1236.9ms) # app2: debilitatingly slow Rendered search/_livesearch_division_content.js.erb (5390.0ms) Rendered search/livesearch.js.haml (34156.6ms) Completed 200 OK in 34173ms (Views: 31229.5ms | ActiveRecord: 2933.4ms)
App1 et App2 souffrent tous deux de problèmes de performance, mais les problèmes de performances d’App2 sont clairement ralentis. (34 secondes!) Mais avec ces journaux de serveur, je sais pour App1 que je devrais regarder dans clients/details.html.erb
, et que pour App2, je dois absolument rechercher search/livesearch.js.haml
.
Pour maintenir des temps de chargement rapides, vous devez réduire la quantité / taille de vos ressources de page (JS / CSS / Images). Pensez donc à la taille de votre page comme à un budget. Par exemple, Hootesuite a récemment déclaré que sa page d’accueil avait désormais un budget de taille de 1 Mo ssortingct . Aucune exception. Maintenant, consultez leur page. Assez vite n’est ce pas?
Les gains faciles pour réduire la taille de votre page incluent la suppression des fichiers JS ou CSS inutilisés, y compris les cas échéant, et la modification des images statiques en vecteurs beaucoup plus petits.
Le chargement de l’image est une cause importante de temps de chargement de page lent. Une grande image de 5 Mo utilisée en arrière-plan de votre page de démarrage peut facilement être réduite à une taille de 200 Ko à 400 Ko, tout en étant suffisamment haute qualité pour ne pas pouvoir être distinguée de l’original haute résolution. La différence de temps de chargement des pages sera dramatique.
Vous devez également apporter les mêmes améliorations aux images téléchargées par les utilisateurs. Par exemple, si les avatars des utilisateurs de votre site Web ont une taille de 50 x 50 pixels, mais qu’un utilisateur télécharge une image de 5 Mo pour son avatar, il est essentiel que les tailles et les résolutions des fichiers soient plus faibles.
Carrierwave , Fog et rmagick sont des gems populaires utilisés avec Amazon S3 pour améliorer le chargement des images. Avec cette collection de paquets, vous pouvez servir de façon dynamic des résolutions d’image plus petites en fonction de la taille d’écran de chaque utilisateur. Vous pouvez ensuite utiliser les requêtes multimédias pour que les appareils mobiles soient traités avec des images de résolution plus petites que celles des écrans Retina.
En ajoutant au dernier point, vous pouvez accélérer les temps de chargement des éléments / images en utilisant un réseau de dissortingbution de contenu (Content Delivery Network, CDN) tel que Cloudfront. Les CDN dissortingbuent des ressources sur de nombreux serveurs, puis diffusent des ressources à vos utilisateurs via des serveurs situés le plus près de l’utilisateur effectuant la demande.
Lorsque des actifs statiques sont dotés d’empreintes digitales, lorsqu’un utilisateur visite votre page, leur navigateur met en cache une copie de ces actifs, ce qui signifie qu’ils n’ont plus besoin d’être rechargés pour la prochaine demande.
Les fichiers Javascript placés en bas de la page seront chargés après le chargement de la page. Si les ressources javascript sont placées en haut de la page, la page restra vierge car le navigateur d’un utilisateur tente de charger vos fichiers javascript. Heureusement, Rails place automatiquement les fichiers JavaScript au bas de votre page si vous utilisez le pipeline de ressources ou spécifiez des fichiers javascript à l’aide de javascript_include_tag
.
EDIT: La plupart des navigateurs modernes optimisent maintenant le chargement de Javascript automatiquement, vous pouvez donc ignorer ce conseil.
Parmi toutes les optimisations de performances du backend, la mise en cache est parmi les plus efficaces pour produire des gains de performances spectaculaires. Un régime de mise en cache bien implémenté peut considérablement réduire les dommages causés par les requêtes inefficaces dans votre backend pendant les périodes de forte évolutivité. Le contenu auquel on accède fréquemment, mais qui change relativement rarement, bénéficie le plus de la mise en cache.
La mise en cache est si puissante qu’elle a ramené le temps de chargement de la page de l’App2 mentionné ci-dessus de 34 secondes à moins d’une seconde en production. Il n’y a tout simplement aucune autre amélioration des performances en arrière-plan qui puisse être encore plus proche de celle de la mise en cache.
Dans l’ensemble, lors de l’optimisation des performances avec la mise en cache, démarrez haut, puis bas . Les gains que vous obtiendrez seront plus importants pour moins d’effort.
De haut en bas, certains types de mise en cache sont à votre disposition:
Pour en savoir plus sur la mise en cache, un bon sharepoint départ est le suivant: http://guides.rubyonrails.org/caching_with_rails.html
Si vous utilisez SQL pour votre couche de firebase database, veillez à spécifier des index sur les tables de jointure pour des recherches plus rapides sur les grandes associations fréquemment utilisées. Vous devez les append explicitement lors des migrations car l’ indexation n’est pas incluse par défaut dans Rails.
Un des principaux indicateurs de performance des applications Rails utilisant des bases de données relationnelles (SQL) est N + 1 . Si vous voyez dans vos journaux que votre application fait de nombreuses lectures / écritures de firebase database pour une seule requête, alors c’est souvent un signe que vous avez N + 1 requêtes. Il est facile de rater des requêtes N + 1 lors du développement, mais peut rapidement paralyser votre application au fur et à mesure que votre firebase database se développe (j’ai déjà traité douze requêtes N + 1). minute à charger).
Bullet est un excellent bijou pour capturer les requêtes N + 1 dès que vous développez votre application. Une méthode simple pour résoudre les requêtes N + 1 dans votre application Rails consiste à charger le modèle associé si nécessaire. Par exemple, Post.all
passe à Post.includes(:comments).all
si vous chargez tous les commentaires de chaque publication sur la page.
La nouvelle version de Rails contient de nombreuses améliorations de performances pouvant accélérer votre application (comme Turbolinks).
Ruby 2.1.x + contient une bien meilleure récupération de la mémoire par rapport aux anciennes versions de Ruby. Jusqu’à présent, les rapports de mise à niveau de personnes ont constaté des améliorations notables en termes de performances grâce à la mise à niveau.
Il me manque de nombreuses améliorations ici, mais ce sont quelques améliorations de performances que je peux recommander. Je vais append plus quand j’ai le temps.