nginx try_files não encontrando arquivos no diretório grande (86k arquivos)

1

Para começar, a configuração do 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";
    }
}

E aqui está a estrutura de diretórios

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

A configuração é um servidor nginx que faz proxy reverso de um servidor Node.js expresso. Como o Express é bastante lento na entrega de ativos estáticos, o location ~ "^/assets/uploads/(.*)" { serve para interceptar solicitações para fazer upload de ativos e veiculá-los diretamente do nginx.

Os cabeçalhos personalizados estão lá apenas para fins de depuração. O Express adiciona um cabeçalho X-Powered-By: express aos pedidos que ele processa.

Aqui é onde as coisas estranhas acontecem. Eu copiei o arquivo site-logo.png de /usr/share/nginx/html/uploads/system para /usr/share/nginx/html/uploads/_foo_bar . Uma solicitação para example.com/assets/uploads/system/site-logo.png mostra o cabeçalho X-Static-Asset e não o cabeçalho X-Powered-By: express . Uma solicitação para example.com/assets/uploads/_foo_bar/site-logo.png mostra o cabeçalho X-Orig-Url e o cabeçalho X-Powered-By: express , mas não o cabeçalho X-Static-Asset .

Isso me diz que todas as solicitações estão sendo selecionadas pelo bloco de localização, mas o nginx não consegue encontrar os arquivos em _foo_bar por algum motivo.

O diretório em /usr/share/nginx/html/uploads é um compartilhamento NFS, não tenho certeza de como isso é relevante. Minha hipótese é que o nginx tem dificuldade em encontrar o arquivo é um diretório tão grande, mas não tenho certeza por que isso seria ou como corrigi-lo. Tenho certeza de que dividir os arquivos em diretórios menores funcionaria, mas eu realmente não quero fazer isso porque esses locais de arquivos já estão armazenados no banco de dados em muitos locais diferentes.

    
por PitaJ 28.04.2017 / 00:31

1 resposta

1

Verifique se o usuário nginx possui as pastas das quais você está servindo.

    
por 28.04.2017 / 00:46