1. 程式人生 > >配置Nginx反向代理WebSocket,以代理NoVNC為例

配置Nginx反向代理WebSocket,以代理NoVNC為例

websocket nginx novnc linux


什麽是Nginx?


Nginx (engine x) 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。

Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。其特點是占有內存少,並發能力強,事實上nginx的並發能力確實在同類型的網頁服務器中表現較好。




什麽是WebSocket?


WebSocket協議是創建客戶端和服務器端需要實時雙向通訊的webapp提供了一個選擇。其為HTML5的一部分,WebSocket相較於原來開發這類app的方法來說,其能使開發更加地簡單。

WebSocket協議是基於TCP的一種新的網絡協議。它實現了瀏覽器與服務器全雙工(full-duplex)通信——允許服務器主動發送信息給客戶端。

在實現websocket連線過程中,需要通過瀏覽器發出websocket連線請求,然後服務器發出回應,這個過程通常稱為“握手” 。在 WebSocket API,瀏覽器和服務器只需要做一個握手的動作,然後,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。在此WebSocket 協議中,為我們實現即時服務帶來了兩大好處:

1. Header。互相溝通的Header是很小的-大概只有 2 Bytes。

2. Server Push。服務器的推送,服務器不再被動的接收到瀏覽器的請求之後才返回數據,而是在有新數據時就主動推送給瀏覽器。




什麽是noVNC?


noVNC提供一種在網頁上通過html5的Canvas,訪問機器上vncserver提供的vnc服務,需要做tcp到websocket的轉化,才能在html5中顯示出來。網頁就是一個客戶端,類似win下面的vncviewer,只是此時填的不是裸露的vnc服務的ip+port,而是由noVNC提供的websockets的代理,在noVNC代理服務器上要配置每個vnc服務,noVNC提供一個標識,去反向代理所配置的vnc服務。




WebSocket代理


要將客戶端和服務器之間的連接從HTTP / 1.1轉換為WebSocket,使用HTTP / 1.1中提供的協議切換機制。

然而有一個微妙之處:由於“Upgrade”是一個 逐跳的 頭,它不會從客戶端傳遞到代理服務器。使用正向代理,客戶可以使用該CONNECT 方法來規避這個問題。但是,這不適用於反向代理,因為客戶端不知道任何代理服務器,並且需要在代理服務器上進行特殊處理。

從版本1.3.13開始,nginx實現了特殊的操作模式,如果代理服務器返回了代碼101(交換協議)的響應,客戶端和代理服務器之間建立隧道,客戶端通過請求中的“Upgrade”請求頭。

如上所述,包括“Upgrade”和“Connection”的逐跳標題不會從客戶端傳遞到代理服務器,因此為了讓代理服務器知道客戶端將協議切換到WebSocket的意圖,這些標題必須明確地通過:


http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        listen 80; #修改監聽的端口
        server_name _;
        location / {
            proxy_pass  #修改為需要被反向代理的WebSocket的IP和端口號
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

默認情況下,如果代理服務器在60秒內沒有傳輸任何數據,連接將被關閉。這個超時可以通過proxy_read_timeout指令來增加 。或者,代理服務器可以配置為周期性地發送WebSocket ping幀來重置超時並檢查連接是否仍然存在。




實例--以代理noVNC為例


1)編輯Nginx的配置文件

vim /etc/nginx/nginx.conf


技術分享圖片


2)重啟Nginx服務

service nginx restart


3)測試


連接成功

技術分享圖片









配置Nginx反向代理WebSocket,以代理NoVNC為例