
Como posso configurar um host de visitante para usar um caminho raiz específico no nginx?
Visitante com IP 1.1.1.1 usará
root /srv/web1
todos os outros visitantes usarão
root /srv/web2
Responder1
Embora esta questão seja facilmente respondida simplesmente fazendo um pouco de pesquisa e lendo a documentação (de preferência começando peloGuia do iniciantee entãoComo o nginx processa uma solicitação), vou responder de qualquer maneira.
Presumo que você tenha um servidor com mais de uma interface de rede e endereço IP, onde o endereço 1.1.1.1 é atribuído a uma interface e outros endereços às suas respectivas interfaces.
O Nginx é muito flexível nesse aspecto, na verdade, sempre há um server
bloco que é usado como padrão quando o nginx não consegue corresponder a nenhum outro bloco do servidor server_name
: esse é o primeiro server
bloco do arquivo ou aquele que especifica default_server
em sua listen
diretiva . E lembre-se dissovocê pode especificar um IP na listen
diretiva.
Isso significa, no seu caso:
server {
listen 80 default_server;
root /srv/web2;
[...]
}
server {
listen 1.1.1.1:80;
root /srv/web1;
[...]
}
Como você pode ver no exemplo acima, o primeiro server
bloco escuta em todas as interfaces na porta 80, enquanto o segundo bloco escuta apenas na interface 1.1.1.1, na porta 80. Portanto, qualquer pessoa que visite seu site através da interface de rede 1.1.1.1 receberá arquivos de /srv/web1, independentemente do campo Host na solicitação HTTP (ou seja, o nome de domínio escrito na barra de URL).
Outro comportamento semelhante pode ser obtido colocando o endereço IP na server_name
diretiva, assim:
server {
listen 80;
server_name 1.1.1.1;
[...]
}
* Observe que este último server
bloco captura apenas solicitações para o endereço IP literal e não para nomes de domínio.
Espero que isso responda à sua pergunta, mas da próxima vez coloque informações adicionais sobre sua configuração atual e faça algumas pesquisas.
Atualizar
Para obter o comportamento descrito você pode usar olocalização geográficamódulocomo explicado emessa questão:
geo $client {
default web2;
1.1.1.1 web1;
}
server {
[...]
root /srv/$client;
[...]
}
Esta configuração usa olocalização geográficamódulo para definir uma variável ( $client
) com base no endereço IP do cliente. Essa variável é definida como o padrãoweb2ou o específicoweb1e depois é substituído na root
directiva.
Observe que a geo
diretiva deve estar dentro do http
bloco e não server
nos blocos; o trecho acima deve funcionar como está, mas não garanto nada, pois não testei.