如何从一个端口为 Jetty 提供 https 和 http 服务?

2024-04-29

(我知道这是一个重复的问题,但原始发帖者提出这个问题的原因是错误的。我并不是暗示我问它是为了right原因,但让我们看看。)

我们有一个在非标准端口号上运行的 Web 服务。尽管用户似乎能够记住端口号,但有时他们会错误地输入 http: 而不是 https:。有人问我们是否可以在该端口上提供 HTTP 服务,然后将它们重定向到同一端口上的 HTTPS。这听起来很邪恶......我喜欢它的可用性,但感觉也许这应该是浏览器的工作来做到这一点?

我见过的一种解决方案是“在 Jetty 前面编写自己的代理”。这个解决方案可以工作,但我认为它不会很好地工作,因为我不相信我可以编写一个与 Jetty 本身一样高效的代理。另外,即使代理本身很高效,所有数据仍然需要经过额外的一跳,这肯定会减慢流量。

还有比这更好的方法吗?也许 Jetty 本身有一些可以嵌入协议检测逻辑的地方,这将允许利用它们的速度,同时还消除代理会引入的额外跃点。


更新:参见这个答案 https://stackoverflow.com/a/24891007/552792有关如何将单个端口重定向到 HTTPS 和 HTTP 侦听器的说明。如果出于某种原因您不使用该解决方案,请参阅下文:

不可能在同一端口上同时传输来自 http 和 https 的流量。 Jetty 使用两个完全不同的连接器来绑定到安全和不安全端口。事实上,我遇到的每个 Web 服务器都将这两个协议绑定到两个完全独立的端口。

为了可用性,我建议的一件事是使用默认端口,这对用户完全隐藏端口。默认情况下,http 使用端口 80,默认情况下 https 使用端口 443。因此,如果您将连接器配置为分别在端口 80 和端口 443 上运行,则您的用户不必键入端口,您的开发团队也不必输入端口必须处理在 HTML、CSS、JavaScript 和其他资源的绝对路径中包含端口号的情况。

Jetty 被设计为一个独立的 Web 服务器,与旧版本的 Tomcat,Apache 建议在 Apache HTTP 服务器后面运行。因此,只要您没有运行其他 HTTP 服务器,并且无法使用这些端口,您就应该能够将 Jetty 配置为在默认端口上运行,不会出现任何问题。这是来自经验的。我们正是以这种方式运行 Jetty。

最后,一个协议可以绑定到多个端口。因此,如果您当前在端口 8080(用于 http)和 8443(用于 https)上运行 Jetty,则可以将这些连接器保持活动状态,并为端口 80 和端口 443 添加另外两个连接器。这为应用程序中仍处于运行状态的部分启用了向后兼容性。使用端口号,让您有时间继续进行此操作。

<!-- Legacy HTTP connector -->
<Call name="addConnector">
  <Arg>
      <New class="org.mortbay.jetty.nio.SelectChannelConnector">
        <Set name="host"><SystemProperty name="jetty.host" /></Set>
        <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
        <Set name="maxIdleTime">30000</Set>
        <Set name="Acceptors">2</Set>
        <Set name="statsOn">false</Set>
        <Set name="confidentialPort">8443</Set>
        <Set name="lowResourcesConnections">5000</Set>
        <Set name="lowResourcesMaxIdleTime">5000</Set>
      </New>
  </Arg>
</Call>
<!-- Second connector for http on port 80 -->
<Call name="addConnector">
  <Arg>
      <New class="org.mortbay.jetty.nio.SelectChannelConnector">
        <Set name="host"><SystemProperty name="jetty.host" /></Set>
        <Set name="port"><SystemProperty name="jetty.port" default="80"/></Set>
        <Set name="maxIdleTime">30000</Set>
        <Set name="Acceptors">2</Set>
        <Set name="statsOn">false</Set>
        <Set name="confidentialPort">8443</Set>
        <Set name="lowResourcesConnections">5000</Set>
        <Set name="lowResourcesMaxIdleTime">5000</Set>
      </New>
  </Arg>
</Call>

<!-- Legacy SSL Connector for https port 8443 -->
<Call name="addConnector">
 <Arg>
  <New class="org.mortbay.jetty.security.SslSocketConnector">
    <Set name="Port">8443</Set>
    <Set name="maxIdleTime">30000</Set>
    <Set name="handshakeTimeout">2000</Set>
    <Set name="keystore"><SystemProperty name="jetty.home" default="." />/etc/keystore</Set>
    <Set name="password">xxxxxx</Set>
    <Set name="keyPassword">xxxxxx</Set>
    <Set name="truststore"><SystemProperty name="jetty.home" default="." />/etc/keystore</Set>
    <Set name="trustPassword">OBF:xxxxx</Set>
    <Set name="handshakeTimeout">2000</Set>
    <!-- Set name="ThreadPool">
      <New class="org.mortbay.thread.BoundedThreadPool">
        <Set name="minThreads">10</Set>
        <Set name="maxThreads">250</Set>
     </New>
    </Set -->
  </New>
 </Arg>
</Call>



<!-- Default SSL Connector for https port 443 -->
<Call name="addConnector">
 <Arg>
  <New class="org.mortbay.jetty.security.SslSocketConnector">
    <Set name="Port">443</Set>
    <Set name="maxIdleTime">30000</Set>
    <Set name="handshakeTimeout">2000</Set>
    <Set name="keystore"><SystemProperty name="jetty.home" default="." />/etc/keystore</Set>
    <Set name="password">xxxxxx</Set>
    <Set name="keyPassword">xxxxxx</Set>
    <Set name="truststore"><SystemProperty name="jetty.home" default="." />/etc/keystore</Set>
    <Set name="trustPassword">OBF:xxxxx</Set>
    <Set name="handshakeTimeout">2000</Set>
    <!-- Set name="ThreadPool">
      <New class="org.mortbay.thread.BoundedThreadPool">
        <Set name="minThreads">10</Set>
        <Set name="maxThreads">250</Set>
     </New>
    </Set -->
  </New>
 </Arg>
</Call>

对于第二个和第四个连接器,唯一真正的区别是端口号。简而言之,您可以为每个连接器/协议配置多个端口,但不能为同一端口配置多个协议/连接器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从一个端口为 Jetty 提供 https 和 http 服务? 的相关文章

随机推荐