2010-09-04 41 views
3

我創建了一個小代理節點腳本,它查找request.url 並將請求傳遞給我的apache服務器或使用節點 進程/響應此請求。我已經成功到目前爲止, 一切工作正常,但是當我啓用mod_deflate爲Apache, 「奇怪的事情會發生」。Nodejs代理腳本,與mod_deflate無關

它看起來像節點只是「取消」或「停止」早期的響應方式。 我正在監聽來自我請求的「數據」事件,並且在某個點 節點剛剛決定響應已結束(這是錯誤的),並且 觸發了「結束」事件。

代碼片段:

var apache = http.createClient(82, 'localhost'); 

function pass_to_apache(req, res){ 
    var request = apache.request(req.method, req.url, req.headers); 

    req.addListener('end', function() { 
     request.end(); 
    }); 

    req.addListener('data', function(chunk) { 
     request.write(chunk); 
     sys.puts('writting chunk\n'); 
    }); 

    request.addListener('response', function(response) { 
     res.writeHead(response.statusCode, response.headers); 
     response.addListener('data', function(chunk) { 
      sys.puts('writting data..\n'); 
      res.write(chunk); 
     }); 
     response.addListener('end', function() { 
      sys.puts('end of request'); 
      res.end(); 
     }); 
    }); 
} 

var MainServer = http.createServer(function(request, response) { 
    sys.puts('received '+request.method+' '+request.url + "\n"+JSON.stringify(request.headers)); 
    if(/^\/node/.test(request.url)) { 
     response.writeHead(200, {'Content-Type': 'text/plain'}); 
     response.end("Hi, it's node =)\n"); 
    } 
    else if(/^\/exit/.test(request.url)) { 
     sys.puts('closing..\n'); 
     MainServer.close(); 
     throw new Error('forced'); 
    } 
    else { 
     pass_to_apache(request, response); 
    } 
}); 

MainServer.listen(80, 'typeofnan.com'); 

可以通過 「看」 這個動作在www.typeofnan.com & & www.typeofnan.com/node/anything
編輯:禁用對的NodeJS現在。

請記住,如果沒有gzip/deflate被apache使用,這就像一個魅力。我嘗試在我的響應中將編碼設置爲「二進制」,但也沒有成功。

我在這裏錯過了什麼嗎?阿莫尼能證實這種行爲嗎? 我正在使用最新版本(0.2.0)。

是否有另一種(更好的)解決方案使用這樣的代理腳本?

回答

0

我很好奇。我激發了你的代碼,並指向www.typeofnan.com。它運行良好,但我注意到服務器沒有返回壓縮響應。然後我將其設置爲代理apache.org,並且我的瀏覽器也使用gzip內容呈現它!有關「/」,我得到了下面的響應頭一個GET:

{"date":"Mon, 13 Sep 2010 11:03:45 GMT","server":"Apache/2.3.8 (Unix) mod_ssl/2.3.8 OpenSSL/1.0.0a","last-modified":"Sat, 11 Sep 2010 19:38:09 GMT","etag":"\"c9489a-4ada-4900100c32a40-gzip\"","accept-ranges":"bytes","vary":"Accept-Encoding","content-encoding":"gzip","cache-control":"max-age=86400","expires":"Tue, 14 Sep 2010 11:03:45 GMT","content-length":"5359","keep-alive":"timeout=5, max=100","connection":"Keep-Alive","content-type":"text/html"} 

嗯...我剛得到幸運,並沒有得到導致您的問題gzip壓縮的反應呢?你有沒有可靠地導致我可以測試的「奇怪事情發生」的頁面?實際上,你可能需要定義「strane的事情會發生」 :)

作爲一個黑客,你可以讓你的代理,以改變接受編碼頭這樣Apache將永遠不會返回一個壓縮的響應。添加以下到Apache的請求將強制Apache在返回未壓縮的響應:

req.headers['accept-encoding'] = '*;q=1,gzip=0'; 
+0

當我在我的服務器上禁用'mod_deflate',它工作正常與代理腳本。在其他方式(禁用mod_deflate或使用accept-headers),這不是我想要的。我想要從apache執行gzip,並且我希望節點能夠通過它(這仍然不起作用)。目前,我禁用了nodejs,它是100%的apache。我在帖子中已經描述過「奇怪的事情」。節點只是停止發送數據,或早或晚。在中間傳輸一個JS/CSS/HTML /無論文件,只是停止。 – jAndy 2010-09-13 12:32:56

+0

Gotcha。只是爲了澄清我的意思是你可以讓節點做gzip並讓apache在沒有它的情況下做出迴應。 – bxjx 2010-09-13 13:32:08

+0

因此,加載特定文件時會崩潰嗎? http://www.typeofnan.com/cgi-bin/supply.pl?js=[%22jquery-1.4.2.min.js%22,%22jquery-ui-1.8.4.custom.min的響應。 js%22,%22init.min.js%22,%22box.min.js%22,%22app.min.js%22]似乎不太正確。看起來不像cgi配置正確。也許刪除supply.files(..)調用,看看節點是否更喜歡事物。 – bxjx 2010-09-13 13:38:11