Verifique se o usuário nginx possui as pastas das quais você está servindo.
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.