Estou executando um pacote nginx padrão no Debian Bookworm. Normalmente, estou apenas usando as conexões HTTPS para esse serviço e está tudo bem. O padrão para a porta HTTP 80 é um redirecionamento para o protocolo HTTPS.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_tokens off;
return 301 https://$host$request_uri;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log error;
}
// vhosts with listen 443 configs omited here, they work
Tenho um cliente IoT que não fala HTTPS. Então, configurei-o para usar HTTP para enviar dados do sensor para uma url de hook no servidor Nginx. Adicionei um VHost para esse domínio local xyz, que não encaminha a solicitação para HTTPS, mas a processa com HTTP simples.
server {
listen 80;
listen [::]:80;
server_name xyz;
server_tokens off;
location / {
root /var/www/html/;
}
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log error;
}
// vhosts with listen 443 configs omited here, they work
Mas essa solicitação nunca é processada pelo Nginx.
Usando curl
, estou recebendo esta resposta
# curl -v http://localhost/
* Trying 127.0.0.1:80...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.88.1
> Accept: */*
>
* Received HTTP/0.9 when not allowed
* Closing connection 0
curl: (1) Received HTTP/0.9 when not allowed
(Info: Nginx está escutando em todos os dispositivos, nenhum firewall está ativo, quando paro o serviço, a porta é fechada no Linux...).
Não há nenhuma mensagem de log de erro nem no journald, nem nos logs de acesso ou de erro do nginx.
Então tentei fazer o hardcore telnet
na porta 80 e obtive um resultado mais estranho:
# telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
Connection closed by foreign host.
Para esclarecer, eu digitei GET / HTTP/1.1\n
sem uma segunda linha vazia, apenas um "enter". Quando eu digito algo que não é compatível com HTTP, como uma string aleatória, o servidor responde com ??
.
Então, logo após a primeira linha, o Nginx está fechando a conexão (a resposta HTTP/0.9 vem do próprio curl).
Como não consegui definir o Host:
cabeçalho na solicitação telnet, essa solicitação nunca verifica nenhuma configuração de host virtual e presumo que o cliente curl tenha o mesmo problema. Ele tenta enviar todos os cabeçalhos para o soquete, mas a resposta Nginx já está lá.
Não tenho ideia do que está errado. O servidor deve pelo menos esperar pelo Host-header antes de fechar a conexão. O /etc/nginx/nginx.conf
não é alterado.
De acordo com nginx -t
a configuração está ok, o servidor responde normalmente em curl -v https://localhost/
. A configuração SSL etc. é omitida aqui. Está funcionando.