2012-04-05 5 views
23

Я не могу найти mod_go для развертывания веб-приложений Go. Есть ли другой способ запуска веб-приложений в Go с веб-сервером Apache (или даже IIS)?Развертывание веб-приложений с Apache

Обновление: Теперь после выполнения полного времени работы в течение почти года; это (Go with Apache) сводит на нет ту же цель Go (Производительность с точки зрения высокой одновременности). И я использую nginx в качестве обратного прокси-сервера для http/https и хорошо поддерживаю его Back back. Хотя вам нужно немного изменить свое мышление на webapps при использовании Go.

+0

Те, кто заинтересован в этом можно также увидеть [подобный вопрос] (http://stackoverflow.com/q/17440415/165293). – Mostafa

ответ

22

Нет mod_go. (По крайней мере, я не слышал об этом.)

Самостоятельное веб-приложение - это способный веб-сервер. Вы можете слушать порт 80 в своем приложении, а затем запускать его прямо на своем сервере. Поверьте мне: это действительно работает!

Но если вы этого не делаете (по таким причинам, как наличие других виртуальных серверов на одном компьютере, балансировка нагрузки и т. Д.), Вы можете использовать HTTP-сервер, такой как nginx или Apache, в качестве прокси-сервера HTTP перед ваше приложение Go. Я использую nginx, и это здорово. Here's an outdated but still very useful руководство о том, как это сделать с nginx. Я не делал этого с Apache, но this должен помочь.

Я рекомендую ваше веб-приложение Go самостоятельно или nginx в качестве прокси-сервера HTTP.

+0

Я нашел этот mod_go в репозитории github, может быть интересно проверить: https://github.com/idaunis/mod_go –

8

Хотя это не идеальный вариант, вы можете запускать программы Go в качестве скриптов CGI, помещая их в каталог cgi-bin. Вы можете ссылаться на них, как и любой другой страницы через server.com/cgi-bin/myapp?foo=bar

Пример программы будет выглядеть следующим образом:

package main 

import (
    "fmt" 
    "net/http" 
    "net/http/cgi" 
) 

func hello(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hello from Go!") 
} 

func main() { 
    http.HandleFunc("/", hello) 
    cgi.Serve(nil) 
} 

Причина это не так оптимальна, как работает программа, как свой собственный сервер, является то, что с CGI подход, программа вызывается для каждого отдельного запроса. Поэтому любое состояние внутри него не сохраняется.

Для наглядности: вы должны поместить скомпилированный двоичный файл в каталог cgi-bin. Не источник программы.

22

В дополнение к другим вариантам, есть также пакет net/http/fcgi. Это похоже на параметр CGI, но он использует FastCGI, и ваше приложение может сохранять состояние, если нужно.

Вот версия FastCGI примера jimt. Обратите внимание, что только две строки различны. В зависимости от того, как вы настраиваете Apache, вам, возможно, придется изменить первый аргумент на что-то другое, но nil является обычным делом.

package main 

import (
    "fmt" 
    "net/http" 
    "net/http/fcgi" 
) 

func hello(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hello from Go!") 
} 

func main() { 
    http.HandleFunc("/", hello) 
    fcgi.Serve(nil, nil) 
} 
+0

Знаете ли вы какие-либо примеры, используя net/http/fcgi? – BurntSushi5

+0

@ BurntSushi5 Отредактировано для добавления примера –

+0

Здесь есть одно ограничение, которое может быть критическим для кого-то. Цитирование пакета doc: «В настоящее время поддерживается только роль респондента». Это означает, что http auth не может быть обработан кодом Go таким образом. – abbot

2

Я просто использую средство прокси-сервера веб-сервера и запускаю свое приложение в качестве обычного демона (используя daemonize) на сервере. На apache, который будет ProxyPass + ProxyPreserveHost.

+0

У вас есть пример? – slier

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