AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1167422
Accepted
TRW
TRW
Asked: 2024-11-05 15:48:35 +0800 CST2024-11-05 15:48:35 +0800 CST 2024-11-05 15:48:35 +0800 CST

Nginx fecha a conexão

  • 772

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 telnetna 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\nsem 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.confnão é alterado.

De acordo com nginx -ta configuração está ok, o servidor responde normalmente em curl -v https://localhost/. A configuração SSL etc. é omitida aqui. Está funcionando.

nginx
  • 1 1 respostas
  • 140 Views

1 respostas

  • Voted
  1. Best Answer
    TRW
    2024-11-05T22:31:33+08:002024-11-05T22:31:33+08:00

    Quando não há nenhuma mensagem de log, há outra opção para encontrar o problema. Sabemos que um Nginx simples funciona. Então, remova TODAS as configurações de host virtual do nginx e comece com uma configuração padrão simples.

    Ao fazer isso, posso ver que o Nginx está respondendo conforme o esperado.

    Em seguida, adicione as configurações anteriores do host virtual, uma por uma.

    O problema estava em outra configuração de virtualhost, que usa a diretiva http2 no soquete http simples.

    server {
      listen 80 http2;
      listen [::]:80 http2;
      server_name abc;
      server_tokens off;
    
      return 301 https://$host$request_uri;
    }
    

    (o pacote nginx mais antigo (1.22.1) no Debian Bookworm ainda não suporta http2 on;configuração)

    Quando esta http2diretiva é removida, o nginx / curl / telnet / IoT está funcionando conforme o esperado.

    Não consegui encontrar uma razão pela qual o Nginx não está funcionando corretamente, quando um host virtual não SSL usa a diretiva HTTP/2. Mas consegui reproduzir isso em vários outros sistemas.

    A documentação diz:

    O parâmetro http2 (1.9.5) configura a porta para aceitar conexões HTTP/2. Normalmente, para que isso funcione, o parâmetro ssl deve ser especificado também, mas o nginx também pode ser configurado para aceitar conexões HTTP/2 sem SSL.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve