Linux
nginx try_files 在大目錄中找不到文件(86k 文件)
首先,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 提供它們。自定義標頭僅用於調試目的。Express
X-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 使用者擁有您提供服務的文件夾。