Go es un lenguaje de programación de propósito general de código abierto. Fue inspirado por la productividad de Python al tiempo que ofrece la capacidad de C. Fue desarrollado originalmente por Google para abordar los problemas que enfrentaban con su base de código (complejidad del código y largo tiempo de compilación). Al igual que cualquier otro lenguaje de programación moderno, Go es adecuado para todo tipo de propósitos. Por ejemplo, podría utilizarse para desarrollo web, scripting en línea de comandos, aplicaciones de servidor de red, desarrollo front-end, etc.
En esta guía, te guiaremos a través de los pasos para implementar una aplicación web simple en Go en Ubuntu 22.04 LTS. También implementaremos un proxy inverso Nginx para manejar la carga de tráfico.
Requisitos previos
Para realizar los pasos demostrados en esta guía, necesitarás tener preconfigurados los siguientes componentes:
- Un Ubuntu configurado correctamente. Obtén más información sobre cómo configurar tu propio servidor Ubuntu en CloudSigma.
- Entorno de programación Go con las variables de entorno necesarias ( $GOROOT y $GOPATH). Consulta la guía sobre cómo configurar el entorno de programación Go en Ubuntu.
- Nginx para proxy inverso. Esta guía detalla la instalación y configuración de Nginx en Ubuntu.
- Un editor de texto adecuado para trabajar con el código Go, por ejemplo, Atom, Sublime Text, Brackets, VS Code, Vim, etc. Para esta guía, VS Code será nuestro editor de texto de elección.
Si se va a acceder al servicio mediante un nombre de dominio, debes tener un FQDN apuntando al servidor. En ese caso, se recomienda proteger Nginx con SSL. Puedes obtener más información sobre cómo proteger Nginx con Let’s Encrypt en Ubuntu en nuestro tutorial.
Paso 1 – Creación de una aplicación web en Go
Crearemos una aplicación web simple en Go que imprimirá “Hello World” en la pantalla al acceder al dominio. Además, la aplicación saludará al usuario al acceder a <dominio>/greet/<nombre_usuario>.
Comienza creando un nuevo proyecto bajo $GOPATH. Crea el directorio del proyecto:
|
1 |
mkdir -pv $GOPATH/go-web |

Cambia el directorio actual:
|
1 |
cd $GOPATH/go-web |

Luego, inicia un proyecto:
|
1 |
go mod init <package_name> |

A continuación, crea main.go que servirá como la raíz de nuestra aplicación Go. Alojará el código fuente de nuestra aplicación web:
|
1 |
touch main.go |
Abre el proyecto en VS Code:
|
1 |
code . |
Pega el siguiente código en el archivo main.go:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") }) http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) { name:= r.URL.Path[len("/greet/"):] fmt.Fprintf(w, "Hello %s\n", name) }) http.ListenAndServe(":9990", nil) } |

Analicemos brevemente el programa Go que acabamos de crear:
- El término package main sirve como punto de entrada a nuestra aplicación. También indica al compilador de Go que compile el archivo como un ejecutable en lugar de una biblioteca compartida.
- La import instrucción importa todos los módulos adicionales necesarios para que el programa funcione. Aquí, hemos importado los paquetes fmt (para imprimir textos) y net/http (para aplicaciones de servidor web).
- Usando la función
http.HandleFunc, establecimos dos rutas:
- La primera ruta / sirve como la ruta principal dentro de func main.
- La segunda ruta
/greet/ acepta un parámetro URL (una cadena, en este caso). Luego, la cadena se muestra acompañada por el mensaje de saludo.
- URL Path se utiliza para almacenar el valor después de /greet/. Luego, el valor se pasa como el name del parámetro URL.
- La función http.ListenAndServe inicia el servidor web. Aquí, está escuchando en el puerto 9990.
Ahora que nuestro programa está listo, compile el archivo en un ejecutable:
|
1 |
go build main.go |
El compilador de Go creará un ejecutable con el mismo nombre que el archivo. Eche un vistazo a la salida:
|
1 |
ls -lh |
Paso 2 – Configuración de un archivo de unidad de systemd para la ejecución en segundo plano
Hasta ahora, si el usuario actual cierra la sesión en el sistema, la aplicación web de Go dejará de ejecutarse. Ese es un mal diseño para un servidor web. Para resolver este problema, crearemos un archivo de unidad de systemd para mantenerla ejecutándose en segundo plano, incluso cuando el usuario cierre la sesión en el servidor. Esto acerca la configuración un paso más a una implementación de nivel de producción.
Cree un archivo systemd dedicado goweb.service bajo /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
Añada el siguiente fragmento en el archivo de unidad:
|
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=goweb [Service] Type=simple Restart=always RestartSec=5s ExecStart=/home/<username>/go/go-web/main [Install] WantedBy=multi-user.target |

Aquí,
- La variable ExecStart indica el punto de entrada para el servicio a través del ejecutable principal ubicado en nuestro directorio de proyecto ( $GOPATH/go-web). Tenga en cuenta que en lugar de mencionar $GOPATH, escribimos la ruta completa al archivo ejecutable. Esto se debe a que la $GOPATH variable solo es visible para el usuario.
- La variable Restart le dice a systemd qué hacer en caso de que el programa deje de ejecutarse. El valor always le dice a systemd que reinicie el programa cada vez que deje de ejecutarse.
- La variable RestartSec le dice a systemd que espere una cantidad específica de tiempo antes de intentar reiniciar el programa. Aquí, el valor está establecido en 5s (5 segundos).
- La instrucción WantedBy=multi-user.target especifica en qué estado systemd habilitará el servicio.
Guarde el archivo y cierre el editor. Inicie el servicio:
|
1 |
sudo service goweb start |

Verifique si el servicio está activo y ejecutándose:
|
1 |
sudo service goweb status |

Como sugiere la salida, la aplicación está activa y ejecutándose. Ahora estamos listos para usar Nginx como proxy inverso.
Paso 3 – Configuración de Nginx como proxy inverso
Ahora, crearemos un bloque de servidor para que Nginx actúe como un proxy inverso. La aplicación web se expondrá a Internet a través del proxy inverso (para un rendimiento y seguridad adicionales).
Cambie el directorio activo actual a sites-available:
|
1 |
cd /etc/nginx/sites-available |

Ahora, cree un archivo con el nombre de dominio en el que desea exponer su aplicación. Para la demostración, utilizaremos example.com:
|
1 |
sudo nano example.com |
Introduzca el siguiente código en el archivo de bloque:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

Aquí, estamos usando proxy_pass para servir la aplicación web de Go en la dirección IP del servidor (localhost) en el puerto 9990.
Para habilitar el bloque de Nginx, cree un enlace simbólico (también conocido como enlace blando) del archivo a la carpeta sites-enabled:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

Recargue la configuración de Nginx para que los cambios surtan efecto:
|
1 |
sudo nginx -s reload |
Paso 4 – Verificación
Si todo salió como se esperaba, entonces la aplicación web ya debería estar accesible en localhost:9990 y el dominio que configuramos. Abra la URL en un navegador web:
|
1 |
localhost:9990 |

Como se esperaba, la aplicación está imprimiendo “Hello World” en la pantalla. Este es el trabajo de la ruta principal. A continuación, pruebe la segunda ruta visitando la siguiente URL:
|
1 |
localhost:9990/greet/<nombre> |

La aplicación está devolviendo con éxito el mensaje de saludo simple con el nombre del parámetro recibido de la URL.
¡Voilà! ¡Hemos desplegado con éxito una aplicación web de Go en nuestro servidor local!
Consideraciones finales
En esta guía, demostramos cómo desplegar una aplicación web simple en Go con la ayuda de las bibliotecas estándar de Go. También desplegamos un proxy inverso usando Nginx. Aunque la demostración se realizó en un servidor local, para un servidor público, se recomienda encarecidamente implementar un certificado SSL para una exposición segura a internet. Para más programación en Go, puede consultar nuestro tutorial sobre Compilación e instalación de programas de Go.
¡Feliz computación!


Comentarios
Aún no hay comentarios. Sea el primero.