1. 程式人生 > 其它 >nginx教程:Nginx配置websocket的wss訪問

nginx教程:Nginx配置websocket的wss訪問

技術標籤:nginxnginxlinuxubuntu伺服器負載均衡

前景回顧

最近自己的伺服器需要上上線一個websocket服務,本地測試什麼的都是正常的,知道上線的時候,發現報瞭如下錯誤在這裡插入圖片描述
從圖中可以發現,如果內嵌websocket的站點是https加密的,則需要使用wss協議,而不是ws協議。毫無疑問我們就需要使用 wss:\ 安全協議了,那不簡單,直接把ws:\ 改為 wss:\ 不就行了?
說幹就幹。

在這裡插入圖片描述

好吧,還是太天真
上面的錯誤很明顯 SSL 協議錯誤,說明就是證書問題了。測試的時候我們一直拿的是 IP地址 + 埠號 這種方式連線 WebSocket 的,所以一直不存在問題,但是生成環境我們肯定不能再用 IP地址 + 埠號這種形式了。看來簡單的改協議頭解決不了問題。那麼怎麼才能解決問題呢?
Nginx 配置域名支援 WSS
#在nginx內新增該段內容
location /websocket {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
上文的具體作用就是將原來的websocket埠,掛載在https對應伺服器下的/websocket路由下,http://backend 就是你的websocket url 。這樣就完成了,在 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 官方文件:http://nginx.org/en/docs/http/websocket.html
這個方法就比較複雜了,需要在你的websocket伺服器下加入證書支援,而對於不同的載體就要根據實際情況來選擇支援的方法,個人推薦選擇第一種