【詳解】Nginx配置WebSocket

目錄

Nginx配置WebSocket

簡介

準備工作

檢查 Nginx 版本

配置 Nginx 支持 WebSocket

修改 Nginx 配置文件

解釋配置項

測試配置

測試 WebSocket 連接

WebSocket 服務端 (Node.js)

WebSocket 客戶端 (HTML + JavaScript)

運行測試

Nginx 配置文件示例

解釋

測試配置

1. 確保Nginx版本支持WebSocket

2. 安裝Nginx(如果尚未安裝)

3. 配置Nginx支持WebSocket

4. 解釋配置

5. 測試配置

6. 驗證WebSocket連接


Nginx配置WebSocket

簡介

WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議。WebSocket 使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在 WebSocket API 中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,并進行雙向數據傳輸。

Nginx 作為高性能的 HTTP 和反向代理服務器,在處理 WebSocket 協議時,需要進行特定的配置來支持 WebSocket 的連接和通信。本文將詳細介紹如何在 Nginx 中配置 WebSocket。

準備工作

在開始配置之前,請確保您的環境中已經安裝了 Nginx,并且 Nginx 版本至少為 1.3.13,因為這是 Nginx 開始支持 WebSocket 協議的版本。

檢查 Nginx 版本
nginx -v

如果版本低于 1.3.13,您需要更新或重新編譯 Nginx 以包含 WebSocket 支持。

配置 Nginx 支持 WebSocket

修改 Nginx 配置文件

打開您的 Nginx 配置文件,通常位于 ??/etc/nginx/nginx.conf?? 或 ??/etc/nginx/conf.d/?? 目錄下。找到您想要配置 WebSocket 的 server 塊,添加以下配置:

server {listen 80;server_name your_domain.com;location /ws/ {proxy_pass http://backend_server;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;}
}
解釋配置項
  • ??proxy_pass http://backend_server;??:指定后端 WebSocket 服務的地址。
  • ??proxy_http_version 1.1;??:設置代理使用的 HTTP 版本為 1.1,這是 WebSocket 所必需的。
  • ??proxy_set_header Upgrade $http_upgrade;??:傳遞 Upgrade 頭信息給后端服務器,這告訴服務器客戶端希望升級到 WebSocket 協議。
  • ??proxy_set_header Connection "upgrade";??:傳遞 Connection 頭信息,用于控制或指定當前連接或消息體的性質。
  • ??proxy_set_header Host $host;??:傳遞原始請求中的主機頭信息給后端服務器。
測試配置

修改完配置文件后,先測試配置是否正確:

nginx -t

如果沒有錯誤,重啟 Nginx 使配置生效:

sudo systemctl restart nginx

或者

sudo service nginx restart

測試 WebSocket 連接

為了驗證 Nginx 是否成功配置了 WebSocket,您可以編寫一個簡單的 WebSocket 客戶端和服務端來進行測試。這里提供一個基本的示例:

WebSocket 服務端 (Node.js)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', ws => {console.log('Client connected');ws.on('message', message => {console.log('Received:', message);ws.send(`Echo: ${message}`);});
});
WebSocket 客戶端 (HTML + JavaScript)
<!DOCTYPE html>
<html>
<head><title>WebSocket Test</title>
</head>
<body><script>const socket = new WebSocket('ws://your_domain.com/ws/');socket.onopen = () => {console.log('Connected to the WebSocket server.');socket.send('Hello Server!');};socket.onmessage = event => {console.log('Message from server:', event.data);};socket.onclose = () => {console.log('Disconnected from the WebSocket server.');};</script>
</body>
</html>
運行測試
  1. 啟動 WebSocket 服務端。
  2. 打開瀏覽器,訪問包含 WebSocket 客戶端代碼的 HTML 頁面。
  3. 查看瀏覽器的開發者工具中的控制臺輸出,確認與 WebSocket 服務端的連接和消息收發是否正常。

如果您遇到任何問題,建議檢查 Nginx 日志和 WebSocket 服務端的日志,以便快速定位問題。在許多現代Web應用中,WebSocket被廣泛用于實現實時通信,例如在線聊天、實時數據更新等。Nginx 作為高性能的HTTP和反向代理服務器,可以通過配置支持WebSocket協議,從而為這些應用提供支持。

以下是一個Nginx配置文件的示例,該配置文件展示了如何設置Nginx以支持WebSocket連接:

Nginx 配置文件示例
# 定義一個http塊
http {# 設置日志格式log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;error_log /var/log/nginx/error.log;# 包含其他配置文件include       /etc/nginx/mime.types;default_type  application/octet-stream;# 設置發送文件的最大大小client_max_body_size 10M;# 定義一個server塊server {listen 80;  # 監聽80端口server_name example.com;  # 你的域名# 配置靜態文件目錄location / {root /usr/share/nginx/html;index index.html index.htm;}# 配置WebSocket代理location /ws/ {proxy_pass http://localhost:3000;  # 后端WebSocket服務地址proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";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 X-NginX-Proxy true;# 超時時間(單位:秒)proxy_read_timeout 86400s;proxy_send_timeout 86400s;}}
}
解釋
  1. listen 80;:這行指定了Nginx監聽80端口。
  2. server_name ??example.com??;:指定服務器的域名。
  3. location / { ... }:這部分配置了靜態文件的處理方式。
  4. location /ws/ { ... }:這部分是關鍵,配置了WebSocket的代理:
  • proxy_pass ?http://localhost:3000?;:將請求轉發到后端的WebSocket服務。這里的??localhost:3000??應該替換為你實際的WebSocket服務地址。
  • proxy_http_version 1.1;:設置HTTP版本為1.1,因為WebSocket需要使用HTTP 1.1。
  • proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";:這兩行是關鍵,告訴Nginx這是一個WebSocket連接。
  • proxy_set_header Host $host; 等:設置一些必要的頭部信息,幫助后端服務正確處理請求。
  • proxy_read_timeout 86400s;proxy_send_timeout 86400s;:設置讀寫超時時間為24小時,確保長時間連接不會被Nginx中斷。
測試配置

在修改完Nginx配置文件后,可以使用以下命令測試配置是否正確:

sudo nginx -t

如果測試通過,可以重新加載Nginx以應用新的配置:

sudo systemctl reload nginx

這樣,Nginx就配置好了對WebSocket的支持。希望這個示例對你有幫助!如果有任何問題或需要進一步的幫助,請隨時告訴我。當然可以!在Nginx中配置WebSocket支持可以讓Nginx作為反向代理服務器,將WebSocket請求轉發到后端的WebSocket服務。以下是一個詳細的步驟和示例配置,幫助你在Nginx中配置WebSocket。

1. 確保Nginx版本支持WebSocket

首先,確保你的Nginx版本支持WebSocket。從Nginx 1.3.13版本開始,Nginx就已經支持WebSocket協議。你可以通過以下命令檢查Nginx版本:

nginx -v
2. 安裝Nginx(如果尚未安裝)

如果你還沒有安裝Nginx,可以通過以下命令進行安裝(以Ubuntu為例):

sudo apt update
sudo apt install nginx
3. 配置Nginx支持WebSocket

編輯Nginx的配置文件,通常位于??/etc/nginx/nginx.conf??或??/etc/nginx/sites-available/default??。你可以在??server??塊中添加WebSocket相關的配置。

以下是一個示例配置:

http {# 其他HTTP配置upstream websocket_backend {server 127.0.0.1:8080;  # WebSocket服務的地址和端口}server {listen 80;server_name your_domain.com;location /ws/ {proxy_pass http://websocket_backend;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;# 可選:設置超時時間proxy_read_timeout 86400s;proxy_send_timeout 86400s;}# 其他location配置location / {# 例如,靜態文件服務root /var/www/html;index index.html index.htm;}}
}
4. 解釋配置
  • ??upstream websocket_backend??: 定義一個后端WebSocket服務的集群。這里假設WebSocket服務運行在??127.0.0.1:8080??。
  • ??listen 80;??: 監聽80端口。
  • ??server_name your_domain.com;??: 指定服務器名稱,替換為你的實際域名。
  • ?location /ws/??: 定義處理WebSocket請求的路徑。
  • ??proxy_pass http://websocket_backend;??: 將請求轉發到定義的后端WebSocket服務。
  • ??proxy_http_version 1.1;??: 使用HTTP/1.1版本,因為WebSocket協議基于HTTP/1.1。
  • ??proxy_set_header Upgrade $http_upgrade;??: 設置??Upgrade??頭,告訴后端這是一個WebSocket升級請求。
  • ??proxy_set_header Connection "upgrade";??: 設置??Connection??頭,告訴后端連接需要升級。
  • ??proxy_set_header Host $host;??: 設置??Host??頭,傳遞客戶端請求的主機名。
  • ??proxy_read_timeout 86400s;?? 和 ??proxy_send_timeout 86400s;??: 設置讀取和發送超時時間為24小時,防止連接因長時間無數據傳輸而被關閉。
5. 測試配置

保存配置文件后,測試Nginx配置是否正確:

sudo nginx -t

如果沒有錯誤,重新加載Nginx以應用新的配置:

sudo systemctl reload nginx
6. 驗證WebSocket連接

你可以使用瀏覽器或其他工具(如??wscat??)來驗證WebSocket連接是否正常工作。例如,使用??wscat??:

npm install -g wscat
wscat -c ws://your_domain.com/ws/

如果連接成功,說明Nginx已經正確配置了WebSocket支持。

希望這些信息對你有幫助!如果有任何問題,請隨時提問。

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

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

相關文章

《軌道力學講義》——第八講:行星際軌道設計

第八講&#xff1a;行星際軌道設計 引言 行星際軌道設計是探索太陽系的核心技術&#xff0c;它涉及如何規劃和優化航天器從一個天體到另一個天體的飛行路徑。隨著人類探索太陽系的雄心不斷擴大&#xff0c;從最初的月球探測到火星探測&#xff0c;再到更遙遠的外太陽系探測&a…

操作系統學習筆記——[特殊字符]超詳細 | 如何喚醒被阻塞的 socket 線程?線程阻塞原理、線程池、fork/vfork徹底講明白!

&#x1f4a1;超詳細 | 如何喚醒被阻塞的 socket 線程&#xff1f;線程阻塞原理、線程池、fork/vfork徹底講明白&#xff01; 一、什么是阻塞&#xff1f;為什么線程會阻塞&#xff1f;二、socket線程被阻塞的典型場景&#x1f9e0; 解法思路&#xff1a; 三、線程的幾種阻塞狀…

第十六屆藍橋杯大賽軟件賽省賽 Python 大學 B 組 滿分題解

題面鏈接Htlang/2025lqb_python_b 個人覺得今年這套題整體比往年要簡單許多&#xff0c;但是G題想簡單了出大問題&#xff0c;預估50101015120860&#xff0c;道阻且長&#xff0c;再接再厲 代碼僅供學習參考&#xff0c;滿分為賽后洛谷中的測評&#xff0c;藍橋杯官方測評待…

若依代碼生成器原理velocity模板引擎(自用)

1.源碼分析 代碼生成器:導入表結構(預覽、編輯、刪除、同步)、生成前后端代碼 代碼生成器表結構說明&#xff1a; 若依提供了兩張核心表來存儲導入的業務表信息&#xff1a; gen_table&#xff1a;存儲業務表的基本信息 &#xff0c;它對應于配置代碼基本信息和生成信息的頁…

如何制定有效的風險應對計劃

制定有效的風險應對計劃的核心在于&#xff1a; 識別潛在風險、評估風險的影響與概率、選擇合適的應對策略、建立動態監控和反饋機制。 其中&#xff0c;識別潛在風險是最為關鍵的第一步。只有準確識別出可能的風險&#xff0c;才能在后續的評估、應對、監控等環節中做到有的放…

A2A協議實現詳解及示例

A2A協議概述 A2A (Agent2Agent) 是Google推出的一個開放協議&#xff0c;旨在使AI智能體能夠安全地相互通信和協作。該協議打破了孤立智能體系統之間的壁壘&#xff0c;實現了復雜的跨應用自動化。[1] A2A協議的核心目標是讓不同的AI代理能夠相互通信、安全地交換信息以及在各…

【中級軟件設計師】前趨圖 (附軟考真題)

【中級軟件設計師】前趨圖 (附軟考真題) 目錄 【中級軟件設計師】前趨圖 (附軟考真題)一、歷年真題三、真題的答案與解析答案解析 復習技巧&#xff1a; 若已掌握【前趨圖】相關知識&#xff0c;可直接刷以下真題&#xff1b; 若對知識一知半解&#xff0c;建議略讀題目&#x…

調節磁盤和CPU的矛盾——InnoDB的Buffer Pool

緩存的重要性 無論是用于存儲用戶數據的索引【聚簇索引、二級索引】還是各種系統數據&#xff0c;都是以頁的形式存放在表空間中【對一個/幾個實際文件的抽象&#xff0c;存儲在磁盤上】如果需要訪問某頁的數據&#xff0c;就會把完整的頁數據加載到內存中【即使只訪問頁中的一…

springboot和springcloud的區別

1. ?目的與功能? ?1)Spring Boot?: 主要用于快速構建獨立的、生產級的 Spring 應用程序。它通過自動配置和嵌入式服務器等特性,簡化了微服務的開發、啟動和部署,使開發者能夠專注于業務邏輯而非繁瑣的配置。?Spring Boot是一個快速開發的框架,旨在簡化Java應用程序的開…

耘想WinNAS:以聊天交互重構NAS生態,開啟AI時代的存儲革命

一、傳統NAS的交互困境與范式瓶頸 在傳統NAS&#xff08;網絡附加存儲&#xff09;領域&#xff0c;用戶需通過復雜的圖形界面或命令行工具完成文件管理、權限配置、數據檢索等操作&#xff0c;學習成本高且效率低下。例如&#xff0c;用戶若需搜索特定文件&#xff0c;需手動…

在斷網的時候,websocket 一直在CLOSING 狀態

現象 websocket 先連接成功&#xff0c;然后斷網。 由于維護了一套心跳機制&#xff0c;前端發起心跳&#xff0c;如果一段時間內沒有收到服務端返回的心跳。則表示連接斷開。 用心跳的方式處理斷網的兜底情況。 然而&#xff0c;此時網絡是斷開的&#xff0c;在代碼中直接調…

基于AWS的大模型調用場景:10大成本優化實戰方案

大模型訓練與推理是AI領域的計算密集型場景&#xff0c;如何在AWS上實現高性能與低成本的雙重目標&#xff1f;本文從實例選型、彈性伸縮、存儲優化等角度&#xff0c;分享10個經過驗證的AWS成本優化策略&#xff0c;幫助企業節省30%以上成本。 一、大模型場景的成本痛點分析 計…

【網絡原理】TCP/IP協議五層模型

目錄 一. 協議的分層 二. OSI七層網絡協議 三. TCP/IP五層網絡協議 四. 網絡設備所在分層 五. 封裝 六. 分用 七. 傳輸中的封裝和分用 八. 數據單位術語 一. 協議的分層 常見的分層為兩種OSI七層模型和TCP/IP五層模型 為什么要協議分層&#xff1f; 在網絡通信中&…

科技快訊 | 阿里云百煉MCP服務上線;英偉達官宣:CUDA 工具鏈將全面原生支持 Python

李飛飛團隊最新AI報告&#xff1a;中美模型性能差距近乎持平 4月8日&#xff0c;斯坦福大學以人為本人工智能研究所發布《2025年人工智能指數報告》。報告顯示&#xff0c;2023年AI性能顯著提升&#xff0c;AI應用加速&#xff0c;投資增長&#xff0c;中美AI模型差距縮小。報告…

貓咪如廁檢測與分類識別系統系列【三】融合yolov11目標檢測

? 前情提要 家里養了三只貓咪&#xff0c;其中一只布偶貓經常出入廁所。但因為平時忙于學業&#xff0c;沒法時刻關注牠的行為。我知道貓咪的如廁頻率和時長與健康狀況密切相關&#xff0c;頻繁如廁可能是泌尿問題&#xff0c;停留過久也可能是便秘或不適。為了更科學地了解牠…

2025年燃氣證書:傳承與發展的行業紐帶

回溯歷史長河&#xff0c;能源的利用與人類文明的發展息息相關。從遠古時期的鉆木取火&#xff0c;到如今廣泛應用的燃氣能源&#xff0c;每一次能源的變革都推動著社會的巨大進步。而在現代燃氣行業蓬勃發展的背后&#xff0c;燃氣從業人員資格證書正扮演著傳承與發展的重要紐…

在Ubuntu下進行單片機開發是否需要關閉Secure Boot

1. Secure Boot的作用 功能&#xff1a;Secure Boot是UEFI的安全功能&#xff0c;旨在阻止未經驗證的驅動或操作系統啟動&#xff0c;防止惡意軟件篡改引導過程。 影響范圍&#xff1a;它主要限制的是操作系統啟動階段加載的內核級驅動&#xff08;如顯卡驅動、虛擬化模塊&…

國達陶瓷重磅推出陶瓷羅馬柱外墻整裝尖端新產品“冠巖臻石”

近日&#xff0c;記者在佛山國達建材有限公司&#xff08;以下簡稱國達陶瓷&#xff09;董事長楊建平處了解到&#xff0c;該公司重磅推出的“冠巖臻石”新產品&#xff0c;是屬于陶瓷羅馬柱外墻整裝產品中的尖端產品。新產品自面市之后&#xff0c;深受高端用戶的青睞與認可。…

【分享】Ftrans文件擺渡系統:既保障傳輸安全,又提供強集成支持

【分享】Ftrans文件擺渡系統&#xff1a;既保障傳輸安全&#xff0c;又提供強集成支持&#xff01; 在數字化浪潮中&#xff0c;企業對數據安全愈發重視&#xff0c;網絡隔離成為保護核心數據的關鍵防線&#xff0c;比如隔離成研發網-辦公網、生產網-測試網、內網-外網等。網絡…

實驗一 字符串匹配實驗

一、實驗目的 1&#xff0e;熟悉匯編語言編程環境和DEBUG調試程序的使用。 2&#xff0e;掌握鍵盤輸入字符串的方法和分支程序的設計。 二、實驗內容 編程實現&#xff1a;從鍵盤分別輸入兩個字符串&#xff0c;然后進行比較&#xff0c;若兩個字符串的長度…