天天看點

nginx做為websocket反向代理和負載均衡器

這裡先簡單說下websocket與http的差別,websocket是長連接配接,而且用戶端和服務端都可以主動給對方發送資料;而http是短連接配接的(當然可以是長連接配接http 1.1),但是隻能是用戶端主動發起請求,服務端做出響應。

在實際的生産環境中,一般要求多個websocket伺服器必須具備高可用和高性能,這樣webcoket就需要一個負載均衡層,本着有現有的輪子就使用現有輪子的原則,這裡選擇使用nginx做為websocket的反向代理和負載均衡器。雖然websocket和http協定不同,但是websocket與http握手相容,可以使用http更新工具将http連接配接更新為websocket,這有助于websocket更容易的适應現有的軟體架構,比如:websocket應用程式可以使用标準http的80和433端口,進而允許現有的防火牆政策。

websocket應用程式可以在用戶端和伺服器之間保持長時間運作的連接配接,進而有助于開發實時應用程式。用于将連接配接從http更新到websocket的http更新機制使用Upgrade和Connection頭。反向代理伺服器在支援websocket時面臨一些挑戰。一個是websocket是一個逐跳協定,是以當代理伺服器攔截用戶端的更新請求時,需要向後端伺服器發送自己的更新請求,包括相應的頭檔案。此外,由于websocket連接配接長期存在,與http使用的典型短期連接配接相反,反向代理需要允許這些連接配接保持打開狀态,而不是關閉它們,因為它們似乎處于空閑狀态。

允許在客戶機和後端伺服器之間建立隧道,nginx支援websocket。對于nginx将更新請求從用戶端發送到背景伺服器,必須明确設定Upgrade和Connection頭字段。

nginx開啟websocket代理功能的部配置設定置示例如下:

upstream rtc {

    server 10.59.37.20:50000;

    server 10.59.37.21:50000;

    ip_hash;

}

location / {

           client_max_body_size 50m;

           proxy_pass http://rtc;

           proxy_http_version 1.1;

           proxy_set_header Upgrade $http_upgrade;

           proxy_set_header Connection "upgrade";

           proxy_set_header Host $http_host;

           proxy_set_header x-real-ip $remote_addr;

           proxy_set_header x-scheme $scheme;

           proxy_read_timeout 1d;

           proxy_send_timeout 1d;

}

繼續閱讀