对于反向代理后面的Java Restlet服务器,我有一个非常奇怪的问题。
我正在使用nginx将URL重定向到端口8182上的Restlet服务器。服务器配置如下:
server {
listen 8080;
server_name localhost;
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_redirect off;
allow all;
root C:/Users/Cyrille/www;
index index.html index.htm;
}
location /proxy/ping {
proxy_pass http://localhost:8182/ping;
}
}
当我打开浏览器或使用wget访问http://localhost:8080/proxy/ping
时,请求被代理到Restlet。它只用“pong”回答,其日志显示:
Oct 29, 2013 11:45:04 AM org.restlet.engine.log.LogFilter afterHandle
INFO: 2013-10-29 11:45:04 127.0.0.1 - - 8182 GET /ping - 200 4 - 6 http://localhost:8182 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36 -
问题是浏览器似乎没有收到响应。它只是在几分钟后超时,出现错误504:网关超时。如果我直接访问http://localhost:8182/ping
,请求会立即完成。
什么时候可以阻止请求?我已禁用任何防火墙或防病毒软件。我已经用Apache交换了nginx,我获得了完全相同的行为。我在Windows 8上。
答案 0 :(得分:0)
事实证明,它是Restlet中的一个错误:当HTTP标头包含“Connection:Close”时,服务器不会发送响应。
我让Nginx不通过以下修改发送此标题,并且它有效。
location /proxy/ping {
proxy_pass http://localhost:8182/ping;
proxy_set_header Connection "";
}
这是指向它的链接(打开后3年仍未修复)Restlet bug:http://restlet.tigris.org/issues/show_bug.cgi?id=1191