Nginx配置WebSocket反向代理的實(shí)現(xiàn)示例
1、WebSocket協(xié)議
? WebSocket協(xié)議相比較于HTTP協(xié)議成功握手后可以多次進(jìn)行通訊,直到連接被關(guān)閉。但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade協(xié)議頭將連接從HTTP升級到WebSocket。這使得WebSocket程序可以更容易的使用現(xiàn)已存在的基礎(chǔ)設(shè)施。
2、Nginx配置WebSocket反向代理
$ vim /usr/local/nginx/conf/nginx.conf (nginx配置文件)
# 在http上下文中增加如下配置,確保Nginx能處理正常http請求。
http {
# 根據(jù)請求頭中的"Upgrade"字段來確定是否升級連接。如果請求頭中的"Upgrade"字段的值為"default",則將其升級為"upgrade"。
如果請求頭中的"Upgrade"字段的值為空字符串(即沒有"Upgrade"字段),則將連接關(guān)閉。
對于其他情況,默認(rèn)將"Upgrade"字段的值設(shè)為"upgrade"。
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# 定義了一個名為"websocket"的負(fù)載均衡集群。
upstream websocket {
#ip_hash; # 這是一個負(fù)載均衡算法的注釋,表示使用IP哈希算法進(jìn)行負(fù)載均衡。
server localhost:8010; # 指定一個后端服務(wù)器地址
server localhost:8011;
}
# 以下配置是在server上下文中添加,location指用于websocket連接的path。
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/yourdomain.log;
location / {
proxy_pass http://websocket;
proxy_http_version 1.1; # 指定使用HTTP/1.1協(xié)議進(jìn)行代理
proxy_set_header Upgrade $http_upgrade; # 將請求頭中的"Upgrade"字段的值傳遞給后端服務(wù)器。
proxy_set_header Connection $connection_upgrade; # 請求頭中的"Connection"字段的值設(shè)為"upgrade",表示要升級連接。
proxy_connect_timeout 4s; # 設(shè)置與后端服務(wù)器建立連接的超時時間為4秒。
proxy_read_timeout 7200s; # 置從后端服務(wù)器讀取響應(yīng)的超時時間為7200秒。
proxy_send_timeout 12s; # 設(shè)置向后端服務(wù)器發(fā)送請求的超時時間為12秒。
proxy_set_header Host $host; # 將請求頭中的"Host"字段的值設(shè)為當(dāng)前請求的主機(jī)名。
proxy_set_header X-Real-IP $remote_addr; # 將請求頭中的"X-Real-IP"字段的值設(shè)為客戶端的真實(shí)IP地址。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 將請求頭中的"X-Forwarded-For"字段的值設(shè)為客戶端IP地址的列表,這樣后端服務(wù)器就可以知道請求的真實(shí)來源IP。
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr; # 將請求頭中的"HTTP_X_FORWARDED_FOR"字段的值設(shè)為客戶端的真實(shí)IP地址。
proxy_set_header X-Forwarded-Proto $scheme; # 將請求頭中的"X-Forwarded-Proto"字段的值設(shè)為請求的協(xié)議類型(HTTP或HTTPS)。
proxy_redirect default; # 默認(rèn)啟用代理重定向。
}
}
}核心是下面的配置 其他和普通反向代理沒區(qū)別, 表示請求服務(wù)器升級協(xié)議為WebSocket
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;
這里面的關(guān)鍵部分在于HTTP的請求中多了如下頭部:
Upgrade: websocket Connection: Upgrade
這兩個字段表示請求服務(wù)器升級協(xié)議為WebSocket。服務(wù)器處理完請求后,響應(yīng)如下報文:
# 狀態(tài)碼為101 HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: upgrade
? 告訴客戶端已成功切換協(xié)議,升級為Websocket協(xié)議。握手成功之后,服務(wù)器端和客戶端便角色對等,就像普通的Socket一樣,能夠雙向通信。不再進(jìn)行HTTP的交互,而是開始WebSocket的數(shù)據(jù)幀協(xié)議實(shí)現(xiàn)數(shù)據(jù)交換。
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-XqnLRKLi-1690603346484)(E:\PRD\Images\image-20230729114740230.png)]](http://img.jbzj.com/file_images/article/202308/202308040831332.png)
3、配置反向代理常見問題
3.1 為什么要配置Host參數(shù)?
WebSocket反向代理需要配置host參數(shù)的原因是WebSocket協(xié)議的特性。在WebSocket協(xié)議中,客戶端在建立與服務(wù)端的WebSocket連接時,會發(fā)送一個Origin頭部字段,用于標(biāo)識請求的來源。這個Origin字段的值通常是客戶端的域名。
當(dāng)使用反向代理來代理WebSocket請求時,代理服務(wù)器會接收到客戶端的WebSocket連接請求。如果沒有配置host參數(shù),代理服務(wù)器會將自己的主機(jī)名作為Origin字段的值發(fā)送給服務(wù)端。而服務(wù)端在驗(yàn)證WebSocket連接時會比較Origin字段的值與其預(yù)期的值是否一致,如果不一致,則會拒絕連接。
為了解決這個問題,需要在反向代理配置中明確指定host參數(shù),將客戶端的原始域名作為host參數(shù)的值發(fā)送給服務(wù)端。這樣服務(wù)端就能正確驗(yàn)證WebSocket連接的來源,從而確保連接的安全性和正確性。
3.2 WebSocket反向代理為什么要設(shè)置http協(xié)議為1.1版本
當(dāng)使用WebSocket反向代理時,將HTTP協(xié)議版本設(shè)置為1.1是為了確保與WebSocket協(xié)議的兼容性和正常工作。
WebSocket協(xié)議是在HTTP協(xié)議基礎(chǔ)上進(jìn)行升級的,它的握手過程與HTTP握手類似。在進(jìn)行WebSocket握手時,客戶端會發(fā)送一個類似HTTP請求的握手請求,然后服務(wù)器進(jìn)行響應(yīng),最終建立WebSocket連接。在這個過程中,需要使用HTTP的一些特性和頭部字段。
將HTTP協(xié)議版本設(shè)置為1.1是因?yàn)閃ebSocket握手過程使用了HTTP/1.1的一些新特性,包括Upgrade頭部字段和Connection頭部字段的值設(shè)置為Upgrade。當(dāng)HTTP協(xié)議版本為1.1時,代理服務(wù)器能夠正確理解并處理這些頭部字段,從而正確地轉(zhuǎn)發(fā)WebSocket握手請求和響應(yīng)。
如果將HTTP協(xié)議版本設(shè)置為較低的版本,如HTTP/1.0,代理服務(wù)器可能無法正確處理WebSocket握手請求,導(dǎo)致握手失敗或連接無法建立。因此,為了保證WebSocket反向代理的正常工作,一般會將HTTP協(xié)議版本設(shè)置為1.1版本。
需要注意的是,雖然WebSocket握手過程使用了HTTP協(xié)議,但WebSocket連接建立后,實(shí)際上是通過WebSocket協(xié)議進(jìn)行數(shù)據(jù)傳輸?shù)?,而不是HTTP協(xié)議。所以,一旦建立了WebSocket連接,HTTP協(xié)議版本的設(shè)置對后續(xù)的數(shù)據(jù)傳輸沒有影響。
到此這篇關(guān)于Nginx配置WebSocket反向代理的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Nginx WebSocket反向代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Linux中查看Apache或Nginx服務(wù)狀態(tài)的詳細(xì)步驟
在Linux中,查看Apache或Nginx服務(wù)的狀態(tài)通常涉及到使用系統(tǒng)管理工具或特定于這些Web服務(wù)器的命令,以下是如何查看Apache和Nginx服務(wù)狀態(tài)的詳細(xì)步驟,需要的朋友可以參考下2024-03-03
NGINX基于cookie針對同一域名進(jìn)行分流轉(zhuǎn)發(fā)
本文介紹了利用NGINX基于cookie進(jìn)行多環(huán)境分流的方法,通過在Docker中部署兩個后端NGINX容器,并在前端NGINX配置中設(shè)置map規(guī)則,根據(jù)cookie值將請求分發(fā)到不同后端,感興趣的可以了解一下2025-07-07
關(guān)于nginx+php5.3.8+eclipse3.7工作空間的配置方法
以前用eclipse3.6時設(shè)置php服務(wù)器時完全可以在base url欄填寫自己工作空間的目錄,然后修改nginx.conf加一個alias就行了2011-11-11
在Nginx服務(wù)器上配置Google反向代理的基本方法
這篇文章主要介紹了在Nginx服務(wù)器上配置Google反向代理的基本方法,文中使用到了SSL來加密反向代理,需要的朋友可以參考下2015-12-12
nginx 關(guān)閉默認(rèn)站點(diǎn)的方法
國內(nèi)機(jī)房一般都要求網(wǎng)站主關(guān)閉空主機(jī)頭,防止未備案的域名指向過來造成麻煩2012-09-09

