Eu tenho o nginx instalado e funcionando com um aplicativo Ruby / Sinatra e está tudo bem. No entanto, agora estou tentando ter um segundo aplicativo em execução no mesmo servidor e notei algo estranho. Primeiro, aqui está o meu nginx.conf:
pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;
events {
worker_connections 1024;
accept_mutex off;
}
http {
default_type application/octet-stream;
access_log /tmp/nginx.access.log combined;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript application/x-javascript
application/atom+xml;
upstream app {
server unix:/var/www/app/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
client_max_body_size 4G;
server_name FAKE.COM;
keepalive_timeout 5;
root /var/www/app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/app/public;
}
}
}
68,0-1 B
Observe como server_name
está definido como FAKE.COM
ainda o servidor está respondendo a todos os hosts que atingem esse servidor por outros nomes de domínio. Como posso fazer com que esse servidor específico responda apenas a solicitações de FAKE.COM
?
listen fake.com | something.com:80
comando filtra, nãoserver_name
.Respostas:
O primeiro bloco de servidor na configuração do nginx é o padrão para todas as solicitações que atingem o servidor para o qual não há nenhum bloco de servidor específico.
Portanto, na sua configuração, assumindo que o seu domínio real é REAL.COM, quando um usuário digita isso, ele será resolvido para o servidor e, como não há nenhum bloco de servidor para essa configuração, o bloco do servidor para FAKE.COM, sendo o primeiro bloco de servidor (somente bloco de servidor no seu caso), processará essa solicitação.
É por isso que as configurações adequadas do Nginx têm um bloco de servidor específico para os padrões antes de seguir com outros para domínios específicos.
etc
** EDIT **
Parece que alguns usuários estão um pouco confusos com este exemplo e pensam que está limitado a um único arquivo conf etc.
Observe que o acima é um exemplo simples para o OP se desenvolver conforme necessário.
Pessoalmente, uso arquivos separados de vhost conf com isso da seguinte maneira (CentOS / RHEL):
/etc/nginx/conf.d/
conterá domain_1.conf, domain_2.conf ... domain_n.conf, que será incluído após o bloco do servidor no arquivo nginx.conf principal, que sempre será o primeiro e sempre será o padrão, a menos que seja substituído pelo default_server directiva noutro local.A ordem alfabética dos nomes dos arquivos conf para os outros servidores se torna irrelevante nesse caso.
Além disso, esse arranjo oferece muita flexibilidade, pois é possível definir vários padrões.
No meu caso específico, eu tenho o Apache ouvindo na porta 8080 apenas na interface interna e proxy os scripts PHP e Perl para o Apache.
No entanto, eu executo dois aplicativos separados que retornam links com ": 8080" no html de saída anexado, pois detectam que o Apache não está sendo executado na porta 80 padrão e tentam "me ajudar".
Isso causa um problema em que os links se tornam inválidos, pois o Apache não pode ser acessado a partir da interface externa e os links devem apontar para a Porta 80.
Eu resolvo isso criando um servidor padrão para a porta 8080 redirecionar essas solicitações.
Como nada nos blocos regulares de servidor escuta na porta 8080, o bloco de servidor padrão de redirecionamento lida de forma transparente com essas solicitações devido à sua posição no nginx.conf.
Na verdade, tenho quatro desses blocos de servidor e este é um caso de uso simplificado.
fonte
Você deve ter um servidor padrão para pegar tudo , pode retornar
404
ou, melhor, não responder (economizará largura de banda) retornando a444
resposta HTTP específica do nginx que simplesmente fecha a conexão e não retorna nadafonte
server_name _;
eu não tinha nas versões anteriores do nginx, mas funcionou. Agora, para as versões mais recentes do nginx, parece que você precisa doserver_name _;
. Graças444
, e imho uma solução muito mais limpa do que retornar um código de erro.Não consegui resolver meu problema com nenhuma das outras respostas. Resolvi o problema, verificando se o host correspondia e retornando um 403, caso contrário. (Eu tinha um site aleatório apontando para o conteúdo dos meus servidores da Web. Suponho que sequestrar a classificação da pesquisa)
fonte
Para responder sua pergunta - o nginx escolhe o primeiro servidor se não houver correspondência. Veja a documentação :
Agora, se você deseja ter um servidor catch-all padrão que, digamos, responda com 404 a todas as solicitações, veja como fazê-lo:
Observe que você precisa especificar o certificado / chave (que pode ser autoassinado); caso contrário, todas as conexões SSL falharão, pois o nginx tentará aceitar a conexão usando esse servidor_servidor padrão e não encontrará o certificado / chave.
fonte
server_name _;
nem é necessário.Existem algumas maneiras de especificar o servidor padrão.
Primeira maneira - especifique o servidor padrão primeiro na lista, se você mantiver as configurações do servidor em um arquivo de configuração, como Dayo mostrou acima.
Segunda maneira (melhor) Mais flexível - forneça
default_server
parâmetros paralisten
instruções, por exemplo:Mais informações aqui: Nginx doc / Listen
Dessa forma, é mais útil quando você mantém as configurações do servidor em arquivos separados e não deseja nomear esses arquivos em ordem alfabética.
fonte
Pouco comentário para responder:
se você tiver vários hosts virtuais em vários IPs em vários arquivos de configuração em sites disponíveis /, o domínio "padrão" do IP será obtido do primeiro arquivo por ordem alfabética.
E, como Pavel disse, há um argumento "default_server" para a diretiva "listen" http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
fonte