【技术架构】使用NGINX部署Spring Boot

Chinese, Simplified

介绍

Spring / Spring引导应用程序的部署总是与Apache Tomcat相关联,而且由于框架本身运行在嵌入式Tomcat web服务器之上,所以它似乎是默认的解决方案。我一直认为这是一个问题,因为我对Apache的解决方案不是很熟悉,而且它处理配置和设置的方式对我来说似乎有些过火。我决定抛弃它,支持NGINX,到目前为止,这个解决方案没有任何缺陷。要在ssl安全的NGINX下部署Spring Boot JAR(或WAR)工件,您必须这样做。

准备Spring引导应用程序

除了通过适当的servlet参数设置资源/应用程序的上下文路径外,在应用程序本身中实际上没有什么可做的。属性文件:

服务器:

server:

    servlet:

             contextPath= /myapplication

上下文路径定义了我们应用程序的入口点,并且为我们创建的每个应用程序设置不同的路径是一种总体的好习惯。 指定此参数后,应用程序将在127.0.0.1:8080/myapplication上可用,而不是默认的127.0.0.1:8080/,并且对于NGINX而言,此单路径更改将非常方便。

更新应用程序配置后,我们可以生成一个准备部署的JAR或WAR文件,并使用FTP或SSH将其上传到我们的服务器,以便稍后我们可以在远程计算机上运行它。

准备服务器环境



在我的项目中,我使用了运行Debian 9的虚拟机,并进行了库存设置和配置。 为了使一切正常运行,我们需要安装:

  • Java,运行应用程序
  • UFW,以保护我们的服务器端口
  • NGINX,处理Web请求

对于Java,我们可以安装开源OpenJDK:

  • sudo apt update
  • sudo apt install java

或Oracle提供的专有Java JDK:

# Required to add PPA's

sudo apt install software-properties-common

# Adding a PPA providing Oracle's JDK

sudo apt-add-repository ppa:webupd8team/java

sudo apt update

# Replace '8' with desired java version

sudo apt install oracle-java8-installer

 

对于其他软件,在Debian(可能还有其他基于Debian的系统)上,这些命令应该可以完成以下工作:

sudo apt update

sudo apt install ufw nginx

安装完所有组件后,我们可以启用UFW,以阻止除NGINX处理的所有传入连接之外的所有传入连接:

sudo systemctl start ufw

sudo systemctl enable ufw

# 'Full' can be replaced with 'HTTP' or 'HTTPS' to allow only selected protocol s

udo ufw allow 'Nginx Full'

 

现在我们可以启用并启动NGINX:

sudo systemctl start nginx

sudo systemctl enable nginx

将Spring Boot应用程序作为后台服务运行



在NGINX准备提供数据时,我们需要运行我们的应用程序。 我们当然可以通过一个简单的java -jar myapplication.jar命令来执行此操作,但是此解决方案无法使我们的应用程序保持活动状态并提供各种启动功能,因此最好创建一个后台服务,以使我们的应用程序永远在其中运行。 的背景。 为此,我们需要创建一个服务文件。 Debian正在运行systemd管理器,因此我们的文件将是/etc/systemd/system/myapplication.service。 对于其他Linux发行版,系统服务路径可能不同。 我们的文件如下所示:

 

[Unit]

Description= # Place a descriptive application name here

After=syslog.target

After=network.target[Service]

User= # Define a user account that will own our app

Type=simple

[Service]

ExecStart=/usr/bin/java -jar # Provide /path/to/file/myapplication.jar

Restart=always

StandardOutput=syslog

StandardError=syslog

SyslogIdentifier= # A short identifier for system journal, f. e. 'myapplication'

[Install]

WantedBy=multi-user.target

保存文件后,可以使用默认的systemd服务管理器启动服务:

# This will start service from file we created earlier

sudo systemctl start myapplication.service

# To see if it's running we can check system journal

journalctl -u myapplication -b

 

如果一切正常,我们的应用程序现在应在后台运行,所有日志应写入系统日志。

配置NGINX代理请求



如果我们的应用程序启动,我们现在可以将NGINX配置为反向代理请求。 我们已经安装了所有内容,因此现在我们需要创建一个配置文件,这将使我们的NGINX实例服务器请求正确的方式。 为此,我们需要创建一个文件/etc/nginx/sites-available/myserver.com,在其中可以将myserver.com替换为服务器名,应用程序名或其他用于标识配置的文件。 创建的文件应如下所示:

server {

        # NGINX will listen on port 80 for both IP V4 and V6

        listen 80;

        listen [::]:80;

        # Here we should specify the name of server

        server_name myserver.com;

        # Requests to given location will be redirected

        location /myapplication {

        

             # NGINX will pass all requests to specified location here

             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;

        }

}

创建我们的配置后,我们可以使用NGINX内置的测试工具,通过调用以下命令来检查它是否可以正确应用:

sudo nginx -t

如果测试没有返回任何错误,我们可以安全地重新启动NGINX服务:

sudo systemctl restart nginx

 

测试反向代理



现在,为了测试我们的设置,我们可以将示例请求发送到http:// <server> / myapplication / <endpoint>。 NGINX将收到请求,然后将/ myapplication / <endpoint>重定向到我们的Spring Boot应用程序,该应用程序在端口8080上本地运行。Spring的上下文路径设置为/ myapplication,因此我们的应用程序将仅接收/ <endpoint>部分, 调用指定的URL。

为HTTPS连接启用SSL



使用NGINX,我们可以将所有HTTP连接重定向到安全HTTP。 如果我们的服务器没有SSL证书,最简单的方法是让我们加密CertBot(https://certbot.eff.org/),该证书可以从apt安装在Debian上,并自动配置NGINX来提供HTTPS服务 ,并使用一些简单的命令重定向所有HTTP通信:

sudo apt-get install certbot python-certbot-nginx -t stretch-backports

sudo certbot --nginx certonly

sudo certbot renew --dry-run

如果我们已经有了生成的SSL证书,则无需运行Certbot并获取一个新的证书。 相反,我们可以更改NGINX配置以使用已经存在的证书。 在线上有很多教程可以指导这一过程。

摘要



在NGINX代理后面运行Spring Boot应用程序是使我们的应用程序运行的一种相当不错的方法,它解决了Tomcat产生的许多问题。 传递启动参数可以轻松得多,可以将日志写入系统日志,可以在单个配置文件中完成SSL设置,并且我们的应用程序可以作为标准系统服务运行。 此设置也比Tomcat部署轻得多。

 

原文:https://ikurek.pl/deploying-spring-boot-with-nginx/

本文:https://pub.intelligentx.net/deploying-spring-boot-nginx

讨论:请加入知识星球或者小红圈【首席架构师圈】

本文地址
https://architect.pub/deploying-spring-boot-nginx
SEO Title
Deploying Spring Boot with NGINX