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 Host
cabeçalho HTTP não corresponda example.com
ou www.example.com
(ou se não houver nenhum Host
cabeç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 Host
cabeç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 Host
cabeç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 Host
valor do cabeçalho dentro do seu bloco de servidor, por exemplo, para bloquear um example.com
domínio e qualquer um de seus subdomínios:
server {
listen 8080;
if ($http_host ~ \.?example\.com$) { return 444; }
... your config here
}