你们好,我是金金金。

前提
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是80https则是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再将响应转发回前端。
- 编写有误还请大佬指正,万分感谢。