Setting up a Spring Boot application with Nginx as a reverse proxy is a common practice for deploying production environments. This configuration enhances security, scalability, and manageability of your application.

Understanding the Role of Nginx and Spring Boot

Spring Boot simplifies the development of Java-based web applications, providing an embedded server such as Tomcat or Jetty. However, in production, it is often beneficial to place Nginx in front of Spring Boot to handle incoming requests, serve static content, and perform load balancing.

Prerequisites for Setup

  • Java Development Kit (JDK) installed
  • Spring Boot application ready for deployment
  • Nginx installed on your server
  • Domain name pointing to your server's IP address

Configuring Spring Boot Application

Ensure your Spring Boot application is configured to run on a specific port, typically 8080. You can set this in your application.properties or application.yml file:

server.port=8080

Setting Up Nginx as a Reverse Proxy

Create or modify your Nginx server block configuration to route traffic to your Spring Boot application. An example configuration is shown below:

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://localhost:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_read_timeout 90;
    }
}

Enabling HTTPS for Security

For production, securing your application with SSL/TLS is essential. Obtain an SSL certificate using Let's Encrypt or another provider, then update your Nginx configuration:

server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;

    location / {
        proxy_pass http://localhost:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_read_timeout 90;
    }
}

Deploying Your Application

Build your Spring Boot application into a jar file:

./mvnw clean package

Run your application:

java -jar target/your-application.jar &

Verifying the Setup

Access your domain via a web browser. You should see your Spring Boot application served securely over HTTPS with Nginx acting as a reverse proxy.

Conclusion

Configuring Nginx as a reverse proxy for Spring Boot enhances your application's performance and security. Proper setup ensures smooth operation in production environments and provides a scalable foundation for your web services.