2016-07-27 72 views
2

所以我一直在閱讀整個服務器設置,其中Nginx在nodejs之前用作反向代理,以便它在服務於靜態內容的同時允許節點執行動態內容。我的問題是,爲什麼有人希望使用nginx前端將代理轉換爲websocket?如果nginx提供靜態內容(HTML,CSS,JS,媒體等),那麼所提供的JS文件不能直接使用ip地址和websocket在nodejs中偵聽的端口連接到服務器服務器?爲什麼要通過nginx連接到服務器上的websocket?還是我不清楚這種情況?謝謝!爲什麼使用nginx作爲websocket代理?

+0

你會得到nginx的安全模型。任何(比如說)你在主站點上設置的ip地址/引用者限制也適用於websocket。 –

+0

你應該閱讀此... http://stackoverflow.com/questions/224664/difference-between-proxy-server-and-reverse-proxy-server – JClarke

+0

@Jclarke抱歉使用術語「代理」我編輯我的問題使用術語「反向代理」。但是,我的問題仍然存在.. – TheMAAAN

回答

0

WebSocket應用程序在客戶端和服務器之間保持一個長時間運行的連接,以促進實時應用程序的開發。用於將連接從HTTP升級到WebSocket的HTTP升級機制使用升級和連接標頭。反向代理服務器在支持WebSocket時面臨一些挑戰。一種是WebSocket是逐跳協議,因此當代理服務器截獲來自客戶端的升級請求時,它需要將自己的升級請求發送到後端服務器,包括適當的標頭。另外,由於WebSocket連接的壽命很長,與HTTP使用的典型的短暫連接相反,反向代理需要允許這些連接保持打開狀態,而不是關閉它們,因爲它們看起來是空閒的。

NGINX通過允許在客戶端和後端服務器之間建立隧道來支持WebSocket。對於NGINX從客戶端發送的升級請求傳遞給後臺服務器,升級和連接頭必須顯式設置,如下例所示:

location /wsapp/ { 
    proxy_pass http://wsbackend; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
} 

一旦做到這一點,NGINX交易以此爲WebSocket連接。

欲瞭解更多詳情,請訪問: - https://www.nginx.com/blog/websocket-nginx/ https://blog.martinfjordvald.com/2013/02/websockets-in-nginx/

希望這將有助於!

+1

你已經解釋了'如何',但我想知道'爲什麼'。當你直接引用nodejs服務器的ip地址和端口時,你爲什麼要使用Nginx作爲反向代理,而不必通過Nginx?因此,當您的靜態內容(例如js文件)需要與節點通信時,您將使用Nginx btu提供所有靜態內容,並直接與其建立WebSocket連接。你明白我的觀點嗎? – TheMAAAN

+0

確定使用nginx的一個原因是代理傳遞你可以使用它來保護你的API你可以暴露或顯示API給前端一個不同的代理通過你可以將它重定向到另一個API你給出的實際API名稱這將保護你的代碼。其次,您可以使用nginx輕鬆啓用gzip壓縮和縮小,並且您的網站排名很高。您還可以使用nginx將您的圖像和文件編入索引。你也可以使用nginx作爲流媒體服務器。 –

+0

所以如果你直接連接,你不會得到這些功能(除非你自己編程)。如果Nginx與nodejs進程位於同一臺機器上,該怎麼辦?你仍然可以利用你列出的功能嗎? – TheMAAAN