在两个不同端口上运行Tomcat服务器

49
我希望能够部署一个Tomcat服务器,使其同时监听两个端口(都是HTTP协议)。只有一个服务器实例,但希望在两个端口上侦听HTTP协议。例如,任何人都可以使用端口号7080和8080访问部署在我的服务器上的应用程序。是否可能实现这一点?如果可能,我们该如何实现?

奇怪的是,如果我使用8080和7080端口测试,它能够工作。但是如果我使用80和8080进行测试,则失败了。不知道为什么? - Narendra
1
端口80已被其他程序占用,例如可能是Apache Web服务器。 - Magnilex
1
是的,你说得对。由于某种奇怪的原因,我的Skype正在使用端口80。一旦我结束了Skype的进程,服务器就可以正常运行了。感谢你的答复。 - Narendra
6个回答

50
很简单。您只需要查看conf/server.xml配置文件,为您想要的端口添加一个新的连接器即可。例如,如果您有这样一个连接器:
<Connector port="8080" 
           protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443" 
           URIEncoding="UTF-8" />

只需在配置文件中添加一个与上述相同的新连接器,但更改端口参数即可。就这样。重新启动即可完成。


1
java.lang.Exception: 套接字绑定失败:[730048] 通常只允许每个套接字地址(协议/网络地址/端口)的一个使用。 - Narendra
3
你是否同时修改了“port”和“redirectPort”这两个参数?你使用的是哪个版本的Tomcat? - Magnilex
我发现只要使用不同的“port”值,就不必更改“redirectPort”参数。 - Duncan Jones

23

是的,这是可能的。只需像这样编辑server.xml文件(位于名为conf的文件夹中):

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
<Connector port="8081" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8444" />

这将设置Tomcat监听80808081两个端口。 文档指出:
  • port: 在此连接器上创建服务器套接字并等待传入连接的TCP端口号。您的操作系统只允许一个服务器应用程序在特定IP地址上监听特定端口号。如果使用0(零)的特殊值,则Tomcat将随机选择一个空闲端口来用于此连接器。这通常仅对嵌入式和测试应用程序有用。

  • redirectPort: 如果此连接器支持非SSL请求,并且接收到需要SSL传输的匹配<security-constraint>的请求,则Catalina会自动将请求重定向到此处指定的端口号。

因此,更改redirectPort是可选的,具体取决于您希望这种重定向如何工作。

19
您可以在 /conf/server.xml 中定义 2 种不同的服务。
以下是示例:
<Service name="Catalina_2">
    <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8444" />
    <Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />
    <Engine name="Catalina_2" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps_2" unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>


  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>

注意:您可能需要增加Tomcat堆大小。


我喜欢这个答案还将每个端口的日志文件等内容隔离开来。当出现错误时,这将是故障排除中的巨大优势。 - Mark Stewart

4
您可以在server.xml中指定以下代码。
<Service name="sample">

    <Connector port="81" protocol="HTTP/1.1" maxThreads="100" connectionTimeout="2000"/>

    <Engine name="sample" defaultHost="sample">
         <Host name="myhostname" appBase="webapp2">
             <Context docBase="C:\websites\sample\" />
         </Host>
     </Engine>

</Service>

我遇到了以下错误:java.lang.Exception: Socket绑定失败:[730048]每个套接字地址(协议/网络地址/端口)只允许使用一次。 - Narendra
你把端口从81改成了你需要的端口了吗? - sumit sharma
这个不起作用,我的控制台中出现了很多异常,显示为java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to initialize component [StandardEngine[sample].StandardHost[m yhostname].StandardContext[null]] ................. 原因是:org.apache.catalina.LifecycleException: 子容器在启动过程中失败。 - Narendra
在这种情况下,您可以删除上下文标记并重新运行,这将正常运行。 - sumit sharma

3

在不同端口上运行Tomcat。我们需要更改server.xml文件中服务标签内的四个内容。

  1. 我们需要将端口号从8080更改为80
  2. 我们需要将redirectPort号从8443更改为8444
  3. 我们需要将Engine名称从Catalina更改为Catalina_2
  4. 我们需要将appBase名称从webapps更改为webapps_1

3
请确保您正在运行Tomcat的用户,因为如果您想在任何特权端口上使用它,必须在root用户下使用它。
另一件事是使用iptables将端口80重定向到8080。 类似于这样的内容:
iptables -t nat -A PREROUTING -d 192.168.10.16 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080

希望这可以帮助到您。

2
我不认为有什么问题。 也许他需要使用低于1024的另一个端口,只是举了7080作为例子。 其他答案也是有效的,这是另一种方法。 - Cyberzoo
4
我喜欢这个答案,因为它也提到了一些潜在解决方案,其中iptables是一个有效的方法,而编辑预配置的服务器则不是(我有一个没有正确Docker化的应用程序,它有一个可以简洁解决的问题)。 - tjborromeo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接