你们好,我是金金金。
前提
SpringBoot
打包方式:不是jar
就是war
包
场景
-
写这篇文章也是我遇到一个很不理解的点,所以就去研究了一下
-
场景如下:
-
这是后端生产配置文件给项目设置的端口,然后我前端写的url是:我就很纳闷,前端写了域名以及后端服务上下文路径,咋没写端口呢,这是怎么连接过去的
-
排查
带个这个问题,我看了
linux
服务器当中配置的nginx
配置文件 ,我发现是转发到8080
端口,我靠这时候我更纳闷了,,咋回事,怎么是把请求转到8080
端口呢?后端服务不是写的8083
吗~
我真是百思不得其解,查阅了各种资料、百度,终于发现了不对劲的地方~
首先:公司项目打的是
war
包,我自己之前也编写过boot
项目但是我自己项目打的是jar
包
问题就是出在这两个打包的不同方式上,还是有区别的,接着走 ~ 告诉你为什么~
解惑
这两种打包方式在运行时对端口的配置有所不同
JAR 包
-
当您将
Spring Boot
应用程序打包为jar
包时,应用程序是自包含的,这意味着它包含了嵌入式的Web
服务器(默认情况下是Tomcat
)。在这种情况下,端口号是在Spring Boot
的配置文件(通常是application.yml
或application.properties
)中定义的server.port
属性控制的。 -
例如,在
application.yml
文件中:server: port: 8083
这将使
Spring Boot
应用程序在8083
端口上监听。当您运行JAR
包时,它会忽略任何外部Tomcat
配置,因为它使用的是嵌入式的服务器实例。
WAR 包
-
当您将
Spring Boot
应用程序打包为war
包时,它被设计为部署在外部的Servlet
容器中,比如Apache Tomcat
。在这种情况下,应用程序不会使用嵌入式的服务器实例,而是使用外部容器的配置。 -
在部署
WAR
包时,以下步骤通常会发生:- 将
WAR
文件放置在Tomcat
的webapps
目录下。 Tomcat
会解压WAR
文件并启动应用程序。- 应用程序将使用
Tomcat
的server.xml
配置文件中定义的端口,或者Tomcat
的其他配置设置。
- 将
-
看下
Tomcat
目录下的cong
目录下的server.xml
文件:注意看<Connector
标签:
这将使
Tomcat
(以及部署在其中的WAR
包)在8080
端口上监听。在这种情况下,Spring Boot
应用程序中的server.port
配置将被忽略,因为应用程序不是以独立方式运行,而是作为外部容器中的WAR
包运行。
总结
都知道了部署的
WAR
包在8080
端口上监听,所以也就是为什么nginx
配置为什么转发到8080
端口了
线上环境前端发起请求(没有携带端口号会走默认端口
http
是80
https
则是443
) ->nginx
做好监听转发配置 ->nginx
转发到8080
,然后tomcat
监听8080
,又因为项目是war
包,应用程序不会使用嵌入式的服务器实例,而是使用外部容器的配置 也就是8080
-> 后端服务收到响应,所以能正确的响应给到前端~
详细解释
-
线上环境前端发起请求:当前端通过
AJAX
/AXIOS
或其他方式发起请求时,如果没有显式指定端口号,那么:- 对于
http
请求,浏览器默认会使用端口80
。 - 对于
https
请求,浏览器默认会使用端口443
。
- 对于
-
Nginx 监听和转发配置:
Nginx
作为反向代理服务器,通常会配置在以下端口上监听:80
端口用于HTTP
请求。443
端口用于HTTPS
请求,这通常涉及到SSL/TLS
证书,用于加密通信。
当
Nginx
接收到请求后,会根据配置文件中的规则将请求转发到后端服务器的指定端口。Nginx
配置为将请求转发到8080
端口。 -
Tomcat 监听
8080
:如果您的后端服务是一个部署在Tomcat
服务器上的WAR
包,那么Tomcat
默认会监听8080
端口(除非在Tomcat
的配置文件中进行了更改)。 -
使用外部容器的配置:当应用程序作为
WAR
包部署在Tomcat
或其他Servlet
容器上时,它不会使用Spring Boot
的嵌入式服务器实例,而是使用外部容器的服务器配置。这意味着应用程序的端口配置将取决于外部容器的配置。 -
后端服务响应:后端服务在
8080
端口接收到请求后,会处理请求并生成响应,然后将响应返回给Nginx
,Nginx
再将响应转发回前端。
- 编写有误还请大佬指正,万分感谢。