0

リバース プロキシの背後にある 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: Gateway Time-out でタイムアウトします。直接アクセスするhttp://localhost:8182/pingと、リクエストはすぐに完了します。

いつリクエストをブロックできますか? ファイアウォールまたはウイルス対策を無効にしました。nginx を Apache に交換したところ、まったく同じ動作が得られました。私はWindows 8を使用しています。

4

1 に答える 1

0

Restlet のバグであることが判明しました。HTTP ヘッダーに「Connection:Close」が含まれている場合、サーバーは応答を送信しません。

次の変更でNginxがこのヘッダーを送信しないようにしましたが、うまくいきました。

location /proxy/ping {
        proxy_pass http://localhost:8182/ping;
        proxy_set_header Connection "";
}

これは、(公開されてから 3 年経ってもまだ修正されていない) Restlet バグへのリンクです: http://restlet.tigris.org/issues/show_bug.cgi?id=1191

于 2013-11-27T18:05:26.700 に答える