Como posso configurar meu servidor nginx para aceitar diferentes subdomínios e também portas?

Como posso configurar meu servidor nginx para aceitar diferentes subdomínios e também portas?

Eu tenho um servidor rodando no Ubuntu/Nginx. Tenho subdomínios em execução em diferentes portas internas. Quero expor um aplicativo ao público, mas não associá-lo a nenhum nome de domínio/servidor.

Abaixo está meu arquivo de configuração:

server {
    server_name app.example.com www.app.example.com;
    access_log /home/hub-app/logs/app.example.com.access.log;
    
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8082;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';      
        proxy_cache_bypass $http_upgrade;       
        proxy_http_version 1.1;     
        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; 
    }

    listen 443 ssl; 
    ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;


}   

server {
    server_name example.com www.example.com;
    access_log /home/hub-public/logs/example.com.access.log;
    
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8081;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';      
        proxy_cache_bypass $http_upgrade;       
        proxy_http_version 1.1;     
        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; 
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

}

O texto acima funciona bem e aponta para os domínios especificados, ou seja, example.com e app.example.com. Agora quero adicionar outro servidor virtual para rodar em MY_PUBLIC_IP:8080. A porta 8080 não deve estar acessível nos outros domínios, ou sejaexemplo.com:8080/app.example.com:8080não deveria estar disponível.

Responder1

Você pode usar default_server.

O Nginx declarará esse servidor como o servidor padrão. Depois disso, o Nginx utilizará o servidor padrão para lidar com as solicitações quando o cabeçalho HTTP Host permanecer incompatível com qualquer outro bloco de servidor.

O que é default_server no Nginx

Exemplo:

server {
    listen 8080 default_server;
    
    root /www/default;
        
    location / {
        index index.html;
    }
}


Eu o uso para bots de scanner honeypot e transmito para eles alguns emojis de cocô se eles estiverem procurando por phpAdmin ou algo parecido :)

Responder2

Não acho que a resposta do @Klamberext realmente responda à pergunta. Ou seja, o servidor web nginx possui umservidor padrãoconceito. A página de documentação oficial sobre o assunto pode ser encontrada aqui:Como o nginx processa uma solicitação. No entanto, um dos blocos de servidor que escutam alguma combinação de interface/porta de rede sempre atuará como o padrão. Se você não especificar esse bloco de servidor explicitamente, ele será o primeiro bloco de servidor em sua configuração. Isso significa que o seu bloco de servidor com a server_name app.example.com www.app.example.com;linha será o bloco de servidor padrão para qualquer solicitação proveniente da porta 443 TCP, atendendo a qualquer solicitação em que um Hostcabeçalho HTTP não corresponda example.comou www.example.com(ou se não houver nenhum Hostcabeçalho).

Como já foi dito por @Klamberext, uma prática comum é definir um bloco de servidor stub para capturar todas as solicitações em que o Hostcabeçalho HTTP não corresponde a nenhum dos domínios que você está servindo. Você pode ver um exemplo emesseEntão responde. Normalmente, esse bloco de servidor contém a return 444;instrução que é um código de retorno especial do nginx para fechar imediatamente a conexão. No entanto, parece que você precisa de algo oposto, e você precisará de dois blocos de servidor para realizá-lo, pois como já foi dito, um único bloco de servidor escutando na porta TCP 8080 atuará como o padrão, não importa qual seja o Hostcabeçalho definido para :

server {
    listen 8080;
    server_name example.com www.example.com app.example.com www.app.example.com;
    return 444;
}
server {
    listen 8080 default_server;
    ... your config here
}

Como alternativa, você pode verificar o Hostvalor do cabeçalho dentro do seu bloco de servidor, por exemplo, para bloquear um example.comdomínio e qualquer um de seus subdomínios:

server {
    listen 8080;
    if ($http_host ~ \.?example\.com$) { return 444; }
    ... your config here
}

informação relacionada