使用NGINX反向代理部署Spring Boot应用

什么是Spring Boot

Spring Boot通过大量的默认配置,让使用Spring框架进行开发变得方便快捷,从而使得Java开发人员专注于程序原型设计。本文介绍如何创建一个简单的Spring Boot应用,然后通过NGINX反向代理进行发布。

开始之前

你需要一个同时装有Java 8和NGINX的Linode虚拟主机。如果这些已经安装好了,请跳过此步。

安装Java JDK 8

  1. 安装software-properties-common
1
sudo apt install software-properties-common
  1. 添加Oracle PPA仓库:
1
sudo apt-add-repository ppa:webupd8team/java
  1. 更新所有已安装的软件包:
1
sudo apt update
  1. 安装Oracle JDK。若需要安装Java 9 JDK,将java8改为java9的命令为:
1
sudo apt install oracle-java8-installer
  1. 检查Java版本:
1
java -version

安装NGINX

以下步骤介绍在Ubuntu上安装从NGINX官方库下载的NGINX开发版。需要了解NGINX其他发行版,请参阅NGINX管理指南。若需要了解如何为生产环境配置NGINX,请参阅NGINX入门指南

在文本编辑器中打开/etc/apt/sources.list,并在文件最后追加以下内容。再将CODENAME替换为Ubuntu版本的代号。例如,为Ubuntu 18.04,代号为Bionic Beaver(仿生海狸),以下使用bionic替代CODENAME

1
2
3
/etc/apt/sources.list1

deb http://nginx.org/packages/mainline/ubuntu/ CODENAME nginx
  1. 导入仓库的包签名密钥并将其添加到apt
1
2
sudo wget http://nginx.org/keys/nginx_signing.key 
sudo apt-key add nginx_signing.key
  1. 安装NGINX:
1
2
sudo apt update 
sudo apt install nginx
  1. 确保NGINX正在运行并设置开机自启动:
1
2
sudo systemctl start nginx 
sudo systemctl enable nginx

安装Spring Boot CLI

Spring Boot CLI使得搭建项目框架变得更加容易。SDKMAN!是一个简化Spring CLI安装和构建的工具(如同Gradle或Maven)。使用Spring Boot CLI,可以直接在命令行中创建新项目。

  1. 安装SDKMAN!的依赖项:
1
sudo apt install unzip zip
  1. 安装SDKMAN!:
1
curl -s https://get.sdkman.io | bash
  1. 按照控制台中打印的说明操作:
1
source "/home/username/.sdkman/bin/sdkman-init.sh"

验证SDKMAN!是否已安装:

1
sdk help
  1. 安装Spring CLI:
1
sdk install springboot

验证安装:

1
spring version
  1. 安装Gradle:
1
2
3
4
5
6
7
8
9
sdk install gradle 4.5.1
Downloading: gradle 4.5.1

In progress...

######################################################################## 100.0%

Installing: gradle 4.5.1
Done installing!

构建一个jar文件

有许多可用的构建工具。Spring Boot CLI默认使用Maven,但本文中将使用Gradle。想了解有关Maven和Gradle之间差异的讨论,请参阅Maven和Gradle比较

  1. 使用Spring Boot CLI创建一个新项目。使用项目框架创建一个名为hello-world的新目录。
1
spring init --build=gradle --dependencies=web --name=hello hello-world

注意要查看Spring Boot CLI的可能参数的完整列表,请运行:

1
spring init --list
  1. 进入项目目录。此示例创建一个Endpoint以在Spring应用中返回”Hello world”。需添加两个额外的引用和一个新类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
~/hello-world/src/main/java/com/example/helloworld/HelloApplication.java

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";
}
}
  1. 构建应用程序。这将在在项目中创建一个名为build的新目录。
1
./gradlew build
  1. 运行嵌入了Tomcat服务器的应用。该应用将在localhost:8080上运行。可以按Ctrl+C停止。
1
java -jar build/libs/hello-world-0.0.1-SNAPSHOT.jar
  1. 应用可以在不链接jar文件的情况下运行。
1
gradle bootRun
  1. 测试应用是否正确地在localhost中运行:
1
2
curl localhost:8080
Hello world
  1. CTRL+C停止Tomcat服务器。

创建一个初始化脚本

将Spring Boot应用设置为服务以在服务器重启时自启动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/etc/systemd/system/helloworld.service

[Unit]
Description=Spring Boot HelloWorld
After=syslog.target
After=network.target[Service]
User=username
Type=simple

[Service]
ExecStart=/usr/bin/java -jar /home/linode/hello-world/build/libs/hello-world-0.0.1-SNAPSHOT.jar
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=helloworld

[Install]
WantedBy=multi-user.target

启动服务:

1
sudo systemctl start helloworld

检查状态是否生效:

1
sudo systemctl status helloworld

反向代理

现在Spring应用已作为服务运行,NGINX代理允许将应用部署到非特权端口并设置SSL。

  1. 为反向代理创建NGINX配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/etc/nginx/conf.d/helloworld.conf 

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;
}
}
  1. 测试配置以确保无误:
1
sudo nginx -t
  1. 如果没有错误,请重新启动NGINX以使更改生效:
1
sudo systemctl restart nginx
  1. 现在可以通过浏览器访问该应用。访问Linode的公共IP地址,应显示”Hello world”消息。

效果

1561444559684

1561444619964

感谢资助辣条吃!