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 довольно медленно обслуживает статические ресурсы, местоположение ~ "^ / 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: экспресс заголовок. Пример запроса на . 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
задан 28 April 2017 в 01:31
1 ответ

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

1
ответ дан 3 December 2019 в 23:31

Теги

Похожие вопросы