Mamy to ustawienie już nginx.conf
od dłuższego czasu.
sendfile on;
Kiedy zaktualizujemy plik np. /js/main.js
I uzyskamy dostęp z przeglądarki https://test.com/js/main.js?newrandomtimestamp , nadal ładuje starszą wersję, chyba że wykonamy pełne odświeżenie (wyczyszczenie pamięci podręcznej) z naszej przeglądarki.
Ale kiedy zmienimy ustawienia z sendfile na; wysłać plik; przeglądarka załaduje poprawną wersję zaktualizowanego pliku.
Na naszym produkcyjnym serwerze internetowym powinniśmy używać sendfile; lub wyślij plik ;? Jeśli plik wysyłania jest włączony; jest wymagane (może z powodu lepszego buforowania? Szybsza wydajność?) niż jak rozwiązać wyżej wspomniany problem?
Poniżej znajduje się nginx.conf
nasz serwer produkcyjny i używamy wersji 1.7.5:
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_rlimit_nofile 51200;
events {
use epoll;
worker_connections 51200;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
client_max_body_size 8m;
sendfile on;
keepalive_timeout 65;
real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;
large_client_header_buffers 4 32k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript application/javascript text/css application/xml application/json;
gzip_vary on;
include /etc/nginx/conf.d/*.conf;
}
sendfile
i napędzie VirtualBox (np. Virtualbox.org/ticket/819 ). Być może istnieje podobny problem z Amazonem.Odpowiedzi:
Rozwiązanie problemu buforowania plików może być rozwiązane na poziomie aplikacji. Jest to dobrze znany problem w świecie programowania JavaScript. Rozwiązanie to zwykle nazywane jest „skrótem wyjściowym”.
Podstawowym pomysłem jest dodanie skrótu zawartości pliku do nazwy pliku, aby plik został uznany za „nowy” i nie został znaleziony w pamięci podręcznej.
Angular robi to w czasie kompilacji (patrz
--outputHashing
:).źródło
To samo w sobie jest wyraźnym przejawem, że „problem” występuje po stronie klienta.
sendfile
nie ma nic wspólnego z buforowaniem, tylko sposób buforowania / odczytywania pliku przez NGINX (próba wpychania zawartości bezpośrednio do „gniazda” sieciowego lub najpierw buforowania jej zawartości).Jedynym rozsądnym wyjaśnieniem jest to, że Twoja przeglądarka odrzuca
?newrandomtimestamp
jako parametr bez wartości, więc ładuje ten sam zasób buforowany dla jednegoexample.com?blah
i drugiegoexample.com?boo
.Jeśli spróbujesz, to
https://example.com/js/main.js?v=newrandomtimestamp
schemat powinien za każdym razem dawać nowszą treść.źródło
csn używa również wykluczenia z buforowania tego pliku, tak jak ja
źródło