誰說WebSocket只能和阿帕奇搭配騰云網(wǎng)絡帶你看看WebSocket與Nginx的小秘密
2019-07-23
代理服務器獲取流量的方式
Nginx代理的方式
Nginx如何支持WebSocket
Nginx配置WebSocket方式
一、代理服務器獲取流量的方式
客戶端通常都會直接與Web服務器進行通信。那么當使用代理服務器作為客戶端和服務器兩者間一個“中介”時,代理服務器獲取流量的方式有以下四種方式:
修改客戶端:將客戶端配置為使用代理服務器,那么客戶端會直接將HTTP請求有意的發(fā)送到代理服務器上。
修改網(wǎng)絡:網(wǎng)絡基礎(chǔ)設備可以通過若干種技術(shù)手段,在客戶端不知情或沒有參與的情況下,攔截網(wǎng)絡流量并將其導入代理,這種代理稱為攔截代理。
修改DNS命名空間:放在Web服務器之前的代理服務器,替代物,會直接假扮Web服務器的名字和IP地址
修改Web服務器:將Web服務器配置為向客戶端發(fā)送一條HTTP重定向命令,將客戶端的請求重定向到代理服務器上。
二、Nginx代理的方式
客戶端和代理服務器建立連接并發(fā)送請求,代理服務器端接收客戶端的請求后與具體的服務器建立連接,并把請求分發(fā)給服務器進行處理,最后再將服務器的響應結(jié)果反饋給客戶端。
三、Nginx如何支持WebSocket
WebSocket 和HTTP雖然是不同協(xié)議,但是兩者“握手”方式兼容。通過HTTP升級機制,使用HTTP的Upgrade和Connection協(xié)議頭的方式可以將連接從HTTP升級為WebSocket。如下圖所示
Http升級為WebSocket
因為WebSocket協(xié)議是一個hop-by-hop協(xié)議(此類頭部字段只對單次轉(zhuǎn)發(fā)有效。會因為轉(zhuǎn)發(fā)給緩存/代理服務器而失效),為了讓Nginx代理服務器可以將來自客戶端的Upgrade請求發(fā)送到后端服務器,要求Upgrade和Connection的頭信息必須被顯式的設置??梢酝ㄟ^下文將要講解的修改Nginx的配置文件方式解決此問題。
代理服務器分別與客戶端和服務器建立連接,由于WebSocket連接是長時間保持的,所以代理服務器需要允許這些連接處于打開狀態(tài),而不是像對待HTTP使用的短連接那樣將其關(guān)閉。
四、Nginx配置Websocket方式
通過修改nginx.conf配置,如下圖所示
1.map是根據(jù)客戶端請求中 $http_upgrade 的值來構(gòu)造改變 $connection_upgrade 的值,即根據(jù)變量 $http_upgrade 的值和{} 里規(guī)則創(chuàng)建新的變量 $connection_upgrade并賦值。
2.HTTP的Upgrade協(xié)議頭機制用于將連接從HTTP連接升級到WebSocket連接,Upgrade機制使用了Upgrade協(xié)議頭和Connection協(xié)議頭;為了讓Nginx可以將來自客戶端的Upgrade請求發(fā)送到后端服務器,Upgrade和Connection的頭信息必須被顯式的設置。如上圖代碼中第三個紅圈。
五、總結(jié)
通過Http升級機制將Http升級為WebSocket。Nginx代理服務器通過修改配置的方式解決了WebSocket屬于hop-by-hop協(xié)議的問題、并通過保持分別與客戶端和服務端的連接一直處于打開狀態(tài)從而實現(xiàn)WebSokcet的代理。