Nginx配置反向代理websocket

【1】websocket協議

WebSocket是一種在單個TCP連接上進行全雙工通信的協議。WebSocket通信協議於2011年被IETF定爲標準RFC 6455,並由RFC7936補充規範。WebSocket API也被W3C定爲標準。

WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。

WebSocket 協議提供了一種創建支持客戶端和服務端實時雙向通信Web應用程序的方法。作爲HTML5規範的一部分,WebSocket簡化了開發Web實時通信程序的難度。目前主流的瀏覽器都支持WebSocket,包括火狐、IE、Chrome、Safari以及Opera等,而且,越來越多的服務器應用框架也開始支持WebSocket。

WebSocket協議和HTTP協議不同,但是WebSocket協議的握手和HTTP是兼容的,它使用HTTP的Upgrade協議頭將連接從HTTP連接升級到WebSocket連接。這個特性使得WebSocket應用程序可以很容易地應用到現有的基礎設施。例如,WebSocket應用可以使用標準的80和443 HTTP端口,因此可以通過現有的防火牆設施。

WebSockets應用程序會在客戶端和服務器之間建立一個長連接,使得開發實時應用很容易。HTTP的Upgrade協議頭機制用於將連接從HTTP連接升級到WebSocket連接,Upgrade機制使用了Upgrade協議頭和Connection協議頭。反向代理服務器在支持WebSocket協議方面面臨着一些挑戰。挑戰之一是WebSocket是一個逐段轉發(hop-by-hop)協議,因此當代理服務器攔截到來自客戶端的Upgrade請求時,代理服務器需要將自己的Upgrade請求發送給後端服務器,包括適合的請求頭。而且,由於WebSocket連接是長連接,與傳統的HTTP端連接截然不同,故反向代理服務器還需要允許這些連接處於打開(Open)狀態,而不能因爲其空閒就關閉了連接。


【2】NGINX配置websocket反向代理

反向代理是指以代理服務器來接受網絡上的連接請求,然後將請求轉發給內部網絡上的服務器, 並將從服務器上得到的結果返回給請求連接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。

Nginx通過在客戶端和後端服務器之間建立隧道來支持WebSockets通信。爲了讓Nginx可以將來自客戶端的Upgrade請求發送到後端服務器,Upgrade和Connection的頭信息必須被顯式的設置。

nginx.conf配置如下所示:

http{
	map $http_upgrade $connection_upgrade {
	    default upgrade;
	      ''      close;
	  }
    
	server {
	    listen       80;
	     location / {
	         proxy_pass http://127.0.0.1:8080;
	             # 支持websocket
	             proxy_http_version 1.1;
	             proxy_set_header Upgrade $http_upgrade;
	             proxy_set_header Connection "upgrade";
	     }
	 }
}

map指令的作用

根據客戶端請求中$http_upgrade 的值,來構造改變$connection_upgrade的值。即根據變量$http_upgrade的值創建新的變量$connection_upgrade。 創建的規則就是{}裏面的東西。其中的規則沒有做匹配,因此使用默認的。即 $connection_upgrade 的值會一直是 upgrade。然後如果 $http_upgrade爲空字符串的話,那值會是 close

實例如下圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章