nginx部署時http接口正常,ws接口404

可以這么配置

map $http_upgrade $connection_upgrade {default upgrade;'' close;
}upstream wsbackend{server ip1:port1;server ip2:port2;keepalive 1000;
}server {listen 20038;location /{ proxy_http_version 1.1;proxy_pass http://wsbackend;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_read_timeout 3600s;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;}
}

首先:

map $http_upgrade $connection_upgrade {default upgrade;'' close;
}

表示的是:

如果 $http_upgrade 不為 ‘’ (空),則 $connection_upgrade 為 upgrade 。
如果 $http_upgrade 為 ‘’ (空),則 $connection_upgrade 為 close。
其次:

upstream wsbackend{server ip1:port1;server ip2:port2;keepalive 1000;
}

表示的是 nginx負載均衡:

兩臺服務器 (ip1:port1)和(ip2:port2) 。
keepalive 1000 表示的是每個nginx進程中上游服務器保持的空閑連接,當空閑連接過多時,會關閉最少使用的空閑連接.當然,這不是限制連接總數的,可以想象成空閑連接池的大小,設置的值應該是上游服務器能夠承受的。

server {listen 20038;location /{proxy_http_version 1.1;proxy_pass http://wsbackend;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_read_timeout 3600s;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;}
}

表示的是監聽的服務器的配置

listen 8086 表示 nginx 監聽的端口
locations / 表示監聽的路徑(/表示所有路徑,通用匹配,相當于default)
proxt_http_version 1.1 表示反向代理發送的HTTP協議的版本是1.1,HTTP1.1支持長連接
proxy_pass http://wsbackend; 表示反向代理的uri,這里可以使用負載均衡變量
proxy_redirect off; 表示不要替換路徑,其實這里如果是/則有沒有都沒關系,因為default也是將路徑替換到proxy_pass的后邊
proxy_set_header Host $host; 表示傳遞時請求頭不變, $host是nginx內置變量,表示的是當前的請求頭,proxy_set_header表示設置請求頭
proxy_set_header X-Real-IP $remote_addr; 表示傳遞時來源的ip還是現在的客戶端的ip
proxy_read_timeout 3600s; 表的兩次請求之間的間隔超過 3600s 后才關閉這個連接,默認的60s,自動關閉的元兇
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 表示X-Forwarded-For頭不發生改變
proxy_set_header Upgrade $http_upgrade; 表示設置Upgrade不變
proxy_set_header Connection $connection_upgrade; 表示如果 $http_upgrade為upgrade,則請求為upgrade(websocket),如果不是,就關閉連接
若是實際使用的websocket地址后面還有路徑,比如實際地址是這樣的,訪問地址是 http://www.a.com,實際會轉發給ws://127.0.0.1:8094/ws

Nginx如何支持WebSocket

WebSocket 和HTTP雖然是不同協議,但是兩者“握手”方式兼容。通過HTTP升級機制,使用HTTP的Upgrade和Connection協議頭的方式可以將連接從HTTP升級為WebSocket
在這里插入圖片描述

以下是重點:

  1. map是根據客戶端請求中 $http_upgrade 的值來構造改變 $connection_upgrade 的值,即根據變量 $http_upgrade 的值和{} 里規則創建新的變量 $connection_upgrade并賦值。
    在這里插入圖片描述

  2. HTTP的Upgrade協議頭機制用于將連接從HTTP連接升級到WebSocket連接,Upgrade機制使用了Upgrade協議頭和Connection協議頭;為了讓Nginx可以將來自客戶端的Upgrade請求發送到后端服務器,Upgrade和Connection的頭信息必須被顯式的設置。如上圖代碼中第三個紅圈。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41794.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言,malloc使用規范

malloc 是 C 語言中用于分配內存的函數。它的名稱是“memory allocation”的縮寫。malloc 是在 <stdlib.h> 頭文件中定義的。 malloc 的基本語法是&#xff1a; void* malloc(size_t size); 其中 size_t是要分配的字節數。如果分配成功&#xff0c;malloc返回一個指向分配…

什么是字體堆棧(font stack)?如何設置字體堆棧?

聚沙成塔每天進步一點點 ? 專欄簡介? 什么是字體堆棧&#xff08;Font Stack&#xff09;&#xff1f;? 如何設置字體堆棧&#xff1f;? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 …

【卷積神經網絡】卷積,池化,全連接

隨著計算機硬件的升級與性能的提高&#xff0c;運算量已不再是阻礙深度學習發展的難題。卷積神經網絡&#xff08;Convolution Neural Network&#xff0c;CNN&#xff09;是深度學習中一項代表性的工作&#xff0c;CNN 是受人腦對圖像的理解過程啟發而提出的模型&#xff0c;其…

【分類討論】CF1674 E

Problem - E - Codeforces 題意&#xff1a; 思路&#xff1a; 樣例&#xff1a; 這種分類討論的題&#xff0c;主要是去看答案的最終來源是哪幾種情況&#xff0c;這幾種情況得不重不漏 Code&#xff1a; #include <bits/stdc.h>#define int long longusing i64 lon…

淺談5G技術會給視頻監控行業帶來的一些變革情況

5G是第五代移動通信技術&#xff0c;能夠提供更高的帶寬和更快的傳輸速度&#xff0c;這將為視頻技術的發展帶來大量機會。隨著5G技術的逐步普及與商用&#xff0c;人們將能夠享受到更加流暢的高清視頻體驗&#xff0c;并且5G技術還擁有更低的延遲和更高的網絡容量。這些優勢不…

2023牛客暑期多校訓練營9-B Semi-Puzzle: Brain Storm

2023牛客暑期多校訓練營9-B Semi-Puzzle: Brain Storm https://ac.nowcoder.com/acm/contest/57363/B 文章目錄 2023牛客暑期多校訓練營9-B Semi-Puzzle: Brain Storm題意解題思路代碼 題意 解題思路 歐拉定理 a b ≡ { a b % φ ( p ) g c d ( a , p ) 1 a b g c d ( a ,…

GBU812-ASEMI新能源專用整流橋GBU812

編輯&#xff1a;ll GBU812-ASEMI新能源專用整流橋GBU812 型號&#xff1a;GBU812 品牌&#xff1a;ASEMI 封裝&#xff1a;GBU-4 恢復時間&#xff1a;&#xff1e;50ns 正向電流&#xff1a;80A 反向耐壓&#xff1a;1200V 芯片個數&#xff1a;4 引腳數量&#xff…

Linux系統調試——valgrind內存泄露檢測

代碼可能存在內存泄露怎么辦&#xff1f; 使用valgrind可以對代碼進行內存泄露檢測。 valgrind下載安裝 下載&#xff1a;https://www.valgrind.org/downloads/ 安裝&#xff1a; 1、tar –jxvf valgrind-3.21.0.tar.bz2 2、cd valgrind-3.21.0 3、./configure --prefix/ho…

elementUI date-picker 日期格式轉為 2023/08/08格式

<el-form-item label"基線日期:" prop"baselineDate"><el-date-pickertype"date"v-model"form.baselineDate"placeholder"選擇日期"format"yyyy/MM/dd"change"(date, type) > changeTime(date, …

Springboot 實踐(7)springboot添加html頁面,實現數據庫數據的訪問

前文講解&#xff0c;項目已經實現了數據庫Dao數據接口&#xff0c;并通過spring security數據實現了對系統資源的保護。本文重點講解Dao數據接口頁面的實現&#xff0c;其中涉及頁面導航欄、菜單欄及頁面信息欄3各部分。 1、創建html頁面 前文講解中&#xff0c;資源目錄已經…

使用愛校對提升公文材料準確性的必要性

在我們的工作中&#xff0c;公文材料的準確性往往決定了我們的工作效果。無論是內部的報告、計劃&#xff0c;還是外部的公告、通知&#xff0c;都需要準確無誤才能達到我們預期的效果。為此&#xff0c;我們需要使用強大的工具——愛校對&#xff0c;來提升公文材料的準確性。…

Linux(Ubuntu)系統臨時IP以及靜態IP配置(關閉、啟動網卡等操作)

1 Ubuntu臨時IP設置2 Ubuntu靜態IP設置3 多個網卡IP設置4 關閉、啟動網卡前提是Linux下的網絡橋接不能用,不能通過識別網卡來添加IP地址,只能通過靜態寫死的方式去設置IP 對于CentOS版本下的靜態IP的配置可以參考這篇 Linux系統靜態IP配置(CentOS) 1 Ubuntu臨時IP設置 Li…

SpringBoot整合Shiro實現登錄認證,鑒權授權

文章目錄 前言一、shiro簡介二、環境搭建2.1.數據庫2.1.1user用戶表2.1.2user_role用戶角色關系表2.1.3role角色表2.1.4role_permission角色權限關系表2.1.5permission權限表 2.2導坐標2.3實體類2.3.1User2.3.2Role2.3.3Permission 2.4MVC三層2.4.1User2.4.1.1mapper層2.4.1.2s…

Git 刪除 GitHub倉庫的文件

新建文件夾 git bash here 在新建的文件夾里右鍵git bash here打開終端&#xff0c;并執行git init初始化倉庫 git clone <你的地址> 找到github上要刪除的倉庫地址&#xff0c;并復制&#xff0c;在終端里輸入git clone <你的地址> 要刪除文件的庫里右鍵git b…

BEV感知實時構建路口拓撲 覺非科技基于MapTR的優化與實踐

近期&#xff0c;覺非科技通過在車端與路端的大規模數據積累&#xff0c;基于MapTR&#xff08;Map TRansformer&#xff09;方法提出了創新與優化&#xff1a;①對車道信息的表達方式進行優化&#xff0c;并簡化了模型結構&#xff1b;②在MapTR的基礎上加入了地圖先驗信息&am…

歸并排序(C++ mpi 并行實現)

文章目錄 主要思路1. 串行歸并排序2. 進程的分發3. 對接收到的子數組進行排序4. 合并數組5.輸出排序后的數組6.進程分發部分的優化7.完整代碼 主要思路 我們首先實現串行的歸并排序&#xff1b;實現進程的分發&#xff1b;排序其中的每個子部分&#xff1b;進程的合并通信&…

Spring、Springboot、SpringCloud--包含的知識點大全

類型難度AOPspring-自定義AOP面向切面注解--統一切面處理-登陸信息采集快速入門SpringbootAOP實現切面處理請求Demo線程池通俗易懂的線程池底層原理&#xff0c;一文知所有數據結構數據結構-鏈表篇數據結構--數組篇數據結構之-concurrentHashMap源碼分析JVMJVM調優及各種問題處…

理解 Go 中的切片:append 操作的深入分析(篇2)

理解 Go 語言中 slice 的性質對于編程非常有益。下面&#xff0c;我將通過代碼示例來解釋切片在不同函數之間傳遞并執行 append 操作時的具體表現。 本篇為第 2 篇&#xff0c;當切片的容量 cap 不夠時 func main() {// slice1 當前長度為 3&#xff0c;容量大小也為 3slice1 :…

.netcore grpc的proto文件字段詳解

一、.proto文件字段概述 grpc的接口傳輸參數都是根據.proto文件約定的字段格式進行傳輸的grpc提供了多種類型字段&#xff1b;主要包括標量值類型&#xff08;基礎類型&#xff09;、日期時間、可為null類型、字節、列表、字典、Any類型&#xff08;任意類型&#xff09;、One…

前端筆試+面試分享

以下是個人線下面試遇到的真實的題&#xff0c;僅供參考和學習 1. css 選擇符有哪些&#xff1f;哪些屬性可以繼承&#xff1f;優先級算法加何計算&#xff1f; CSS選擇符有很多種&#xff0c;例如類型選擇器、類選擇器、ID選擇器、屬性選擇器、偽類選擇器、偽元素選擇器等。 …