簡介Nginx服務(wù)器的Websockets配置方法
Nginx 1.3.13 已經(jīng)發(fā)布了,該版本支持 Connection: upgrade 和 Upgrade 頭,這就意味著支持WebSocket代理了.很多人都在等這個(gè)新特性以至于 “Nginx 支持 websockets 嗎?” 成為了 freenode上的#nginx頻道最常問的問題. 有了這種方式,讓我們來看看Nginx的WebSocket實(shí)現(xiàn).
Nginx新添加的Websockets配置指令
文檔中提到的配置如下:(譯者注:原文中的鏈接其實(shí)不是文檔的鏈接.現(xiàn)在nginx的官方文檔中已經(jīng)有websocket的說明了http://nginx.org/en/docs/http/websocket.html)
location /chat/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
這配置的確是相當(dāng)簡單連配置HTTP的版本都是以前版本就支持的. 我們還可以稍微優(yōu)化一下配置,通過創(chuàng)建一個(gè)鏈接的變量把proxy_set_headers放到一個(gè)公共的包含文件中,以此來提高通用性.
map $http_connection $upgrade_requested {
default upgrade;
'' close;
}
這樣使得變量 $upgrade_requested 可以在 proxy_set_header Connection 里面使用,而且如果沒有 upgrade 的鏈接請(qǐng)求,則Conection這個(gè)頭會(huì)被設(shè)置為"",這樣就不會(huì)干擾普通的請(qǐng)求了.這樣做的好處是,如果你只使用HTTP/1.1代理,那么你不需要再另外配置一個(gè)location來專門處理WebSockets.
鏈接升級(jí)似乎沒有往后移植到穩(wěn)定的版本中,因此如果你想要使用鏈接升級(jí)功能,你必須使用開發(fā)版本。感激的是nginx的開發(fā)版本并不意味著它不是運(yùn)行穩(wěn)定版,只是意味著API會(huì)變,在這種情況下只會(huì)影響模塊的編寫者。不要害怕安裝開發(fā)版本來嘗試這個(gè)新特征。
局限性:
到目前為止,在websocket的執(zhí)行部署中有一些局限性:
客戶端必須制定鏈接升級(jí)
客戶端必須請(qǐng)求鏈接升級(jí),否則nginx將會(huì)失敗。當(dāng)前這個(gè)要求在代碼里列為要做的部分,因此我需要說它是怎么失敗的,但是我可以肯定的是它最后也會(huì)被執(zhí)行,因此我不需要依賴它。這個(gè)約束對(duì)任何人來說不是個(gè)問題,只會(huì)在當(dāng)模塊的編寫者或許想要應(yīng)用連接升級(jí)到后端且本身處理響應(yīng)的情況下才會(huì)是問題。
WebSockets 超時(shí)
WebSockets 仍然受到缺省為60秒的proxy_read_timeout 的影響。這意味著,如果你有一個(gè)程序使用了 WebSockets,但又可能超過60秒不發(fā)送任何數(shù)據(jù)的話,那你要么需要增加超時(shí)時(shí)間,要么實(shí)現(xiàn)一個(gè) ping 的消息以保持聯(lián)系。使用 ping 的解決方法有額外的好處,可以發(fā)現(xiàn)連接是否被意外關(guān)閉。
Keep-Alive & WebSockets
Keep-alive pings 對(duì)上述超時(shí)問題無效,因?yàn)樗鼈冎皇窃?TCP 級(jí)別上發(fā)送空包。它們不向應(yīng)用程序報(bào)告,所以應(yīng)用程序也不響應(yīng)它們,因此 proxy_read_timeout 仍然會(huì)觸發(fā)。
WebSockets支持SSL
由于WebSockets綁定在正常的代理模塊中,所以SSL照常的工作運(yùn)行。
代理緩存
WebSockets利用兩個(gè)內(nèi)存緩沖區(qū)來實(shí)現(xiàn)代理緩存配置(proxy_buffer_size)的大小,一個(gè)用于上行數(shù)據(jù),另一個(gè)用于下行數(shù)據(jù)。WebSockets和普通的代理請(qǐng)求所不同的是,WebSockets不會(huì)將數(shù)據(jù)緩存到磁盤。
大小寫敏感的Upgrade頭部
有一些后端程序?qū)pgrade頭做大小寫檢查,同時(shí)支持“upgrade”和“Upgrade”兩種寫法,否則的話,只有“upgrade”寫法能正常工作。如果配置看上去都正確,就是不能正常工作,就要嘗試修改頭部的大小寫了。
相關(guān)文章
Nginx定時(shí)切割日志實(shí)現(xiàn)詳解
這篇文章主要介紹了Nginx定時(shí)切割日志詳解,Nginx日志默認(rèn)情況下寫入到一個(gè)文件中,為了區(qū)分各個(gè)域下的日志,我們一般會(huì)分開存儲(chǔ)。即時(shí)這樣,文件也會(huì)變的越來越大,非常不方便查看分析。下面來聊聊以日期來分隔Nginx日志,需要的朋友可以參考下2019-07-07Nginx listen 監(jiān)聽端口的實(shí)現(xiàn)配置
本文將介紹Nginx的listen指令及其在配置文件中的應(yīng)用,通過了解listen指令,我們可以知道Nginx如何監(jiān)聽端口,并配置相應(yīng)的服務(wù)器塊來處理進(jìn)入的請(qǐng)求2023-12-12Nginx實(shí)現(xiàn)if多重判斷配置方法示例
這篇文章主要介紹了Nginx實(shí)現(xiàn)if多重判斷配置方法示例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05