nginx 反向代理 (websocket)后報 - 400 bad request


nginx的反向代理。 nginx.conf中的配置如下:



  location / {
          proxy_http_version                1.1;
          proxy_set_header Host             $host;
          proxy_set_header X-Real-IP        $remote_addr;
          proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
          proxy_set_header Cookie           $http_cookie;
          proxy_set_header Upgrade          $http_upgrade;
          proxy_set_header Connection       "upgrade";
          proxy_pass                        http://web18;
   }


當客戶端發送GET請求時,程序一切安好,當POST時,ok,返回400 Bad Request,百思不得其解。檢查了參數和后端返回內容,一切正常。然后把目標看向了header


proxy_set_header Connection       "upgrade";  對,就是這一行,刪除之后程序恢復。


那么這一行什么意思呢,繼續剖析,前往nginx官網 http://nginx.org/en/docs/http/websocket.html


添加這一行使原本的http1.1請求升級成為websocket,websocket是什么?


Websocket是html5提出的一個協議規范,參考rfc6455。




    websocket約定了一個通信的規范,通過一個握手的機制,客戶端(瀏覽器)和服務器(webserver)之間能建立一個類似tcp的連接,從而方便c-s之間的通信。在websocket出現之前,web交互一般是基於http協議的短連接或者長連接。


WebSocket是為解決客戶端與服務端實時通信而產生的技術。websocket協議本質上是一個基於tcp的協議,是先通過HTTP/HTTPS協議發起一條特殊的http請求進行握手后創建一個用於交換數據的TCP連接,此后服務端與客戶端通過此TCP連接
進行實時通信。


    以前webserver實現推送技術或者即時通訊,用的都是輪詢(polling),在特定的時間間隔(比如1秒鍾)由瀏覽器自動發出請求,將服務器的消息主動的拉回來,在這種情況下,我們需要不斷的向服務器發送請求,然而HTTPrequest的header是非常長的,里面包含的數據可能只是一個很小的值,這樣會占用很多的帶寬和服務器資源。而最比較新的技術去做輪詢的效果是Comet – 用了AJAX。


    但這種技術雖然可達到全雙工通信,但依然需要發出請求(reuqest)。WebSocketAPI最偉大之處在於服務器和客戶端可以在給定的時間范圍內的任意時刻,相互推送信息。瀏覽器和服務器只需要要做一個握手的動作,在建立連接之后,服務器可以主動傳送數據給客戶端,客戶端也可以隨時向服務器發送數據。此外,服務器與客戶端之間交換的標頭信息很小。WebSocket並不限於以Ajax(或XHR)方式通信,因為Ajax技術需要客戶端發起請求,而WebSocket服務器和客戶端可以彼此相互推送信息;


但是這里客戶端過來握手的協議proxy_set_header Upgrade  $http_upgrade; 空的,造成了badrequest的產生。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM