2016-04-27 4 views
2

Я хочу использовать Golang как свой серверный язык, но все, что я прочитал, указывает на nginx как на веб-сервер, а не на net/http (не то, чтобы это было плохо, но это просто кажется предпочтительным в целом, а не точкой этого сообщения хоть).Как использовать nginx в качестве обратного прокси вместе с Golang?

Я нашел несколько статей по использованию fastcgi с Golang, но мне не повезло найти что-либо на обратных прокси и HTTP, а еще ничего, кроме this benchmark, который, к сожалению, не попадает в подробности.

Есть ли какие-либо руководства/руководства по эксплуатации этого устройства?

Например, есть big post on Stackoverflow, детализирующий его с помощью узла, но я не могу найти подобное для go.

+0

nginx как прокси, golang как язык программирования, чтобы сделать настоящий бизнес-сервер, все в порядке. в чем дело? –

+0

См. Http://nf.id.au/posts/2010/10/deploying-go-web-services-behind-nginx-under.html. –

ответ

2

Этого больше не нужно, если вы не используете nginx для кеширования, Golang 1.6+ более чем достаточно для HTTP и HTTPS-сервера напрямую.

Однако, если вы настаивали, и я буду тайно судить вас и смеяться над вами, вот поток работы:

  1. Ваше приложение идут прослушивает локальный порт, скажем, «127.0.0.1:8080»
  2. nginx прослушивает 0.0.0.0:80 и 0.0.0.0:443 и проксирует все запросы до 127.0.0.1:8080.
  3. Будь судим.

Установка Nginx в Node.js + Nginx - What now? точно такую ​​же установку вы будете использовать для Go, или любой другой автономный сервер для этого вопроса, не CGI/FastCGI.

+0

Даже с такими вещами, как балансировка нагрузки? Go будет обрабатывать это? – mickdoe

+1

@mickdoe нет, но для этого есть пакеты, однако это законная причина использовать nginx, я не буду судить вас за это. ;) Вы будете судимы за запуск одного экземпляра nginx только для того, чтобы обслуживать приложение с одним ходом, и многие это делают. – OneOfOne

+0

Хм, ты быстро меняешь. :) Итак, я мог теоретически использовать 'net/http' для довольно долгого времени? – mickdoe

0

Я использую Nginx в производстве очень эффективно, используя Unix-сокеты вместо TCP для FastCGI-соединения. Этот фрагмент кода происходит от Manners, но вы можете легко адаптировать его для обычного Go api.

func isUnixNetwork(addr string) bool { 
    return strings.HasPrefix(addr, "/") || strings.HasPrefix(addr, ".") 
} 

func listenToUnix(bind string) (listener net.Listener, err error) { 
    _, err = os.Stat(bind) 
    if err == nil { 
     // socket exists and is "already in use"; 
     // presume this is from earlier run and therefore delete it 
     err = os.Remove(bind) 
     if err != nil { 
      return 
     } 
    } else if !os.IsNotExist(err) { 
     return 
    } 
    listener, err = net.Listen("unix", bind) 
    return 
} 

func listen(bind string) (listener net.Listener, err error) { 
    if isUnixNetwork(bind) { 
     logger.Printf("Listening on unix socket %s\n", bind) 
     return listenToUnix(bind) 
    } else if strings.Contains(bind, ":") { 
     logger.Printf("Listening on tcp socket %s\n", bind) 
     return net.Listen("tcp", bind) 
    } else { 
     return nil, fmt.Errorf("error while parsing bind arg %v", bind) 
    } 
} 

Оглянитесь вокруг о line 252, что, когда переключение происходит между HTTP через соединение TCP и FastCGI через Unix-сокеты.

С помощью сокетов Unix вам необходимо настроить сценарии запуска, чтобы гарантировать, что сокеты создаются упорядоченным способом с правильной властью и разрешениями. Если вы получите это право, остальное легко.


Чтобы ответить на другие замечания о почему вы хотели бы использовать Nginx, это всегда зависит от сценария использования. У меня есть статические/PHP-сайты, основанные на Nginx; в таких случаях удобно использовать его как обратный прокси-сервер на том же сервере.

Смежные вопросы