habilitar - hello world cgi apache
Despliegue de aplicaciones web Go con Apache (5)
No puedo encontrar un mod_go para desplegar aplicaciones web Go. ¿Hay alguna otra forma de ejecutar aplicaciones web en Go con un servidor web Apache (o incluso IIS)?
Actualización : Ahora, después de hacer Go a tiempo completo durante casi un año; Hacer esto (Ir con Apache) está anulando el propósito mismo de Ir (Rendimiento en términos de ser altamente concurrente). Y estoy usando nginx como un proxy inverso para http / https y tengo mis Back Go detrás detrás de él muy bien. Aunque tienes que cambiar un poco tu mentalidad en webapps cuando usas Go.
Además de las otras opciones, también está el paquete net/http/fcgi . Esto es similar a la opción CGI, pero usa FastCGI y su aplicación puede mantener el estado si es necesario.
Aquí está la versión FastCGI del ejemplo de jimt. Tenga en cuenta que sólo dos líneas son diferentes. Dependiendo de cómo configure Apache, es posible que tenga que cambiar el primer argumento a algo diferente, pero el caso común es nulo.
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)
}
No hay mod_go. (Al menos no he oído hablar de tal cosa.)
Una aplicación web Go en sí misma es un servidor web capaz. Puede escuchar el puerto 80 en su aplicación y luego ejecutarlo directamente en su servidor. Confía en mí: ¡realmente funciona!
Pero si no lo está haciendo (por razones como tener otros servidores virtuales en la misma máquina, equilibrio de carga, etc.), puede usar un servidor HTTP como nginx o Apache como un proxy HTTP delante de su aplicación Go. Yo uso nginx y es genial. Aquí hay una guía obsoleta pero muy útil sobre cómo hacer eso con nginx. No lo he hecho con Apache, pero this debería ayudar.
Recomiendo su aplicación web Go por sí misma o nginx como un proxy HTTP.
Para los interesados, hay un github.com/idaunis/mod_go recientemente lanzado para Apache aquí:
Si bien no es lo ideal, puede ejecutar los programas Go como scripts CGI colocándolos en el directorio cgi-bin. Puede invocarlos como cualquier otra página a través de server.com/cgi-bin/myapp?foo=bar
Un programa de ejemplo se vería así:
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)
}
La razón por la que esto no es tan óptimo como ejecutar el programa como su propio servidor, es que con un enfoque cgi, el programa se invoca para cada solicitud individual. Así que cualquier estado interior no persiste.
Para mayor claridad: debe colocar el binario compilado en el directorio cgi-bin. No es la fuente del programa.
Solo uso el recurso de proxy del servidor web y ejecuto mi aplicación como un demonio regular (usando daemonize) en el servidor. En apache eso sería ProxyPass
+ ProxyPreserveHost
.