我写了两个网站,想将它们部署在一台服务器上(Windows Server 2016 或 Linux Ubuntu)。
我的tomcat配置(Spring Boot 3 + Java 17)
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(redirectConnector());
return tomcat;
}
private Connector redirectConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(80);
connector.setSecure(false);
connector.setRedirectPort(443);
connector.findSslHostConfigs();
return connector;
}
对于一个网站来说,这个配置工作是完美的。我输入本地主机(或域)并打开我的网站。
但是我必须为第二个网站做什么。 如果我的端口 80 和 443 正忙,并且如果我写 set.port 90 我必须输入 localhost:90。
我希望您理解我的问题,并可以帮助我或提供一些可以帮助我解决这个问题的材料。谢谢
connector.setPort(80);
connector.setRedirectPort(443);
如何解决这个问题
让我猜猜你的期望。
要在具有不同端口的同一服务器上部署两个 Spring Boot 应用程序,您需要将每个应用程序的嵌入式 Tomcat 服务器配置为使用唯一的端口。此外,如果端口 80 已在使用中,您需要将第二个应用程序的 Tomcat 服务器配置为侦听不同的端口(例如 90)。
实现您的目标有两个步骤。
使用弹簧属性
添加 Java vm 选项(这是可选步骤,如果您正确配置了应用程序端口)
修改
application.properties
或YAML文件:
您可以在 application.properties 或 application.yml 文件中为每个应用程序定义服务器端口。例如:
##### For the first application
server.port=80
server.port=90
在定义 ServletWebServerFactory 的 Spring Boot 应用程序的配置类中,您可以根据属性值动态设置端口。以下是修改配置类的方法:
没有最低可执行演示,所以我创建了一个可能有不同依赖性的演示,您可以参考;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;
@Component
public class TomcatCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Value("${server.port}")
private int serverPort;
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.addAdditionalTomcatConnectors(redirectConnector());
}
private Connector redirectConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(serverPort); // Use the port defined in application.properties
connector.setSecure(false);
connector.setRedirectPort(443);
connector.findSslHostConfigs();
return connector;
}
}
这样,每个应用程序将从其各自的 application.properties 文件中读取 server.port 属性并侦听指定端口。
使用各自的配置运行每个应用程序:
确保使用其唯一的端口配置运行每个应用程序。例如,对于第一个应用程序:
java -jar your-first-application.jar
对于第二个应用程序:
java -jar -Dserver.port=90 your-second-application.jar
通过这些修改,您的每个 Spring Boot 应用程序将能够在不同的端口上运行,从而允许您将它们部署在同一服务器上而不会发生冲突。
更详细的可以参考这里spring-user-@value