在一个IP地址上部署两个不同的应用程序?

问题描述 投票:0回答:1

我写了两个网站,想将它们部署在一台服务器上(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 spring-boot http tomcat redirect
1个回答
0
投票

总结

让我猜猜你的期望。

要在具有不同端口的同一服务器上部署两个 Spring Boot 应用程序,您需要将每个应用程序的嵌入式 Tomcat 服务器配置为使用唯一的端口。此外,如果端口 80 已在使用中,您需要将第二个应用程序的 Tomcat 服务器配置为侦听不同的端口(例如 90)。

实现您的目标有两个步骤。

  1. 使用弹簧属性

  2. 添加 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 虚拟机选项

确保使用其唯一的端口配置运行每个应用程序。例如,对于第一个应用程序:

java -jar your-first-application.jar

对于第二个应用程序:

java -jar -Dserver.port=90 your-second-application.jar

通过这些修改,您的每个 Spring Boot 应用程序将能够在不同的端口上运行,从而允许您将它们部署在同一服务器上而不会发生冲突。

更详细的可以参考这里spring-user-@value

© www.soinside.com 2019 - 2024. All rights reserved.