Quais são os benefícios de usar o Nginx na frente de um servidor da web para Go? [fechadas]

84

Estou escrevendo alguns serviços da Web que retornam dados JSON, que têm muitos usuários.

Quais são os benefícios de usar o Nginx na frente do meu servidor em comparação com apenas usar o servidor http go?

Daniele B
fonte
Fyi, tinha muitos erros de tcp, como reconfiguração de conexão por peer e tempos limite de i / o usando o servidor Go http para lidar com 100s de grandes solicitações POST por minuto. Coloque o nginx na frente dele - sem mais problemas.
Peter Kelly
Acabei decidindo usar o servidor Go http, sem NGINX, e funciona muito bem. Eu não estou correndo em nenhum problema. Mas meu serviço não está executando grandes solicitações POST como no seu caso.
Daniele B
20
ISTO NÃO É NECESSARIAMENTE BASEADO EM OPINIÕES. Fechar como tal mostra uma grave falta de compreensão das considerações e advertências que uma resposta a essa pergunta pode preencher e fornecer. A resposta selecionada é um ótimo exemplo. Na verdade, vejo novas considerações relevantes em todas as respostas fornecidas.
vee_ess 02 de

Respostas:

135

Depende.

Fora da caixa, colocar o nginx na frente como um proxy reverso vai lhe dar:

  • Registros de acesso
  • Logs de erros
  • Encerramento SSL fácil
  • Suporte SPDY
  • suporte gzip
  • Maneiras fáceis de definir cabeçalhos HTTP para determinadas rotas em algumas linhas
  • Fornecimento de recurso estático muito rápido (se você estiver exibindo S3 / etc., Porém, isso não é relevante)

O servidor Go HTTP é muito bom, mas você vai precisar reinventar a roda para fazer algumas dessas coisas (o que é bom: ele não está destinado a ser tudo para todos).

Sempre achei mais fácil colocar o nginx na frente - que é o que ele faz bem - e deixá-lo fazer as coisas do "servidor web". O aplicativo My Go faz as coisas do aplicativo e apenas o mínimo de cabeçalhos / etc. que ele precisa. Não considere colocar o nginx na frente como uma coisa "ruim".

elithrar
fonte
Obrigado pela sua resposta! - 1) Go HTTP produz algum tipo de registro? - 2) o nginx reduz de alguma forma a taxa de transferência de solicitação / resposta?
Daniele B
3
@DanieleB O servidor Go HTTP produz apenas os logs que você deseja (ou seja, usando o logpacote). Se você deseja registrar o endereço IP, acesso a recursos, etc, você precisará escrever isso. O mesmo vale para a configuração de cabeçalhos, além do básico. Embora eu não tenha nenhum dado concreto, o nginx na frente do Go não deve ser mais lento do que o Go: na verdade, ele pode ser mais rápido graças ao gzip e suas próprias otimizações. O "custo" será mais utilização de memória / CPU, mas o nginx é muito eficiente nesse aspecto também.
elithrar
16
Mais um grande recurso: como você atualizará / manterá seu aplicativo (sem perder pacotes enquanto ele estiver inativo)? O Nginx permite que você direcione o tráfego sem perder pacotes.
BraveNewCurrency de
+1, o Nginx está em seu próprio lugar.
Anatoly
3
No meu Raspberry Pi, colocar o Nginx na frente do Go aumentou significativamente a velocidade de carregamento da página.
425 nsp de
17

O servidor http padrão do Go está bom. Se sua aplicação em sua maioria / somente são solicitações / respostas "dinâmicas", então é realmente a melhor maneira.

Você poderia usar o nginx para servir ativos estáticos, mas provavelmente o Go padrão também serve para isso. Se precisar de um desempenho superior, você deve usar um CDN ou cache o máximo que puder com o Varnish (por exemplo).

Se você precisa atender a diferentes aplicativos com o mesmo endereço IP, o nginx é uma boa escolha para um proxy para distribuir solicitações entre os diferentes aplicativos; embora seja mais comum eu pegar Verniz ou HAProxy da caixa de ferramentas para esse tipo de coisa.

Pergunte a Bjørn Hansen
fonte
sim, na verdade estou usando apenas para fornecer dados dinâmicos. Então, acho que não preciso do NGINX! Obrigado pela sua resposta
Daniele B
Varnish / HAProxy não são necessários, o Nginx tem um conjunto de ferramentas semelhante para armazenamento em cache e balanceamento de carga.
Anatoly
@mikhailov não foi isso que eu disse? nginx funciona bem para isso; embora pessoalmente eu prefira Varnish ou HAproxy. Acho que são mais fáceis de configurar e operar.
Pergunte a Bjørn Hansen de
5

O kit de ferramentas da web Gorilla oferece:

  • Roteamento avançado (restrição de domínio / subdomínio, correspondência de caminho regex).
  • suporte gzip (por meio de gerenciadores de middleware ).
  • Manipulador de middleware de log que produz no Apache Common Log Format.
  • Cookies criptografados seguros.
  • Sessões.
  • schema pacote converte valores de formulário em uma estrutura.

Isso preenche muitas lacunas entre os net/httpservidores Go e HTTP como o NGINX.

Pessoalmente, evito instalar e configurar outro servidor HTTP net/httpse souber que posso conectar um CDN.

Acho que net/httptem o servidor HTTP mais poderoso de qualquer biblioteca padrão.

Moshe Revah
fonte
2

Em https://blog.gopheracademy.com/caddy-a-look-inside/ , parece que Go pode lidar com gzip, erros, arquivos estáticos, roteamento e cabeçalhos http usando Middleware. A linha abaixo, do blog, mostra como você lidaria com tal solicitação.

logHandler(gzipHandler(fileServer))

Eles lidam com o log de erros de uma maneira realmente interessante. Contanto que seu middleware retorne um código de erro (int), o middleware de tratamento de erros o trata automaticamente. Eles até configuraram todo o site em Go como o Nginx faria. "O arquivo nginx.conf para todos os sites da Gopher Academy tinha mais de 115 linhas. O Caddyfile equivalente tem apenas 50 linhas."

Kevin k
fonte