2011-09-04 48 views
1

我在nginx後面使用node.js。node.js應用程序使用http-proxy。
基本上,請求到達nginx的,然後被代理到節點應用程式:NGINX + node.js與http-proxy =>標頭中添加的長度

- if static files are requested, the node.js app serves them 
- if non static files are requested, the node.js app proxyies the request to a second node.js app (using http-proxy npm). 

第二種情況完美地工作時nginx的是不是在圖片。當添加nginx的是,反應是很奇怪:它與奇怪的東西包圍着:的

"4c\r\n{ json stuff }\r\n0" 

代替

{ json stuff } 

總結:

  1. (不nginx的):爲請求動態內容 - > node.js - >代理到另一個node.js app - >發回給用戶的回覆是正確的:{json stuff}

  2. (with nginx):請求動態內容 - > node.js - >代理到另一個node.js app - >發回給用戶的響應不正確:「4c \ r \ n {json stuff} \ r \ n0「

我還是不明白這裏發生了什麼......任何想法?

UPDATE

嗯....好像它連接到nginx的添加額外的報頭的請求......

我的nginx的conf是:

upstream my_sock { 
    server unix:/tmp/test.sock 
    fail_timeout=0; 
} 
server { 
    listen 8099; 
    client_max_body_size 4G; 
    server_name localhost; 

    keepalive_timeout 5; 

    location/{ 
    proxy_pass http://my_sock; 
    proxy_redirect off; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    } 
} 

任何想法如何刪除這些額外的頭文件?

UPDATE 2

加入4c中似乎是我期望(JSON的東西)的響應的長度。然後我說:

proxy_set_header Content-Length ''; 

在nginx的的c​​onf但什麼都沒有改變......我仍然有顯示... Arg組成的4C ...

+0

與你的問題沒有特別的關係,但是如果第一個節點實例只提供靜態文件,爲什麼不使用NginX來做到這一點,然後對第二個節點實例使用nginx代理呢? NginX在提供靜態文件方面非常出色。 – loganfsmyth

+0

你是對的,這也是我正在考慮的一個很好的選擇,實際上我已經嘗試過並且面臨同樣的問題(內容長度增加了)。一旦我解決了這個問題,我可能會回到你正在談論的解決方案。 – Luc

+0

是否可以在nginx conf中添加一些邏輯,以便它可以根據查詢字符串的格式來代理請求? – Luc

回答

2

我知道它已經6個月,所以你可能已經知道這一點,但如果別人發現你的問題:

這是nginx的輸出塊傳輸編碼(Transfer-Encoding: chunked) - 當你正確地指出了4c是下一塊(十六進制)的長度和0末(也是十六進制)表示沒有更多事情要發生(即傳輸結束)。如果瀏覽器/客戶端不包含Transfer-Encoding: chunked標題,這會被瀏覽器/客戶端誤解 - 我會先檢查一下。

NodeJS默認爲分塊編碼除非您明確設置了Content-Length標頭。我沒有nginx的很多經驗,但我的猜測是,如果你的代碼的NodeJS輸出Content-Length頭正確,則nginx的一個,除非你告訴它,否則轉發此 - 所以我會檢查你的服務器的NodeJS的頭。你也可以嘗試更新你的nginx - 我有一個模糊的回憶,認爲早期版本不能很好地處理分塊傳輸編碼,儘管我可能弄錯了。

+0

感謝您的幫助。我記得我做了一些完全不同於以前的方法,因爲我沒有設法使它工作。我的不好,我應該更新我的帖子。我會測試你的方法。非常感謝。 – Luc