nginx反向代理WebSocket

nginx反向代理WebSocket

WebSocket工作在HTTP的80和443端口並使用前綴ws://或者wss://進行協議標註,在建立連接時使用HTTP/1.1的101狀態碼進行協議切換, 當前標準不支持兩個客戶端之間不借助HTTP直接建立Websocket連接。

 map $http_upgrade $connection_upgrade {
     default upgrade;
     '' close;
 }
 
 upstream websocket {
     server localhost:8282; # appserver_ip:ws_port
 }
 
 server {
      server_name test.enzhico.net;
      listen 443 ssl;
      location / {
          proxy_pass http://websocket;
          proxy_read_timeout 300s;
          proxy_send_timeout 300s;
         
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $connection_upgrade;
      }
 }

 

最重要的就是在反向代理的配置中增加了如下兩行,其它的部分和普通的HTTP反向代理沒有任何差別。

 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection $connection_upgrade

這裏面的關鍵部分在於HTTP的請求中多瞭如下頭部:

 Upgrade: websocket
 Connection: Upgrade

使用map指令可以將變量組合成爲新的變量,會根據客戶端傳來的連接中是否帶有Upgrade頭來決定是否給源站傳遞Connection頭, 這樣做的方法比直接全部傳遞upgrade更加優雅。

 

兩個超時參數

proxy_read_timeout

語法 proxy_read_timeout time 默認值 60s 上下文 http server location 說明 該指令設置與代理服務器的讀超時時間。它決定了nginx會等待多長時間來獲得請求的響應。 這個時間不是獲得整個response的時間,而是兩次reading操作的時間。

proxy_send_timeout

語法 proxy_send_timeout time 默認值 60s 上下文 http server location 說明 這個指定設置了發送請求給upstream服務器的超時時間。超時設置不是爲了整個發送期間,而是在兩次write操作期間。 如果超時後,upstream沒有收到新的數據,nginx會關閉連接

 

參考文章: https://www.xncoding.com/2018/03/12/fullstack/nginx-websocket.html

 

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