Cómo Desplegar la Aplicación Spring Boot con Nginx en Ubuntu 18.04

Spring 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!

Por favor, abre un nuevo terminal o ejecuta en el mismo lo siguiente:

source "/root/.sdkman/bin/sdkman-init.sh"

Después ejecuta el siguiente comando:

# sdk help

Deberías ver el siguiente resultado:

 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  [candidate] [version]
       sdk offline <enable|disable>

   commands:
       install   or i     [version]
       uninstall or rm    
       list      or ls   [candidate]
       use       or u     [version]
       default   or d     [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(&amp;quot;/&amp;quot;)
String index() {
return &amp;quot;Hello world&amp;quot;;
       }
}

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.

 

To write a comment on this article, fill out the form below. Fields marked with an asterisk (*) are required.