web-dev-qa-db-fra.com

L'ajout de la directive "expire" dans Nginx conf for assets provoque des erreurs "404 non trouvé"

J'ai un live Django site sous gunicorn, nginx, supervisord. J'essaie de mettre en œuvre les suggestions trouvées ici pour augmenter mon score de vitesse de page en utilisant gzip dans nginx. Le fichier de configuration résultant est le suivant:

upstream app_server_wsgiapp {
   server 127.0.0.1:8000 fail_timeout=0;
}

server {
   listen 80;
   server_name www.example.com;
   return 301 https://www.example.com$request_uri;
}

server {
    server_name           www.example.com;
    listen                443 ssl;

    if ($Host = 'example.com') {
      return 301 https://www.example.com$request_uri;
    }

    ssl_certificate       /etc/nginx/example/example.crt;
    ssl_certificate_key   /etc/nginx/example/example.key;
    ssl_session_timeout   1d;
    ssl_session_cache     shared:SSL:50m;
    ssl_protocols         TLSv1.1 TLSv1.2;
    ssl_ciphers           'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_prefer_server_ciphers   on;
    access_log            /var/log/nginx/www.example.com.access.log;
    error_log             /var/log/nginx/www.example.com.error.log info;
    keepalive_timeout     5;
    proxy_read_timeout    120s;

    # nginx serve up static and media files and never send to the WSGI server
    location /static {
        autoindex on;
        alias /path/to/static/files;
    }

    location /media {
        autoindex on;
        alias /path/to/media/files;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_Host;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://app_server_wsgiapp;
            break;
        }
    }

    gzip on;
    gzip_comp_level    5;
    gzip_min_length    256;
    gzip_proxied       any;
    gzip_vary          on;

    gzip_types
    application/atom+xml
    application/javascript
    application/json
    application/ld+json
    application/manifest+json
    application/rss+xml
    application/vnd.geo+json
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/xml
    font/opentype
    image/bmp
    image/svg+xml
    image/x-icon
    text/cache-manifest
    text/css
    text/plain
    text/vcard
    text/vnd.rim.location.xloc
    text/vtt
    text/x-component
    text/x-cross-domain-policy;

    location ~*  \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ {
        expires 7d;
    }
}

Après avoir redémarré nginx et ouvert mon site dans un navigateur, tout semble aller pour le mieux. Je vérifie ensuite le vitesse de la page ici et mon score a effectivement augmenté.

Le problème est que si je retourne sur mon site et appuie sur Ctrl+F5 pour un rafraîchissement complet de la page et retélécharge les fichiers statiques (pour s’assurer que tout fonctionne correctement), les fichiers statiques ne sont pas téléchargés. . Je reçois les erreurs de console de navigateur suivantes:

GET https://www.example.com/path/to/static/files 404 (Not Found)
etc...
etc...

Aucun des fichiers statiques ne sont trouvés ou téléchargés. Si j'édite le fichier de configuration nginx, commente les 3 dernières lignes et redémarre nginx, alors cela fonctionne (même en appuyant sur CTRL+F5), c'est-à-dire:

# location ~*  \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ {
#     expires 7d;
# }

Il semble donc que le problème est lié à ces 3 lignes. Cependant, avec ces 3 lignes commentées, je n’obtiens aucune augmentation de la vitesse de la page, ce qui va à l’encontre de l’essai d’utiliser gzip.

3
darkpool

Les blocs location ne sont pas additifs. nginx sélectionne un bloc location pour traiter une demande. En ajoutant un nouveau bloc location, vous empêchez vos blocs location existants de traiter la demande. Voir ce document pour plus de détails.

Comme vous avez plusieurs blocs location avec plusieurs directives alias, il peut être plus simple d'utiliser une directive globale expires à hériter de vos blocs location existants.

Par exemple:

map $request_uri $expires {
    default off;
    ~*\.(jpg|jpeg|png|gif|ico|css|js|pdf)(\?|$) 7d;
}
server {
    ...
    expires $expires;
    ...
    location ... {
        ...
    }
    ...
}

Voir ce document pour plus.

3
Richard Smith