使用非默认HTTPS端口而不将其写入Jetty / Linux上的URL

时间:2016-04-18 16:59:45

标签: linux amazon-ec2 dns jetty jetty-9

在具有Java 9.3.8.v20160314的AWS EC2 Linux计算机上运行的Jetty 1.8.0_51在两个不同的上下文中定义了两个虚拟主机 - webapps/app1webapps/app2,空webapps/ROOT }目录。

每个网络上下文都有自己的SSL连接器,并指定了两个不同域名的正确密钥库,让我们说www.example1.comwww.example2.com

问题是每个SSL连接器必须使用不同的端口,因此第一个应用程序将具有端口443,但第二个应用程序将使用444,这不是HTTPS调用的默认端口。现在,app2的客户将不得不使用https://www.example2.com:444,这不是很漂亮。

是否有一些解决方法可以省略:444部分?

也许可以在WebAppContext.xml上定义一些内容来将调用转发到端口444,或者可能在DNS区域文件中?

也许这可以在Linux级别上使用iptables

完成

webapps/appX.xml -

的内容
<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/</Set>
  <Set name="war">
    <SystemProperty name="jetty.home" default="."/>/webapps/appX
  </Set>
  <Set name="virtualHosts">
     <Array type="java.lang.String">
       <Item>www.exampleX.com</Item>
     </Array>
  </Set>

  <!-- by Code Range -->
  <Get name="errorHandler">
    <Call name="addErrorPage">
      <Arg type="int">400</Arg>
      <Arg type="int">599</Arg>
      <Arg type="String">/</Arg>
    </Call>
  </Get>
</Configure>

etc/jetty-ssl.xml -

的内容
<Configure id="Server" class="org.eclipse.jetty.server.Server">
    ... 
  <Call  name="addConnector">
    <Arg>
      <New id="sslConnector2" class="org.eclipse.jetty.server.ServerConnector">
        <Arg name="server"><Ref refid="Server" /></Arg>
        <Arg name="acceptors" type="int"><Property name="jetty.ssl.acceptors" deprecated="ssl.acceptors" default="-1"/></Arg>
        <Arg name="selectors" type="int"><Property name="jetty.ssl.selectors" deprecated="ssl.selectors" default="-1"/></Arg>
        <Arg name="factories">
          <Array type="org.eclipse.jetty.server.ConnectionFactory">
          </Array>
        </Arg>

        <Set name="host"><Property name="jetty.ssl.host" deprecated="jetty.host" /></Set>
        <Set name="port">8444</Set>
        <Set name="idleTimeout"><Property name="jetty.ssl.idleTimeout" deprecated="ssl.timeout" default="30000"/></Set>
        <Set name="soLingerTime"><Property name="jetty.ssl.soLingerTime" deprecated="ssl.soLingerTime" default="-1"/></Set>
        <Set name="acceptorPriorityDelta"><Property name="jetty.ssl.acceptorPriorityDelta" deprecated="ssl.acceptorPriorityDelta" default="0"/></Set>
        <Set name="acceptQueueSize"><Property name="jetty.ssl.acceptQueueSize" deprecated="ssl.acceptQueueSize" default="0"/></Set>
      </New>
    </Arg>
  </Call>
   ...
</Configure>

SSL连接器设置为端口8444,并由iptables从外部端口444转发 -

sudo iptables -t nat -I PREROUTING -p tcp --dport 444 -j REDIRECT --to-port 8444

1 个答案:

答案 0 :(得分:1)

没有解决方法可以省略端口。如果指定没有端口的HTTPS URL,则实际上是隐式指定端口443。

我建议考虑在您的Jetty应用程序前放置一个Nginx反向代理,并根据所请求的域名将请求转发到相应的端口。

相关问题