<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Nginx配置Websocket指南

          共 4449字,需瀏覽 9分鐘

           ·

          2024-06-16 18:19

          WebSocket 和HTTP雖然是不同協(xié)議,但是兩者“握手”方式兼容。通過HTTP升級機制,使用HTTP的Upgrade和Connection協(xié)議頭的方式可以將連接從HTTP升級為WebSocket。

          Websocket 使用 ws 或 wss 的統(tǒng)一資源標志符,類似于 HTTPS,其中 wss 表示在 TLS 之上的 Websocket。如:

          ws://example.com/wsapi
          wss://secure.example.com/

          Websocket 使用和 HTTP 相同的 TCP 端口,可以繞過大多數(shù)防火墻的限制。默認情況下,Websocket 協(xié)議使用 80 端口;運行在 TLS 之上時,默認使用 443 端口。

          一個典型的Websocket握手請求如下:

          客戶端請求:

          GET / HTTP/1.1
          Upgrade: websocket
          Connection: Upgrade
          Host: example.com
          Origin: http://example.com
          Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
          Sec-WebSocket-Version: 13

          服務器回應:

          HTTP/1.1 101 Switching Protocols
          Upgrade: websocket
          Connection: Upgrade
          Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
          Sec-WebSocket-Location: ws://example.com/

          關鍵點:

          • Connection 必須設置 Upgrade,表示客戶端希望連接升級。

          • Upgrade 字段必須設置 Websocket,表示希望升級到 Websocket 協(xié)議。

          知識點參考:《HTML5 WebSocket》

          一、對wss與nginx代理wss的理解:

          1、wss協(xié)議實際是websocket +SSL,就是在websocket協(xié)議上加入SSL層,類似https(http+SSL)。
          2、利用nginx代理wss【通訊原理及流程】

          1. 客戶端發(fā)起wss連接連到nginx

          2. nginx將wss協(xié)議的數(shù)據(jù)轉換成ws協(xié)議數(shù)據(jù)并轉發(fā)到Workerman的websocket協(xié)議端口

          3. Workerman收到數(shù)據(jù)后做業(yè)務邏輯處理

          4. Workerman給客戶端發(fā)送消息時,則是相反的過程,數(shù)據(jù)經(jīng)過nginx/轉換成wss協(xié)議然后發(fā)給客戶端

          二、Nginx配置Websocket參數(shù)

          示例一:某站點或域名下面代理配置
          server {
          listen 80;
          server_name 域名;

          proxy_http_version 1.1;
          ……

          #啟用支持websocket連接的配置
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";

          location / {
          proxy_redirect off;
          proxy_pass http://myweb_backend;
          proxy_connect_timeout 60;
          proxy_read_timeout 600;
          proxy_send_timeout 600;
          }

          }

          重要的是這兩行,它表明是websocket連接進入的時候,進行一個連接升級將http連接變成websocket的連接。
          啟用支持websocket連接:
          proxy_set_header Upgrade $http_upgrade;

          proxy_set_header Connection "upgrade";
          proxy read timeout 表明連接成功以后等待服務器響應的時候,如果不配置默認為60s;
          proxy_http_version 1.1;表明使用http版本為1.1

          示例二:全部站點或全部服務的代理配置

          上面的配置將websocket寫到某個server里了。實際項目上nginx代理的可能是多個站點,多個服務,這就需要統(tǒng)一設置一下。另外對于低版本nginx的配置不支持"upgrade"參數(shù)的情況下可以這樣寫:
          首先在nginx的全局塊(一般是http塊)里面加上websocket的參數(shù)映射

          http {
          include mime.types;
          default_type text/html;
          charset utf-8;

          log_format proxy '$http_x_real_ip - $remote_user [$time_local] "$request" '
          '$status $body_bytes_sent "$http_referer" '
          '"$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time';

          access_log /dev/stdout proxy;

          sendfile on;
          tcp_nopush on;
          tcp_nodelay on;

          keepalive_timeout 75;
          keepalive_requests 1000;

          client_max_body_size 1020000M;
          client_body_buffer_size 256k;
          large_client_header_buffers 4 128k;
          client_header_buffer_size 32k;
          server_names_hash_max_size 512;
          server_names_hash_bucket_size 128;

          #注意,必須加下面這段websocket的參數(shù)映射
          map $http_upgrade $connection_upgrade {
          default upgrade;
          '' close;
          }

          include /etc/nginx/conf.d/*.conf;
          }

          這里重要的是這四行:
          注意,必須加下面這段websocket的參數(shù)映射
          map  ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? connection_upgrade {
          default upgrade;
          '' close;
          }

          然后在你的server或者location塊里面加上這兩行即可:

          server {
          listen 80;
          server_name 域名;

          proxy_http_version 1.1;
          ……

          #注意,必須加下面這段websocket的配置
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $connection_upgrade;

          location / {
          proxy_redirect off;
          proxy_pass http://myweb_backend;
          proxy_connect_timeout 60;
          proxy_read_timeout 600;
          proxy_send_timeout 600;
          }

          }
          • 示例一和示例二配置一種就行。

          狀態(tài)碼說明

          注意:因為websocket是長連接,請求過程不關閉的所以一般連接狀態(tài)碼是101(請求者已要求服務器切換協(xié)議,服務器已確認并準備切換。)

          CloseEvent接口的代碼只讀屬性返回WebSocket連接關閉代碼,指示服務器關閉連接的原因。
          值:一個整數(shù)的WebSocket連接關閉范圍為1000-4999的代碼,指示服務器關閉連接的原因。
          websocket連接關閉狀態(tài)碼:
          https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code

          不支持websocket協(xié)議現(xiàn)象說明

          網(wǎng)頁控制臺報錯現(xiàn)象:
          1)現(xiàn)象一:網(wǎng)頁控制臺報"WebSocket connection to 'ws://' failed:<無報錯信息>"
          2)現(xiàn)象二:網(wǎng)頁控制臺報"WebSocket connection to 'ws://' failed:Error during WebSocket handshake: Unexpected response code: 400"
          3)現(xiàn)象三:網(wǎng)頁控制臺報"WebSocket connection to 'ws://' failed:The request timed out.

          問題原因與處理方法:
          1.代理/防火墻對訪問端口只開通了http協(xié)議,未支持websocket協(xié)議。可以將代理/防火墻的7層轉發(fā)改為4層轉發(fā),確認是否為websocket協(xié)議/長連接的支持問題。
          2.代理nginx未支持websocket協(xié)議轉發(fā),檢查nginx配置文件中的Upgrade和Connection配置。

          鏈接:https://www.cnblogs.com/xiongzaiqiren/p/Nginx_Websocket.html

          (版權歸原作者所有,侵刪)

          瀏覽 175
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美成人生活片一区三区 | 操逼视频免费观看 | 视频在线一区 | 大香蕉天天| 国产一级视频资源 |