方式1.動(dòng)態(tài)判斷是否需要升級(jí)websocket協(xié)議
編輯nginx.conf,在http區(qū)域內(nèi)一定要添加下面配置:
http {
????#自定義變量 $connection_upgrade
????map $http_upgrade $connection_upgrade {
????????default ?????????keep-alive; ?#默認(rèn)為keep-alive 可以支持 一般http請(qǐng)求
????????'websocket' ?????upgrade; ????#如果為websocket 則為 upgrade 可升級(jí)的。
????}
}
map指令的作用:
該作用主要是根據(jù)客戶端請(qǐng)求中$http_upgrade 的值,來構(gòu)造改變$connection_upgrade的值,即根據(jù)變量$http_upgrade的值創(chuàng)建新的變量$connection_upgrade,
創(chuàng)建的規(guī)則就是{}里面的東西。如果 $http_upgrade為websocket的話,那么$connection_upgrade的值為upgrade支持升級(jí)協(xié)議。否則為keep-alive
server {
? ?server_name test.server;
? ?listen 8083;
? ?listen [::]:8083;
?
? ?location / { //默認(rèn)匹配
????????????proxy_pass http://$httpUpstreamName_8083;
? ? ? ? ? ? #Nginx代理webSocket經(jīng)常中斷(超時(shí))的解決方法
????????????proxy_connect_timeout 4s; ???????????????
????????????proxy_read_timeout 60s; ?????????????????#如果沒效,可以考慮這個(gè)時(shí)間配置長(zhǎng)一點(diǎn)
????????????proxy_send_timeout 12s;? ? ? ? ? ? ? ??
????????????#升級(jí)http1.1到 websocket協(xié)議
????????????proxy_http_version 1.1;
????????????proxy_set_header Upgrade $http_upgrade;
????????????proxy_set_header Connection ?$connection_upgrade;
? ? }
}
測(cè)試ws連接轉(zhuǎn)發(fā)是否正常:ws://test.server:8083/
方式2.直接寫死升級(jí)websocket
server {
? ?server_name test.server;
? ?listen 80;
? ?listen [::]:80;
? ?listen 8083;
? ?listen [::]:8083;
? ?listen 8088;
? ?listen [::]:8088;
????location / { #只能通過$serviceName配置 $httpUpstreamName_xxx可能不存在
????????if ($server_port = "80") { #sys default require
????????????proxy_pass http://$serviceName:80;
????????}
????????if ($server_port = "8080") { #sys default require
????????????proxy_pass http://$serviceName:8080;
????????}
????????if ($server_port = "8088") { #custom
????????????proxy_pass http://$serviceName:8088;
????????}
????????proxy_pass http://$serviceName:8083;
????????proxy_http_version 1.1;
????????proxy_set_header Upgrade $http_upgrade;
????????proxy_set_header Connection "upgrade";
? ? }
}
測(cè)試ws連接轉(zhuǎn)發(fā)是否正常:ws://test.server:8083/
拓展閱讀:
在nginx中,每個(gè)server塊應(yīng)該具有唯一的server_name來避免沖突,不同server塊中server_name不允許重復(fù)。
set命令用于設(shè)置變量,set $XX=XX,在server塊中set設(shè)置的變量,僅當(dāng)前server塊中有效。
在 HTTP 協(xié)議中,keep-alive、upgrade 和 close 是三種不同的連接管理方式。它們之間的區(qū)別如下:
keep-alive: 這是 HTTP 的默認(rèn)連接管理方式。當(dāng)使用 keep-alive 時(shí),允許多個(gè)請(qǐng)求和響應(yīng)重復(fù)使用相同的 TCP 連接。這樣可以減少建立和關(guān)閉連接的開銷,提高性能。同一連接上的多個(gè)請(qǐng)求將被連續(xù)發(fā)送和接收,直到達(dá)到連接的最大空閑時(shí)間或收到顯式的關(guān)閉連接指令。
upgrade: 這是一種特殊的連接升級(jí)方式,通常用于支持協(xié)議升級(jí),例如從 HTTP 到 WebSocket。當(dāng)客戶端發(fā)送一個(gè)帶有 “Upgrade” 頭部的請(qǐng)求時(shí),服務(wù)器可以將連接升級(jí)到另一個(gè)具有自定義功能的協(xié)議。在升級(jí)的過程中,服務(wù)器和客戶端之間通常會(huì)協(xié)商協(xié)議的切換和其他必要的握手。文章來源:http://www.zghlxwxcb.cn/news/detail-736616.html
close: 當(dāng)服務(wù)器或客戶端希望終止連接時(shí),可以發(fā)送一個(gè)帶有 “Connection: close” 頭部的請(qǐng)求或響應(yīng)。這會(huì)指示對(duì)方關(guān)閉連接。在這種情況下,無論之前是否啟用了 keep-alive,連接都會(huì)被關(guān)閉,無法復(fù)用。文章來源地址http://www.zghlxwxcb.cn/news/detail-736616.html
到了這里,關(guān)于nginx 配置支持websocket轉(zhuǎn)發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!