pring Boot es un framework gratuito y de código abierto basado en Java desarrollado por Pivotal Team que se utiliza para crear un micro servicio. Un micro servicio permite desarrollar e implementar servicios de forma independiente.
Spring Boot proporciona una buena plataforma para desarrollar fácilmente una aplicación independiente y de entorno de producción. Ha sido especialmente diseñado para evitar configuraciones XML complejas, reducir el tiempo de desarrollo y ofrecer una manera fácil de comenzar con la aplicación. No necesita configurar nada, todo se configura automáticamente.
En este tutorial, te explicamos cómo implementar Spring Boot con Nginx como proxy inverso en Ubuntu 18.04.
Requisitos
- Un servidor en la nube corriendo con Ubuntu 18.04.
- Una contraseña root en tu servidor cloud.
- Java en su versión 8
Empezamos
Antes de empezar, asegúrate de que tu servidor está actualizado. Si no es así, puedes actualizar tu servidor con el siguiente comando:
# apt-get update -y
# apt-get upgrade -y
Spring Boot es una aplicación basada en Java, por lo que necesitarás instalar Java 8 en tu servidor. Puedes instalar Java 8 con el siguiente comando:
# apt-get install openjdk-8-jdk -y
Una vez instalado, puedes comprobar la versión de Java con el siguiente comando:
# java -version
Deberías ver el siguiente resultado:
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
Instala la Herramienta Spring Boot CLI
A continuación, necesitarás instalar Spring Boot CLI y otras herramientas como Gradle en tu servidor cloud. Puedes crear un nuevo proyecto de forma fácil con la herramienta Spring Boot CLI.
En primer lugar, necesitarás instalar SDKMAN en tu servidor vps cloud. Puedes hacerlo con el siguiente script:
# curl -s https://get.sdkman.io | bash
Una vez que la instalación ha sido completada, deberías ver el siguiente resultado:
All done!
Please open a new terminal, or run the following in the existing one:
source "/root/.sdkman/bin/sdkman-init.sh"
Then issue the following command:
sdk help
Enjoy!!!
A continuación, activa SDKMAN con el siguiente comando:
# source "/root/.sdkman/bin/sdkman-init.sh"
Puedes comprobar todas las opciones disponibles con sdk utilizando el siguiente comando:
# sdk help
Deberías ver el siguiente comando:
==== BROADCAST =================================================================
* 2019-09-13: Micronaut 1.2.2 released on SDKMAN! #micronautfw
* 2019-09-06: Springboot 2.1.8.RELEASE released on SDKMAN! #springboot
* 2019-09-05: Micronaut 1.2.1 released on SDKMAN! #micronautfw
================================================================================
Usage: sdk <command> [candidate] [version]
sdk offline <enable|disable>
commands:
install or i <candidate> [version]
uninstall or rm <candidate> <version>
list or ls [candidate]
use or u <candidate> [version]
default or d <candidate> [version]
current or c [candidate]
upgrade or ug [candidate]
version or v
broadcast or b
help or h
offline [enable|disable]
selfupdate [force]
update
flush <broadcast|archives|temp>
candidate : the SDK to install: groovy, scala, grails, gradle, kotlin, etc.
use list command for comprehensive list of candidates
eg: $ sdk list
version : where optional, defaults to latest stable if not provided
eg: $ sdk install groovy
A continuación, puedes instalar Spring Boot utilizando el comando que se muestra más abajo:
# sdk install springboot
Una vez instalado, deberías obtener el siguiente resultado:
###############################################################################
######################################################### 100.0%
Installing: springboot 2.1.8.RELEASE
Done installing!
Setting springboot 2.1.8.RELEASE as default.
También puedes comprobar la versión de Spring Boot con el siguiente comando:
# spring version
Deberías ver el siguiente resultado:
Spring CLI v2.1.8.RELEASE
A continuación, instala gradle ejecutando el siguiente comando:
# sdk install gradle 4.5.1
Crea un archivo Jar con Gradle
A continuación, crea un nuevo proyecto denominado hello-world con Spring Boot CLI y Gradle ejecutando el siguiente comando:
# spring init --build=gradle --dependencies=web --name=hello hello-world
Este comando creará un directorio de nuevo proyecto llamado hello-world tu directorio principal como se muestra más abajo:
Using service at https://start.spring.io
Project extracted to '/root/hello-world'
Puedes hacer una lista de todos los parámetros disponibles con Spring Boot CLI ejecutando el siguiente comando:
# spring init --list
Deberías ver el siguiente resultado:
Project types (* denotes the default)
+-----------------+-----------------------------------------+-----------------------------+
| Id | Description | Tags |
+-----------------+-----------------------------------------+-----------------------------+
| gradle-build | Generate a Gradle build file | build:gradle,format:build |
| gradle-project | Generate a Gradle based project archive | build:gradle,format:project |
| maven-build | Generate a Maven pom.xml | build:maven,format:build |
| maven-project * | Generate a Maven based project archive | build:maven,format:project |
+-----------------+-----------------------------------------+-----------------------------+
Parameters
+-------------+------------------------------------------+------------------------------+
| Id | Description | Default value |
+-------------+------------------------------------------+------------------------------+
| artifactId | project coordinates (infer archive name) | demo |
| bootVersion | spring boot version | 2.1.8.RELEASE |
| description | project description | Demo project for Spring Boot |
| groupId | project coordinates | com.example |
| javaVersion | language level | 1.8 |
| language | programming language | java |
| name | project name (infer application name) | demo |
| packageName | root package | com.example.demo |
| packaging | project packaging | jar |
| type | project type | maven-project |
| version | project version | 0.0.1-SNAPSHOT |
+-------------+------------------------------------------+------------------------------+
A continuación, cambia el directorio a hello-world y abre tu archivo hello-word de Java:
# cd hello-world # nano src/main/java/com/example/helloworld/HelloApplication.java
Haz los siguientes cambios:
package com.example.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
@RestController
class Hello {
@RequestMapping("/")
String index() {
return "Hello world";
}
}
Guarda y cierra el archivo. Después, crea la aplicación con el siguiente comando:
# ./gradlew build
Deberías ver el siguiente resultado:
Downloading https://services.gradle.org/distributions/gradle-5.6.2-bin.zip
.........................................................................................
Welcome to Gradle 5.6.2!
Here are the highlights of this release:
- Incremental Groovy compilation
- Groovy compile avoidance
- Test fixtures for Java projects
- Manage plugin versions via settings script
For more details see https://docs.gradle.org/5.6.2/release-notes.html
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :test
2019-09-14 06:40:09.170 INFO 6852 --- [ Thread-4] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
BUILD SUCCESSFUL in 38s
5 actionable tasks: 5 executed
Después, ejecuta la aplicación con el siguiente comando:
# java -jar build/libs/hello-world-0.0.1-SNAPSHOT.jar
Ahora tu aplicación está corriendo en un servlet Tomcar en el puerto 8080, como se muestra más abajo:
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.8.RELEASE)
2019-09-14 07:02:50.820 INFO 14121 --- [ main] com.example.helloworld.HelloApplication : Starting HelloApplication on ubuntu with PID 14121 (/root/hello-world/build/libs/hello-world-0.0.1-SNAPSHOT.jar started by root in /root/hello-world)
2019-09-14 07:02:50.823 INFO 14121 --- [ main] com.example.helloworld.HelloApplication : No active profile set, falling back to default profiles: default
2019-09-14 07:02:51.607 INFO 14121 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
Después, presiona CTRL+C para parar la aplicación y ejecutarla de nuevo con Gradle:
# gradle bootRun
Deberías ver el siguiente resultado:
Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details
> Task :bootRun
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.8.RELEASE)
2019-09-14 07:32:00.883 INFO 15562 --- [ main] com.example.helloworld.HelloApplication : Starting HelloApplication on ubuntu with PID 15562 (/root/hello-world/build/classes/java/main started by root in /root/hello-world)
2019-09-14 07:32:00.886 INFO 15562 --- [ main] com.example.helloworld.HelloApplication : No active profile set, falling back to default profiles: default
2019-09-14 07:32:05.724 INFO 15562 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
Crea un Archivo de Servicio Systemd para Spring Boot
A continuación, necesitarás crear un archivo de servicio systemd para gestionar tu aplicación. Puedes hacerlo con el siguiente comando:
# nano /etc/systemd/system/helloworld.service
Añade las siguientes líneas:
[Unit]
Description=Spring Boot HelloWorld
After=syslog.target
After=network.target[Service]
User=root
Type=simple
[Service]
ExecStart=/usr/bin/java -jar /root/hello-world/build/libs/hello-world-0.0.1-SNAPSHOT.jar
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=helloworld
[Install]
WantedBy=multi-user.target
Guarda y cierra el archivo. Entonces, carga de nuevo el demonio systemd con el siguiente comando:
# systemctl daemon-reload
A continuación, inicia el servicio helloworld y permite que se inicie en boot utilizando el siguiente comando:
# systemctl start helloworld
# systemctl enable helloworld
Ahora ya puedes comprobar el estado de tu servicio con el siguiente comando:
# systemctl status helloworld
Deberías ver el siguiente resultado:
● helloworld.service - Spring Boot HelloWorld
Loaded: loaded (/etc/systemd/system/helloworld.service; disabled; vendor preset: enabled)
Active: active (running) since Sat 2019-09-14 07:48:45 UTC; 14s ago
Main PID: 15696 (java)
Tasks: 36 (limit: 4915)
CGroup: /system.slice/helloworld.service
└─15696 /usr/bin/java -jar /root/hello-world/build/libs/hello-world-0.0.1-SNAPSHOT.jar
Sep 14 07:48:46 ubuntu helloworld[15696]: 2019-09-14 07:48:46.264 INFO 15696 --- [ main] com.example.helloworld.HelloApplication :
Sep 14 07:48:46 ubuntu helloworld[15696]: 2019-09-14 07:48:46.268 INFO 15696 --- [ main] com.example.helloworld.HelloApplication :
Sep 14 07:48:47 ubuntu helloworld[15696]: 2019-09-14 07:48:47.195 INFO 15696 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer :
Sep 14 07:48:47 ubuntu helloworld[15696]: 2019-09-14 07:48:47.221 INFO 15696 --- [ main] o.apache.catalina.core.StandardService :
Configura Nginx como un Proxy reverso
A continuación, necesitarás configurar Nginx como proxy reverso para una petición de proxy en los puertos 80 a 8080. Primero, instala el servidor Nginx ejecutando el siguiente comando:
# apt-get install nginx -y
Una vez instalado, crea un archivo nuevo de configuración virtual host para tu aplicación con el siguiente comando:
# nano /etc/nginx/conf.d/helloworld.conf
Añade las siguientes líneas:
server {
listen 80;
listen [::]:80;
server_name example.com;
location / {
proxy_pass http://localhost:8080/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}
Guarda y cierra el archivo. Después, reinicia el servicio Nginx para aplicar los cambios de configuración con el siguiente comando:
# systemctl restart nginx
Testea Tu Aplicación
La aplicación Spring Boot ya está instalada y configurada con Nginx. Puedes acceder a ella visitando la URL http://ejemplo.com en tu navegador. Deberías ver tu aplicación en la siguiente página:
Conclusión
¡Felicidades! Has instalado con éxito la aplicación Spring Boot en tu servidor con Nginx como proxy reverso. Para más información, puedes consultar la documentación de Spring Boot.