Como posso usar curingas em uma diretiva de mapa Nginx?

3

Estou tentando usar o Nginx em arquivos em cache produzidos por um aplicativo da Web e identifiquei um possível problema; que o espaço da URL é grande e excederá o limite Ext3 de 32.000 subdiretórios.

Eu gostaria de dividir os subdiretórios, fazendo, digamos, um cache de sistema de arquivos de dois níveis. Então, onde eu estou atualmente fazendo o cache de um arquivo em

/var/cache/www/arbitrary_directory_name/index.html

Eu armazenaria isso em algo como

/var/cache/www/a/r/arbitrary_directory_name/index.html

Meu problema é que não consigo obter try_files ou rewrite para fazer esse mapeamento. Minha pesquisa sobre o assunto me leva a acreditar que preciso fazer algo assim (muito abreviado):

http {
    map $request_uri $prefix {
        /aa*   a/a;
        /ab*   a/b;
        /ac*   a/c;
        ...
        /zz*   z/z;
    }

    location / {
        try_files /var/cache/www/$prefix/$request_uri/index.html @fallback;

        # or
        # if (-f /var/cache/www/$prefix/$request_uri/index.html) {
        #     rewrite ^(.*)$ /var/cache/www/$prefix/$1/index.html;
        # }
    }
}

Mas não consigo obter o padrão /aa* para corresponder ao uri de entrada. Sem o * , ele corresponderá a um uri exato, mas não consigo combiná-lo apenas com os dois primeiros caracteres.

A documentação do Nginx sugere que os caracteres curinga devem ser permitidos, mas não consigo ver uma maneira de fazê-los funcionar. Existe uma maneira de fazer isso? Eu estou sentindo falta de algo simples? Ou eu estou indo sobre o caminho errado?

    
por Ian Clelland 23.09.2010 / 20:11

2 respostas

3

Eu suspeito que os globs são suportados apenas com o modo de nome do host especial. Você precisa usar expressões regulares para conseguir isso, então seu mapa deve ficar assim:

map $request_uri $prefix {
    ~^/aa(?<suffix>.*)$ /a/a/$suffix;
    ...
}
    
por 25.05.2012 / 23:43
0

Uma leitura mais cuidadosa da documentação do Nginx revela que a funcionalidade que eu quero faz parte do módulo Rewrite. O que eu pensei que precisava ser:

map $request_uri $prefix {
    /aa* a/a;
    /ab* a/b;
    /ac* a/c;
    ...
    /zz* z/z;
}

é facilmente implementado com isso:

if ($request_uri ~= "/(\w)(\w)(.*)") {
    set $prefix $1/$2;
}

E a diretiva try_files funciona assim:

location / {
    root /var/www/cache;
    try_files /$prefix$request_uri @fallback;
}
    
por 23.09.2010 / 22:15

Tags