日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Nginx >内容正文

Nginx

Nginx配置Websocket

發布時間:2023/11/23 Nginx 108 coder
生活随笔 收集整理的這篇文章主要介紹了 Nginx配置Websocket 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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

Websocket 使用和 HTTP 相同的 TCP 端口,可以繞過大多數防火墻的限制。默認情況下,Websocket 協議使用 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 協議。

知識點參考:《HTML5 WebSocket》

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

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

  1. 客戶端發起wss連接連到nginx
  2. nginx將wss協議的數據轉換成ws協議數據并轉發到Workerman的websocket協議端口
  3. Workerman收到數據后做業務邏輯處理
  4. Workerman給客戶端發送消息時,則是相反的過程,數據經過nginx/轉換成wss協議然后發給客戶端

二、Nginx配置Websocket參數

示例一:某站點或域名下面代理配置
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代理的可能是多個站點,多個服務,這就需要統一設置一下。另外對于低版本nginx的配置不支持"upgrade"參數的情況下可以這樣寫:
首先在nginx的全局塊(一般是http塊)里面加上websocket的參數映射

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的參數映射
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

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

這里重要的是這四行:
注意,必須加下面這段websocket的參數映射
map $http_upgrade $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;
    }

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

狀態碼說明

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

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

不支持websocket協議現象說明

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

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

【完】

總結

以上是生活随笔為你收集整理的Nginx配置Websocket的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。