Java Web 服务只在本地主机上响应,而不是主机名(Apache Tika)



展示比讲述更容易。这是来自Apache Tika网络服务:

http://pastebin.com/jrCsVVtt

在该文件的第 89 行,localhost 是硬编码的:

sf.setProviders(providers);
sf.setAddress("http://localhost:" + TikaServerCli.DEFAULT_PORT + "/");
BindingFactoryManager manager = sf.getBus().getExtension(
                                BindingFactoryManager.class);

这意味着,如果在本地计算机上运行 Web 服务,则无法通过 http://hostname:9998/tikahttp://hostname.domain.net:9998/tika 访问它。必须http://localhost:9998/tika 访问它。

我的Java非常生疏,但是经过一些谷歌搜索,我添加了几行:

sf.setProviders(providers);
String hostname;
try
{
  InetAddress ia = InetAddress.getLocalHost();
  hostname = ia.getCanonicalHostName() + ":";
}
catch (Exception e)
{
  //I'll do something else with this later
  hostname = "http://localhost:";
}
sf.setAddress(hostname + TikaServerCli.DEFAULT_PORT + "/");
BindingFactoryManager manager = sf.getBus().getExtension(
                                BindingFactoryManager.class);

这允许我按主机名和 FQDN 访问它,但不能通过本地主机访问它。

有没有一种惯用的方法可以让 Web 服务以所有可能的形式做出响应?

  • 127.0.0.1(本地访问时)
  • 本地
  • 主机(本地访问时)
  • 主机名
  • FQDN
  • IP地址
  • 无论我错过了什么

我想我可以在运行时计算和或多或少地完成枚举,但似乎可能有更好的方法(?

尝试nginx作为前端服务器,它将请求代理到Tika(码头)服务器。

  1. 将nginx安装在与运行的Tika服务器相同的服务器上。

  2. 编辑 nginx conf 文件:

    vim /etc/nginx/conf.d/default.conf
    
  3. 设置:

    # The address or IP on which your Tika server is running. I choose port 9998.
    upstream your_domain_or_ip {
        server localhost:9998;
    }
    # The nginx server instance
    server {
       listen 80;
       server_name localhost;
       # Pass the request with corrent headers to the Tika server
       location / {
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header Host $http_host;
         proxy_set_header X-NginX-Proxy true;
         proxy_pass http://your_domain_or_ip/;
         proxy_redirect off;
       }
    }
    

我提交了一个补丁,其中添加了一个可选的命令行参数,并更改了默认行为以侦听所有有效的主机名和 IP。(这种新的默认行为是否会保留还有待观察。

更多详细信息以及补丁可以在 Jira 票证上找到:

https://issues.apache.org/jira/browse/TIKA-1196

系统具有多个网络接口 - 硬件(如以太网卡)和软件(如具有特殊 IP 127.0.0.1 的环回接口)。使用 localhost 时,您的服务器仅将您的端口绑定到环路接口,因此您只能从该接口上的机器访问它,而环路接口在其网络上只有一台机器,那就是您的计算机本身。

现在,您可以选择要将端口绑定到的所有接口。您的服务器可以从绑定接口连接到的网络中的所有计算机访问。例如。如果选择将服务器端口绑定到环路接口和以太网接口,则只能从 LAN 上的计算机和本地主机访问服务器。如果您也有 WIFI 接口并且您的服务器端口未绑定到它,那么 wifi 上的机器将无法访问您的服务器。

现在,如果要将服务器端口绑定到所有可用接口,以便可以从任何地方访问它,则需要指定一个特殊的IP - 0.0.0.0而不是localhost或127.0.0.1。请参阅此内容以了解网络接口 - http://wilddiary.com/list-ip-addresses-in-java/

相关内容

  • 没有找到相关文章

最新更新