web-dev-qa-db-fra.com

Déploiement d'applications Web Go avec Apache

Je ne trouve pas de mod_go pour déployer des applications Web Go. Y a-t-il un autre moyen d'exécuter des applications Web dans un serveur Web Apache (ou même IIS)?

Mise à jour: Maintenant, après avoir été allée à plein temps pendant près d'une année; Faire cela (aller avec Apache) annule le but même de partir (performance en termes d'être hautement concomitant). Et j'utilise Nginx comme proxy inverse pour HTTP/HTTPS et que je vous remettez bien derrière cela. Bien que vous devez modifier un peu votre état d'esprit sur WebApps lorsque vous utilisez Go.

26
Kaveh Shahbazian

Il n'y a pas de mod_go. (Au moins je n'ai pas entendu parler d'une telle chose.)

Une application Web Go en soi est un serveur Web capable. Vous pouvez écouter le port 80 dans votre application, puis l'exécuter directement sur votre serveur. Croyez-moi: ça marche vraiment!

Mais si vous ne faites pas cela (pour des raisons telles que la présence d'autres serveurs virtuels sur la même machine, l'équilibrage de la charge, etc.), vous pouvez utiliser un serveur HTTP tel que NGinx ou Apache en tant que proxy HTTP devant votre application Go. J'utilise nginx et c'est génial. Voici un obsolète mais toujours très utile Guide sur la façon de faire cela avec Nginx. Je ne l'ai pas fait avec Apache, mais Ceci devrait aider.

Je recommande votre application Web Go sur elle-même ou Nginx en tant que proxy HTTP.

25
Mostafa

En plus des autres options, il y a aussi le package NET/HTTP/FCGI . Ceci est similaire à l'option CGI, mais il utilise FastCGI et votre application peut conserver l'état s'il doit.

Voici la version FastCGI de l'exemple de Jimt. Notez que seules deux lignes sont différentes. Selon la manière dont vous configurez Apache, vous devrez peut-être modifier le premier argument à quelque chose de différent, mais NIL est le cas commun.

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)
}
22
Evan Shaw

Pour les personnes intéressées, il y a un récemment publié mod_go pour Apache ici:

https://github.com/idaunis/mod_go

13
user1784334

Bien que non idéal, vous pouvez exécuter des programmes d'aller en tant que scripts CGI en les plaçant dans le répertoire CGI-bin. Vous pouvez les invoquer comme une autre page via server.com/cgi-bin/myapp?foo=bar

Un exemple de programme ressemblerait à ceci:

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 raison pour laquelle il n'est pas aussi optimal que l'exécution du programme comme son propre serveur, est qu'avec une approche CGI, le programme est invoqué pour chaque demande. Donc, n'importe quel état à l'intérieur, cela ne persiste pas.

Pour plus de clarté: vous devez placer le binaire compilé dans le répertoire CGI-bin. Pas la source de programme.

9
jimt

J'utilise simplement l'installation proxy du serveur Web et exécuter mon application sous forme de démon régulier (en utilisant Daemonize) sur le serveur. Sur Apache qui serait ProxyPass + ProxyPreserveHost.

2
abbot

Cela devraient proxy le domaine et la sous-domaine des demandes aux ports spécifiés.

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName www.yourdomain.com
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName subdomain.yourdomain.com
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://127.0.0.1:8081/
    ProxyPassReverse / http://127.0.0.1:8081/
</VirtualHost>
1
Mateus Lopes