Подтвердить что ты не робот

Развертывание веб-приложений Go с Apache

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

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

4b9b3361

Ответ 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)
}

Ответ 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.