Nginx

如何清除docker nginx文件記憶體

  • February 22, 2022

我有一個在 docker 中執行的 nginx 作為靜態伺服器。當我更新伺服器端文件夾template.xlsx文件時。下載仍然返回舊文件,我確定我已將靜態template.xlsx文件替換為新文件。如何讓 nginx 返回新的 nginx 文件?這是靜態 nginx 配置:

server{
   listen 443 ssl;

   ssl_certificate /etc/nginx/conf.d/cert/example.com/fullchain1.pem;
   ssl_certificate_key /etc/nginx/conf.d/cert/example.com/privkey1.pem;

   server_name static.example.com;

   location / {
       root /usr/share/nginx/html/static;
       client_max_body_size 50m;
       proxy_redirect off;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

       add_header Access-Control-Allow-Origin *;
       add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
       add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';


       index index.html index.htm;
   }
}

我嘗試重新啟動 docker 容器似乎仍然沒有返回新模板。

預設情況下,nginx 使用offby expires指令。這意味著 nginx 不會添加或修改“Expires”和“Cache-Control”響應頭欄位。對於靜態文件,這意味著在沒有兩個標頭的情況下客戶端(瀏覽器)可以自由選擇如何記憶體資源(這對您來說是與HTTP 規範相關的未定義行為,因為它可能儲存成功的響應,例如目前會話甚至更長的時間,具體取決於其設置,除非它正在刷新請求(來自瀏覽器的 F5/Ctrl+F5 或If-Modified-Since,或來自客戶端If-None-Match的請求標頭)。Cache-Control``Pragma

重新啟動 nginx(或 docker 容器)在這裡根本沒有幫助,因為它是可以使用記憶體文件的瀏覽器/客戶端。在瀏覽器中,您可以使用 DevTools (F12) -> Network 來監視如果您開始下載會發生什麼(以及您的瀏覽器通過請求發送哪些標頭並從 nginx 接收響應)。

你可以:

  • 禁用此文件(位置)的記憶體,使用expires -1;或添加Cache-Control: no-cache標題(請注意,不建議完全禁用所有靜態的記憶體,至少不要對更改非常罕見的資源這樣做,例如圖片,樣式和 JS )
  • 或強制瀏覽器/客戶端使用不同的 URI 重新載入它template.xlsx?ver=2,例如發送帶有一些增量後綴的請求,如?ver=...這裡(或簡單的時間戳);
  • 或強制瀏覽器/客戶端使用 F5/Ctrl+F5 重新載入它,以防瀏覽器或來自某些 HTTP 客戶端的標頭Cache-Control: no-cachePragma: no-cache

引用自:https://unix.stackexchange.com/questions/691172