serviço de arquivos estáticos sob nginx e autenticação HTTP

4

Eu tenho um aplicativo implantado no modo de teste em um servidor. O acesso a ele foi restrito a um grupo seleto de usuários via Autenticação HTTP. Isso funciona bem. O problema é que, se eu servir arquivos estáticos através de diferentes diretivas 'location', o nginx me dá um "Not Authorized" para esses arquivos. Eu tentei auth_basic off, mas não há dados.

Aqui está o vhost conf:

# Virtual Host 

upstream appname {
  server 127.0.0.1:4000;
  server 127.0.0.1:4001;
  server 127.0.0.1:4002;
}

server { 
  listen 80;
  server_name appname.domain.com;

  # write app specific log
  # make sure you create this file in your log directory before running behind nginx
  access_log  /home/apps/appname/shared/log/nginx.log  main;

 # let nginx serve static files directly
  # images
  location ^~/images {
    auth_basic off;
    root /home/apps/appname/current/public/images;

  }

  location ^~/covers {
    auth_basic off;
    root /home/apps/covers;

  }

 # # javascript
 location ^~/javascripts {
    auth_basic off;
   root /home/apps/appname/current/public/javascripts;
 }

 # # css
  location ^~/stylesheets {
   auth_basic off;
    root /home/apps/appname/current/public/style;
 }           

  # Push all other requests to Merb
  location / {
    # needed to forward user's IP address to merb
    proxy_set_header  X-Real-IP  $remote_addr;

    auth_basic "domains";
    auth_basic_user_file htpasswd;

    if (!-f $request_filename) {
      proxy_pass http://appname;
      break;
    }
  }

}

Alguma sugestão?

EDITAR:

Eu tentei colocar imagens em outro subdomínio e configurar um bloco 'servidor' separado para ele - sem qualquer http_auth. Mas ainda me dá um 403 proibido na imagem! Aqui está o que eu adicionei:

server {
  listen 80;
  server_name images.domain.com;

  access_log  /home/apps/appname/shared/log/nginx_images.log  main;
  error_log  /home/apps/appname/shared/log/nginx_images_error.log;

  error_page 500 502 503 504  /500.html;
  location = /500.html {
    root  /home/apps/www/http_error_codes;
  }

 location /images {
   root /home/apps/appname/current/public/images;
 }

 location /covers {
   root /home/apps/covers;
 }

 open_file_cache max=1000 inactive=20s;
 open_file_cache_valid    30s;
 open_file_cache_min_uses 2;
 open_file_cache_errors   on;
}

Eu também tentei abrir um novo navegador e acessar um arquivo de imagem diretamente do images.domain.com, mas ele ainda diz 403 proibido!

    
por Ahsan 27.07.2009 / 07:13

2 respostas

1

Não tenho certeza se você precisa

auth_basic off

nas áreas em que você não deseja fazer autenticação. Os documentos dizem que isso serve para "substituir a ação pela herdável de uma diretiva de nível inferior", mas sua diretiva pai neste caso (o bloco de servidor) não contém nenhuma diretiva de autenticação.

Pode ser um bug que, quando você tenta desabilitar a autenticação herdada sem que ela já esteja habilitada, a ativa (talvez esteja apenas invertendo um pouco?), mas o que eu sugiro é remover essa afirmação de seus locais estáticos .

Seu uso de ^ ~ nos locais não está realmente fazendo nada, tanto quanto eu posso dizer, porque você não tem nenhuma expressão regular correspondente no bloco do servidor. Se você observar a descrição do pedido de resolução aqui:

link

Você verá que o uso de ^ ~ impede a verificação de locais especificados por regex. Mais abaixo nessa página do documento, você verá que, para correspondências literais, o nginx escolhe a "melhor" correspondência, em que "melhor" geralmente é a correspondência literal com a correspondência de substring mais longa. O que eu não tenho certeza é se internamente

location /foo

é "melhor" que

location ^~ /foo

embora ambos sejam correspondências literais, o último apenas tem uma sugestão anexada. Mas desde que você não precisa do bit de ~ em sua configuração atual, tente derrubá-los e ver se isso esclarece as coisas. É claro que, se você nos der uma configuração redigida para esclarecer e tiver correspondências ~ ou ~ * no seu bloco, isso não ajudará você.

Se nada disso funcionar, você pode tentar mover o

auth_basic

e

auth_basic_user_file

instruções para o bloco do servidor. Então coloque seu

auth_basic off

declarações nos locais estáticos, onde eles estarão desativando algo que você ativou.

== UPDATE ==

Este exemplo simples funciona para mim sob 0.7.61:

server {

    listen 80;

    server_name test.domain.com;

    access_log /var/log/nginx/sites/test.domain.com/access.log;
    error_log /var/log/nginx/sites/test.domain.com/error.log;

    location /images {
        root /srv/www/sites/test.domain.com;
    }

    location / {
        root /srv/www/sites/test.domain.com;
        index index.html;

        auth_basic test;
        auth_basic_user_file /etc/nginx/auth/test.htpasswd;

        if ( -f $request_filename ) {
            expires 30d;
            break;
        }
    }

}

No diretório do site, tudo que eu tenho é index.html e um arquivo gráfico em / images. Se eu for para /images/filename.jpg em uma nova sessão do navegador, ele aparece sem erros. Se, em seguida, ir para a raiz do site, recebo um prompt de autenticação. Se eu retornar à imagem, meu log mostrará o nome de usuário autenticado (em que a primeira solicitação acabou de mostrar "-")

Um rastreamento de pacote mostra que a informação de autenticação foi oferecida pelo navegador com o GET de /images/filename.jpg (não houve desafio 401). Eu assumo que o nginx registra um nome de usuário oferecido se foi especificamente necessário para obter o arquivo ou não (e, claro, como o desafio era contra /, o navegador deve fornecer credenciais inseridas pelo usuário para /images/filename.jpg).

Obviamente, meu exemplo não inclui proxy, mas a funcionalidade básica está lá.

Um erro que cometi inicialmente ao testar isso (o que você fez também) é incluir o subdiretório do bloco de localização na diretiva raiz. Note como a raiz para ambos / images e / são os mesmos - o nginx irá adicionar no subdiretório ao tentar recuperar o arquivo.

Se eu fizer o parâmetro root para o / images block include / images, recebo um 404 tentando acessar o jpg de uma nova sessão do navegador (sem ser solicitada a autenticação). Gostaria de saber se sua configuração de proxy está fazendo com que o pedido seja capturado pelo bloco / em vez de (como no meu exemplo) cair na parte inferior da configuração?

    
por 27.07.2009 / 09:29
0

Tente colocar seus arquivos para o usuário executando nginx (suponho que www-data)

    
por 21.04.2012 / 12:23