Servir des fichiers statiques avec nginx


C’est un truc dont j’ai tout le temps besoin, alors l’article servira de pense bête. Marre de chercher à chaque fois :

        # sur django, on met tout dans /static/, donc par habitude je le fais
        # pour tout
        location /static/ {

            # Le dossier doit contenir le dossier 'static'. Par exemple si votre
            # arbo est /home/sametmax/repo/static, le chemin sera
            # /home/sametmax/repo. Rassurez-vous, personne n'aura accès aux
            # autres sous dossiers de "repo".
            root  /chemin/absolu/vers/dossier/;

            # On active la compression
            gzip  on;
            gzip_http_version 1.0;
            gzip_vary on;
            gzip_comp_level 6;
            gzip_proxied any;
            gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
            gzip_buffers 16 8k;

            # Sauf pour les vieux nav
            gzip_disable ~@~\MSIE [1-6].(?!.*SV1)~@~];

            # On dit au navigateur de le mettre en cache pour 3 mois. Faites gaffe,
            # mettez un param dans les url de vos balises script/link qui change
            # à chaque version du fichier, sinon vous ne pourrez pas mettre à jour
            # vos fichiers.
            expires modified +90d;
        }

10 thoughts on “Servir des fichiers statiques avec nginx

  • foxmask

    @Greg : si le contenu static est … statique, pourquoi faire moins de 90d après tout ? Ca doit être un cas particulier pour eviter de resservir le contenu et laisser les ressources du serveur pour plus important.

  • Marc

    Tiens d’ailleurs à ce sujet, comment faire en sorte que le comportement par défaut dans Django soit de systématiquement suffixer la récupération des statics avec un paramètre ou un timestamp ?

  • Sam Post author

    @Marc : django ne le fais pas mais tu pourrais créer à la main un template tag qui remplace l’original et qui ajoute ce numéro en plus. Comme personne n’a envie de se faire chier, on utilise une app comme ce que suggère guillaume.

  • Von_Tenia

    @Marc, j’ai un faible pour Django-pipeline (https://django-pipeline.readthedocs.org/en/latest/) à la place de compressor. Certes ca demande un peu de parametrage (organiser les fichiers dans un dictionnaire dans settings.py), mais au final on peut gerer tres finement comment les fichiers vont être groupés (backend-min.js, public-min.js, common-min.js…). Et le tagging se fait automatiquement. J’ai peut etre passé quelques heures à comprendre mais au final je ne reviendrai pas en arrière

    Merci Sam pour le récapitulatif, c’est vrai que c’est des settings a garder sous la main.

  • Marc

    Testé et approuvé django-compressor. Très efficace et pas prise de tête. Merci. ;)

  • Herve

    Perso je prefere créer un sous domaine dédié à la gestion des statiques ex: static.monsite.fr

    Dans ton fichier de settings pour tu te crées deux conf en fonction de la valeur de DEBUG (Suis-je en dev ou en prod) et tu valorise :

    STATIC_URL = '/static/'

    if not DEBUG:

    STATIC_URL = 'http://static.monsite.fr'

    ça t’évite d’avoir économise de la bande passante à ton serveur en évitant l’envoie de cookies à chaques fois, et de plusinutile dans ce cas là…

    Pour chacun de mes sites j’ai deux voir trois (cas des medias) hotes virtuels nginx et deux à trois sous domaines : http://www.monsite.fr static.monsite.fr media.monsite.fr

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.