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.
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.