中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WebSocket 結合 Nginx 實現域名及 WSS 協議訪問

發布時間:2020-07-19 02:42:17 來源:網絡 閱讀:4498 作者:xmgdc 欄目:建站服務器

簡單了解一下 WebSocket

現在,很多網站為了實現推送技術,所用的技術都是輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務器發出HTTP請求,然后由服務器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務器發出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。
在這種情況下,HTML5定義了WebSocket協議,能更好的節省服務器資源和帶寬,并且能夠更實時地進行通訊。
WebSocket一種在單個 TCP 連接上進行全雙工通訊的協議。使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在 WebSocket API 中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,并進行雙向數據傳輸。

以上信息摘自維基百科(ht t p s: / / z h . w i ki p e d i a .o r g / w i ki / W e b So cket)

簡單點說,WebSocket 就是減小客戶端與服務器端建立連接的次數,減小系統資源開銷,只需要一次 HTTP 握手,整個通訊過程是建立在一次連接/狀態中,也就避免了HTTP的非狀態性,服務端會一直與客戶端保持連接,直到你關閉請求,同時由原本的客戶端主動詢問,轉換為服務器有信息的時候推送。當然,它還能做實時通信、更好的二進制支持、支持擴展、更好的壓縮效果等這些優點。

推薦一個知乎上叫 Ovear 的網友關于 WebSocket 原理的回答,嘻哈風格科普文,簡直不要更贊了!地址:htt p s :/ / w w w . z hi h u .c o m / q ue s t i o n /2 0 2 1 5 5 61 / a n s w e r/ 4 0 3 1 69 53 

 ws 和 wss 又是什么鬼?

Websocket使用 ws 或 wss 的統一資源標志符,類似于 HTTP 或 HTTPS,其中 wss 表示在 TLS 之上的 Websocket ,相當于 HTTPS 了。如:

ws://example.com/chat
wss://example.com/chat

默認情況下,Websocket 的 ws 協議使用 80 端口;運行在TLS之上時,wss 協議默認使用 443 端口。其實說白了,wss 就是 ws 基于 SSL 的安全傳輸,與 HTTPS 一樣樣的道理。

如果你的網站是 HTTPS 協議的,那你就不能使用 ws:// 了,瀏覽器會 block 掉連接,和 HTTPS 下不允許 HTTP 請求一樣,如下圖:
WebSocket 結合 Nginx 實現域名及 WSS 協議訪問

Mixed Content: The page at 'https://domain.com/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://x.x.x.x:xxxx/'. This request has been blocked; this endpoint must be available over WSS.

這種情況,毫無疑問我們就需要使用 wss:\\ 安全協議了,我們是不是簡單的把 ws:\\ 改為 wss:\\ 就行了?那試試唄。

改好了,報錯啦!!!
WebSocket 結合 Nginx 實現域名及 WSS 協議訪問

VM512:35 WebSocket connection to 'wss://IP地址:端口號/websocket' failed: Error in connection establishment: net::ERR_SSL_PROTOCOL_ERROR

很明顯 SSL 協議錯誤,說明就是證書問題了。記著,這時候我們一直拿的是 IP地址 + 端口號 這種方式連接 WebSocket 的,這根本就沒有證書存在好么,況且生成環境你也要用 IP地址 + 端口號 這種方式連接 WebSocket 嗎?肯定不行阿,要用域名方式連接 WebSocket 阿。

Nginx 配置域名支持 WSS

不用廢話,直接在配置 HTTPS 域名位置加入如下配置:

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

接著拿域名再次連接試一下,不出意外會看 101 狀態碼:
WebSocket 結合 Nginx 實現域名及 WSS 協議訪問

這樣就完成了,在 HTTPPS 下以域名方式連接 WebSocket ,可以開心的玩耍了。

稍微解釋一下 Nginx 配置
Nginx 自從 1.3 版本就開始支持 WebSocket 了,并且可以為 WebSocket 應用程序做反向代理和負載均衡
WebSocket 和 HTTP 協議不同,但是 WebSocket 中的握手和 HTTP 中的握手兼容,它使用 HTTP 中的 Upgrade 協議頭將連接從 HTTP 升級到 WebSocket,當客戶端發過來一個 Connection: Upgrade請求頭時,Nginx 是不知道的,所以,當 Nginx 代理服務器攔截到一個客戶端發來的 Upgrade 請求時,需要顯式來設置Connection 、Upgrade 頭信息,并使用 101(交換協議)返回響應,在客戶端和代理服務器、后端服務器之間建立隧道來支持 WebSocket。

當然,還需要注意一下,WebSockets 仍然受到 Nginx 缺省為60秒的 proxy_read_timeout 的影響。這意味著,如果你有一個程序使用了 WebSockets,但又可能超過60秒不發送任何數據的話,那你要么需要增加超時時間,要么實現一個 ping 的消息以保持聯系。使用 ping 的解決方法有額外的好處,可以發現連接是否被意外關閉。

更具體文檔詳見 Nginx 官方文檔:ht t p :/ / n g i n x. o r g /e n / d o cs / h t t p/ w e bs o c k et . html

總結一下

這一篇文章主要了解一下 WebSocket 基本原理和一些使用用途,并解決在實際開發使用過程中遇到的坑,HTTPS 下使用 wss 協議的問題,以及配合 Nginx 使用域名方式建立連接,不使用 IP地址 + 端口號 連接 WebSocket,因為這種方式不夠優雅。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

合江县| 许昌县| 衡水市| 梅州市| 临沂市| 施秉县| 苍溪县| 福海县| 两当县| 兴隆县| 清镇市| 龙川县| 凤翔县| 白银市| 常州市| 绵阳市| 定兴县| 镇安县| 漠河县| 德安县| 文山县| 陕西省| 长兴县| 衢州市| 德化县| 封丘县| 红原县| 天等县| 尉氏县| 济南市| 阿拉善盟| 高淳县| 洞头县| 英超| 阿克陶县| 乌苏市| 阳东县| 弥勒县| 玉山县| 阳朔县| 杂多县|