Назад | Перейти на главную страницу

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.

Пользовательские заголовки нужны только для отладки. Экспресс добавляет 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 не может найти файл в таком большом каталоге, но я не уверен, почему это так и как это исправить. Я уверен, что разделение файлов на более мелкие каталоги сработает, но я действительно не хочу этого делать, потому что эти местоположения файлов уже хранятся в базе данных во многих разных местах.

Убедитесь, что пользователю nginx принадлежат папки, из которых вы обслуживаете.