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".
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.
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.
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."
Respostas:
Depende.
Fora da caixa, colocar o nginx na frente como um proxy reverso vai lhe dar:
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".
fonte
log
pacote). 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.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.
fonte
O kit de ferramentas da web Gorilla oferece:
schema
pacote converte valores de formulário em uma estrutura.Isso preenche muitas lacunas entre os
net/http
servidores Go e HTTP como o NGINX.Pessoalmente, evito instalar e configurar outro servidor HTTP
net/http
se souber que posso conectar um CDN.Acho que
net/http
tem o servidor HTTP mais poderoso de qualquer biblioteca padrão.fonte
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.
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."
fonte