Linux

nginx try_files 在大目錄中找不到文件(86k 文件)

  • April 27, 2017

首先,nginx 配置:

server {
   listen 443 ssl;
   server_name example.com;
   ssl_certificate     /example/fullchain.pem;
   ssl_certificate_key /example/privkey.pem;

   client_max_body_size 5M;

   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header Host $http_host;
   proxy_set_header X-NginX-Proxy true;

   location @example {
       add_header X-Orig-Url $uri;
       proxy_pass http://example; # the nodes
   }

   location ~ "^/assets/uploads/(.*)" {
       add_header X-Static-Asset $1 always;
       root /usr/share/nginx/html/;
       try_files /uploads/$1 @example;
   }

   location / {
       # Offline handling
       proxy_pass http://example;
       proxy_redirect off;

       # Socket.io Support
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
   }
}

這是目錄結構

/usr/share/nginx/html
  uploads
    system
      site-logo.png
      ~ 100 files
    _foo_bar
      site-logo.png
      ~ 86k files

設置是一個 nginx 伺服器反向代理 Node.js 快速驅動的伺服器。由於 Express 在提供靜態資產方面相當緩慢,因此location ~ "^/assets/uploads/(.*)" {它旨在攔截上傳資產的請求並直接從 nginx 提供它們。

自定義標頭僅用於調試目的。ExpressX-Powered-By: express向它處理的請求添加一個標頭。

這就是奇怪的事情發生的地方。site-logo.png我將文件從復製/usr/share/nginx/html/uploads/system/usr/share/nginx/html/uploads/_foo_bar. example.com/assets/uploads/system/site-logo.png顯示X-Static-Asset標頭而不是標頭的請求X-Powered-By: express。一個請求example.com/assets/uploads/_foo_bar/site-logo.png改為顯示X-Orig-Url標頭和X-Powered-By: express標頭,但不顯示X-Static-Asset標頭。

_foo_bar這告訴我所有請求都被 location 塊拾取,但 nginx由於某種原因找不到文件。

目錄/usr/share/nginx/html/uploads是 NFS 共享,我不確定這有多相關。我的假設是 nginx 很難找到文件這麼大的目錄,但我不確定為什麼會這樣或如何修復它。我確信將文件拆分為較小的目錄會起作用,但我真的不想這樣做,因為這些文件位置已經儲存在數據庫中的許多不同位置。

確保 nginx 使用者擁有您提供服務的文件夾。

引用自:https://serverfault.com/questions/847010