如何使Jetty服务器可从局域网访问?

14

我试图从局域网中的另一台机器B访问部署在本地机器A上Jetty8中的Web应用程序,使用192.168.0.6:8080 (A的IP),但无法访问。然而,我可以正常地使用192.168.0.5(B的IP)从机器A访问运行在AppServ上的应用程序。

我可以在本地主机A上正常访问该应用程序的localhost:8080。

我可以确定没有网络问题,但由于某些原因Jetty无法通过网络访问。是否有任何特定配置可以使其通过局域网访问?

我的应用程序是Maven项目,并且我从eclipse中运行它,设置在web.xml和pom.xml中都有。


你怎样精确地启动Jetty?是在Eclipse中还是通过mvn jetty:run命令? - Stefan Ferstl
@StefanFerstl 我已经将 mvn jetty:run 添加到 Eclipse 的运行配置中。这样我就可以从 Eclipse 运行项目,Eclipse 将运行 Jetty。然后我可以在本地访问 localhost:8080/appName 应用程序。 - Sami
1
你正在运行什么操作系统?你有任何防火墙设置可能会阻止端口的可见性吗? - Edmon
我在Win7上无法重现您的问题。您能否查看“网络和共享中心”,确认防火墙是否真的已关闭? - Stefan Ferstl
我在使用嵌入式Jetty时也遇到了同样的问题。我们的应用程序(带有嵌入式Jetty)在Ubuntu服务器(云VM)上运行。我们可以使用http://localhost:8080从同一台VM访问该应用程序。但是,当我尝试使用系统的公共IP通过Internet访问它时,它无法工作。我的网络和防火墙设置是正确的,因为我可以访问在同一台机器上部署的Tomcat中的其他应用程序。我还测试了Tomcat中的8080端口。 - spideringweb
显示剩余2条评论
3个回答

18

以下答案适用于Jetty 8及更早版本(Jetty 9+的命令和类名不同)

确保您正在侦听哪些接口。

例如(来自日志)

2012-08-10 14:52:26.470:INFO:oejs.AbstractConnector:Started SelectChannelConnector@127.0.0.1:8080

这意味着服务器只在127.0.0.1(本地主机)上进行监听。 你可以查看日志或者在A机器上进行快速测试。 打开一个Web浏览器,测试这两个网址:

  • http://localhost:8080/
  • http://192.168.0.6:8080/

如果两个URL都有响应,则可能已正确设置并需要处理防火墙问题。 如果其中一个有效而另一个无效,则表示仅在一个接口上进行监听。

要让Jetty监听所有接口,请使用特殊IP 0.0.0.0。

$ java -Djetty.host=0.0.0.0 -jar start.jar
2012-08-10 14:53:25.338:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080

此时,Jetty正在监听您计算机上的所有接口。

注意:您也可以编辑etc/jetty.xml文件并永久设置主机。

      <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
        <Set name="host">0.0.0.0</Set>
      ...

2
我只能访问 http://localhost:8080。我使用了 mvn jetty:run -Djetty.host=0.0.0.0 来运行 Jetty,它成功运行并得到了你提到的日志 SelectChannelConnector@0.0.0.0:8080。但仍然无法访问 http://192.168.0.6:8080。还有什么其他原因可能导致这个问题?我已经在本地尝试过了。 - Sami
如果您无法访问http://192.168.0.6:8080并且输出为SelectChannelConnector@0.0.0.0:8080,则该机器上没有192.168.0.6作为网络接口。请尝试从Java运行测试以查看是否可以找到该网络接口。http://docs.oracle.com/javase/tutorial/networking/nifs/listing.html - Joakim Erdfelt
我运行了这段代码,以下是其中的一部分输出: 显示名称:Intel(R) Centrino(R) Advanced-N 6205 名称:net5 IP地址:/192.168.0.6 IP地址:/fe80:0:0:0:c739:e32:3450:159f%19 - Sami
1
当Jetty从eclipse自动启动(作为Web应用程序运行)时,您如何配置它? - Nilzor
注意:在使用Google App Engine的Android Studio中,您需要编辑文件<yourBackend>.iml。将行<option name="HTTP_ADDRESS" value="localhost" />更改为<option name="HTTP_ADDRESS" value="0.0.0.0" />。 - fklappan

1

2020年7月20日

作为对@JoakimErdfelt 答案的补充,在Jetty 9.4.12.v20180830(及以上版本)中,您可以通过以下方式以编程方式配置主机

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;

    Server server = new Server();       

    ServerConnector httpConnector = new ServerConnector(server);
        httpConnector.setHost("0.0.0.0"); // <--------- !
        httpConnector.setPort(12345);
        httpConnector.setIdleTimeout(5000);
        server.addConnector(httpConnector);

0

我遇到了这个问题,在经过一个下午的调试奇怪的行为后,我发现Jetty只向IPv6广播自己,跳过了IPv4,v4端口被分配给另一个应用程序。

我的解决方案?切换到另一个端口...


这并不是问题的解决方案,因为提问者明确指出Jetty可以通过IPv4从本地访问。 - lxg
不,他没有。他说他可以从机器A的localhost:8080访问它,这通常可以同时别名为IPv4(127.0.0.1)和IPv6(::1)子集。许多客户端和jetty会从一个级联到另一个,而不告诉您正在使用哪个/哪个已失败,这对问题产生了很大影响。最有可能的是,他在A上的127.0.0.1:8080被锁定,但他的::1:8080没有被锁定,而jetty正在使用后者。 - Matt Hilliard
好的,那听起来是有道理的。 - lxg

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