Развертывание веб-приложений Go с Apache
Я не могу найти mod_go для развертывания веб-приложений Go. Есть ли другой способ запуска веб-приложений в Go с веб-сервером Apache (или даже IIS)?
Обновление: теперь после завершения работы полный рабочий день в течение почти года; это (Go with Apache) сводит на нет ту же цель Go (Производительность с точки зрения высокой одновременности). И я использую nginx в качестве обратного прокси-сервера для http/https и хорошо поддерживаю его Back back. Хотя вам нужно немного изменить свое мышление на webapps при использовании Go.
Ответы
Ответ 1
Там нет mod_go. (По крайней мере, я не слышал об этом.)
Одно из приложений веб-приложения - это способный веб-сервер. Вы можете слушать порт 80 в своем приложении, а затем запускать его прямо на своем сервере. Поверьте мне: это действительно работает!
Но если вы этого не делаете (по таким причинам, как наличие других виртуальных серверов на одном компьютере, балансировка нагрузки и т.д.), вы можете использовать HTTP-сервер, такой как nginx или Apache, в качестве прокси-сервера HTTP перед вашим Перейти. Я использую nginx, и это здорово. Здесь устаревшее, но все же очень полезное руководство по тому, как это сделать с nginx. Я не делал этого с Apache, но this должен помочь.
Я рекомендую ваше веб-приложение Go самостоятельно или nginx в качестве прокси-сервера HTTP.
Ответ 2
В дополнение к другим параметрам также есть net/http/fcgi. Это похоже на параметр CGI, но использует FastCGI, и ваше приложение может сохранять состояние, если это необходимо.
Здесь приведен пример версии jimt версии FastCGI. Обратите внимание, что только две строки различны. В зависимости от того, как вы настраиваете 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)
}
Ответ 3
Для желающих есть недавно выпущенный mod_go для Apache:
https://github.com/idaunis/mod_go
Ответ 4
Хотя это и не идеально, вы можете запускать программы 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. Не источник программы.
Ответ 5
Я просто использую средство прокси-сервера веб-сервера и запускаю свое приложение в качестве обычного демона (используя daemonize) на сервере. На apache, который будет ProxyPass
+ ProxyPreserveHost
.