【SpringBoot】SpringBoot整合Nginx的全部流程
SpringBoot整合Nginx的全部流程
对Nginx还不了解的同学可以先看这篇⽂章
今天的⽬标是将SpringBoot项⽬由默认部署⽅式(jar)替换成war形式,部署在同⼀台电脑上的两个不同端⼝的tomcat上,利⽤Nginx做反向代理,将请求⾃由的映射到不同端⼝的tomcat中。
第⼀步:将SpringBoot项⽬由默认部署⽅式(jar)替换成war形式
(1)设置打包⽅式为war
<groupId>com.sun</groupId>
<artifactId>mydata</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--因为要放⼊外部的tomcat中,因此更改默认打包⽅式(jar)为war包-->
<packaging>war</packaging>
<name>mydata</name>
<description>Demo project for Spring Boot</description>
(2)将SpringBoot内置的Tomcat在发布时剔除,provided表⽰该包只在编译和测试中使⽤,在发布时去除。⽽在发布时,此依赖由servlet容器即Tomcat提供。更详细的解释
PS:不推荐在spring-boot-starter-web直接将tomcat移除,否则需要添加servlet-api依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
(3)由于SpringBoot项⽬没有传统的l⽂件,因此我们需要在缺少l⽂件的情况下构建war包,需要添加以下配置。
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<!--如果想在没有l⽂件的情况下构建WAR,请设置为false。-->
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
(4)更改项⽬启动类,将之前的启动类删除,新建启动类,继承SpringBootServletInitializer类,重写configure⽅法,即将启动类交给Servlet容器进⾏启动。
package data;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class TMydataApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(TMydataApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(TMydataApplication.class);
}
}
(5)使⽤maven package打包项⽬,拿到war包。
⾄此,war包已经打包好了。可以修改前端界⾯,形成两个不同的war包。
之后需要将war包分别放⼊不同的Tomcat的webapp中。
第⼆步:在⼀台机器上配置两个Tomcat
(1)下载Tomcat8,否则低版本的Tomcat启动时,报出不到javax/el/ELManager类等错误。
(2)下载的Tomcat复制⼀份,修改这两个Tomcat的配置。
1)避免两个Tomcat启动混乱,需要设置不同CATALINA_HOME
具体⽅式:修改Tomcat安装⽬录内的bin/startup.bat,添加以下代码中的中间内容
JAVA_HOME是JDK的安装⽬录,CATALINA_HOME是对应的Tomcat的安装⽬录,分别对这两个Tomcat进⾏修改。
setlocal
SET "JAVA_HOME=C:\Java\jdk1.8.0_201"
SET "CATALINA_HOME=D:\tomcat\tomcat2\apache-tomcat-8.5.41"
rem Guess CATALINA_HOME if not defined
2)修改Tomcat的端⼝,防⽌端⼝冲突。
仅修改第⼆个Tomcat安装⽬录下的l,修改Server port="8006"、Connector port="8081"、redirectPort="8444"、Connector port="8010"、redirectPort="8444"。基本上加1就可以,为了防⽌潜在的端⼝冲突,都改了保险点。但Connector
port="8081"是必须要改的。
3)设置不加项⽬名访问,和SpringBoot的访问路径保持⼀致。
修改Tomcat安装⽬录下的l,在Host标签下加⼊该配置。path表⽰映射后的访问路径,即不需要项⽬名,docBase表⽰物理路径,即解压后的war包所处的绝对路径或相对路径。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="/" docBase="D:\tomcat\tomcat2\apache-tomcat-8.5.41\webapps\mydata-0.0.1-SNAPSHOT" reloadable="false"></Context> </Host>
此时运⾏Tomcat安装⽬录下的bin/startup.bat,可以看到项⽬正常启动了,但启动的控制台界⾯可能输出乱码,如下图。
最简单的修改⽅式为:修改conf/logging.properties下47⾏左右的UTF-8为GBK
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
nginx部署前端项目java.util.ding = GBK
再次启动Tomcat,可以看到现在的控制台没有乱码了。
同理,对第⼆个Tomcat进⾏以上的配置。
测试⼀下能够访问主界⾯
看出来,部署成功了。
最后⼀步,配置Nginx,这⼀步相⽐与之前的配置,简单多了。
(1)修改Nginx安装⽬录下的f,在以下位置设置服务器集地址。
即添加upstream [name]{...},这个name随便起,不过接下来会⽤到,需要保持⼀致。
weight是请求的分配权重,权重越⼤,对应的Tomcat上接收的请求就越多。
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream mydata {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
}
server {
listen 80;
server_name localhost;
(2)添加请求转发规则,依然是在f中配置。
其中mydata就为之前的name,当我们访问/时,Nginx⾃动将请求转发⾄mydata集中的任意⼀个Tomcat中。#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass mydata;
proxy_redirect default;
}
#error_page 404 /404.html;
更详细的Nginx的配置与说明,参考
最后启动Nginx安装⽬录下的。
在地址栏中输⼊localhost,即可看到Nginx已经将请求转发⾄某⼀个Tomcat中了,不停刷新的话,会出现不同的界⾯,即分配到不同的Tomcat中(如果界⾯⼀直没有变化,可能是浏览缓存造成的,需要在每次的刷新前清除缓存)
第⼀次点击:
第⼆次点击:
可见,Nginx已经起到了作⽤,对整个Tomcat集做了负载均衡。
到这⾥,我们就全部配置好了。
关于⼀致性Session处理,可以单独部署Redis⽤作Session控制。
更多的架构,可以参考这篇⽂章
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论