nginx try_files 未在大目录中找到文件(86k 文件)

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

该设置是一个反向代理 Node.js express 驱动服务器的 nginx 服务器。由于 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标题。

这告诉我所有请求都被位置块拾取,但是 nginx_foo_bar由于某种原因无法找到其中的文件。

目录/usr/share/nginx/html/uploads是 NFS 共享,我不确定这有多大关系。我的假设是 nginx 很难在如此大的目录中找到文件,但我不确定为什么会这样或如何修复它。我确信将文件拆分成较小的目录是可行的,但我真的不想这样做,因为这些文件位置已经存储在数据库中的许多不同位置。

答案1

确保 nginx 用户拥有您提供服务的文件夹。

相关内容