展示比讲述更容易。这是来自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/tika
或 http://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(码头)服务器。
-
将nginx安装在与运行的Tika服务器相同的服务器上。
-
编辑 nginx conf 文件:
vim /etc/nginx/conf.d/default.conf
-
设置:
# 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/