最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx代理WebSocket失敗的完整排查過程

 更新時(shí)間:2025年11月14日 08:55:24   作者:不會寫程序的未來程序員  
在開發(fā)基于 WebSocket 的實(shí)時(shí)應(yīng)用時(shí),使用 Nginx 作為反向代理是常見做法,可是我遇見了后端直連 WebSocket 成功,通過 Nginx 代理卻失敗,本文將完整復(fù)盤一次真實(shí)排查過程,帶你避開所有坑,需要的朋友可以參考下

問題現(xiàn)象

  • 后端服務(wù)運(yùn)行在 192.168.1.10:8080,提供 WebSocket 接口 /ws/xxx
  • 使用 wscat 或?yàn)g覽器直連 ws://192.168.1.10:8080/ws/xxx ? 成功
  • 配置 Nginx 反向代理后,前端連接 ws://localhost/ws/xxx ? 失敗
  • 瀏覽器 Network 面板顯示 WebSocket 請求失敗(無 101 響應(yīng))
  • 關(guān)鍵線索:Nginx 的 access_log沒有任何 WebSocket 請求日志

初步懷疑:Nginx 配置錯誤?

首先檢查 Nginx 配置:

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

upstream webservers {
    server 192.168.1.10:8080;
}

server {
    listen 80;
    server_name localhost;

    location /ws/ {
        proxy_pass http://webservers/ws/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "$connection_upgrade";  # ?? 這里有坑!
        proxy_read_timeout 3600s;
    }
}

常見錯誤包括:

  • Connection 頭加了雙引號 → 變成字面量
  • map 沒放在 http 塊頂層
  • 缺少 proxy_buffering off

但即使修正這些,日志依然為空,說明:請求根本沒到 Nginx!

關(guān)鍵轉(zhuǎn)折:前端頁面來源被忽略

通過 docker ps 確認(rèn)端口映射正常:

nginx     0.0.0.0:80->80/tcp

但發(fā)現(xiàn)一個(gè)致命細(xì)節(jié):

前端頁面是通過虛擬機(jī) IP 打開的:http://192.168.228.128/
而 WebSocket 地址寫的是:ws://localhost/ws/xxx

問題本質(zhì)

  • 瀏覽器中的 localhost 永遠(yuǎn)指向客戶端本機(jī)(Windows 電腦)
  • 而我的 Nginx 運(yùn)行在 虛擬機(jī)中
  • 所以 ws://localhost/... 實(shí)際請求的是 我 Windows 的 80 端口,而非虛擬機(jī)!

→ 請求壓根沒發(fā)給 Nginx,自然沒有日志!

解決方案

方法 1:顯式指定虛擬機(jī) IP(臨時(shí)可用)

// 前端 JS
const ws = new WebSocket('ws://192.168.228.128/ws/xxx');

立即生效!

方法 2:使用相對路徑(推薦 ?)

// 自動繼承當(dāng)前頁面的 host
const ws = new WebSocket('/ws/xxx');

優(yōu)勢:

  • 頁面在 http://localhost → 連 ws://localhost
  • 頁面在 http://192.168.228.128 → 連 ws://192.168.228.128
  • 部署到域名也無需修改代碼

附:正確的 Nginx 配置模板

http {
    # 必須在 http 塊頂層!
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    upstream backend {
        server host.docker.internal:8080;  # Docker Desktop 推薦
        # 或 server 192.168.1.10:8080;
    }

    server {
        listen 80;
        server_name _;  # 匹配任意 Host

        location / {
            root /usr/share/nginx/html;
            index index.html;
        }

        location /ws/ {
            access_log /var/log/nginx/ws_access.log;
            proxy_pass http://backend/ws/;
            proxy_http_version 1.1;
            proxy_buffering off;          # 必須關(guān)閉
            proxy_cache off;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;  # 無引號!
            proxy_read_timeout 3600s;
        }
    }
}

經(jīng)驗(yàn)總結(jié)

問題類型排查要點(diǎn)
Nginx 無日志先確認(rèn)請求是否真的發(fā)到了 Nginx(檢查前端地址、端口映射)
WebSocket 426檢查 UpgradeConnection 頭是否正確傳遞
前端連接失敗確保 WebSocket 地址與頁面同源(避免硬編碼 localhost
Docker 環(huán)境host.docker.internal 代替 IP 更可靠

最后提醒

localhost 在前端代碼中 ≠ 你的服務(wù)器!
它永遠(yuǎn)指向用戶瀏覽器所在的機(jī)器。

開發(fā)時(shí)務(wù)必注意頁面來源與 WebSocket 目標(biāo)的匹配關(guān)系,這是 WebSocket 代理失敗的最高頻原因。

結(jié)語

從“426 Upgrade Required”到“連接成功”,看似是配置問題,實(shí)則是網(wǎng)絡(luò)拓?fù)淅斫馄?/strong>。希望本文能幫你少走彎路!

到此這篇關(guān)于Nginx代理WebSocket失敗的完整排查過程的文章就介紹到這了,更多相關(guān)Nginx代理WebSocket失敗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 升級nginx支持HTTP/2服務(wù)端推送的方法

    升級nginx支持HTTP/2服務(wù)端推送的方法

    這篇文章主要介紹了升級nginx支持HTTP/2服務(wù)端推送的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • 通過Nginx的proxy_set_header設(shè)置請求頭無效的解決

    通過Nginx的proxy_set_header設(shè)置請求頭無效的解決

    這篇文章主要介紹了通過Nginx的proxy_set_header設(shè)置請求頭無效的解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • WordPress與Drupal的Nginx配置rewrite重寫規(guī)則示例

    WordPress與Drupal的Nginx配置rewrite重寫規(guī)則示例

    這篇文章主要介紹了WordPress與Drupal的Nginx配置重寫規(guī)則示例,文中介紹的rewrite寫法簡單而突出配置重點(diǎn),需要的朋友可以參考下
    2016-01-01
  • nginx查看配置文件的操作方法

    nginx查看配置文件的操作方法

    nginx的配置放在nginx.conf文件中,一般我們可以使用以下命令查看服務(wù)器中存在的nginx.conf文件,這篇文章主要介紹了nginx查看配置文件,需要的朋友可以參考下
    2024-02-02
  • nginx啟動服務(wù)提示98: Address already in use錯誤的解決

    nginx啟動服務(wù)提示98: Address already in use錯誤的解決

    這篇文章主要給大家介紹了nginx啟動服務(wù)提示98: Address already in use錯誤的解決方法,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • 18個(gè)運(yùn)維必知的Nginx代理緩存配置技巧(你都掌握了哪些呢)

    18個(gè)運(yùn)維必知的Nginx代理緩存配置技巧(你都掌握了哪些呢)

    這篇文章主要介紹了18個(gè)運(yùn)維必知的Nginx代理緩存配置技巧(你都掌握了哪些呢),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • nginx中配置https的詳細(xì)步驟及配置SSL/TLS證書的完整流程

    nginx中配置https的詳細(xì)步驟及配置SSL/TLS證書的完整流程

    本文將詳細(xì)介紹如何在 Nginx 服務(wù)器上配置 SSL/TLS 證書,包括獲取證書、配置 Nginx、強(qiáng)化安全性等完整流程,無論您是使用 Let’s Encrypt 的免費(fèi)證書還是自簽名證書,都能在本指南中找到對應(yīng)的配置方法,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • 記一次nginx中proxy_pass的使用問題

    記一次nginx中proxy_pass的使用問題

    這篇文章主要介紹了記一次nginx中proxy_pass的使用問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Ubuntu16.04上為Nginx創(chuàng)建自簽名SSL證書

    Ubuntu16.04上為Nginx創(chuàng)建自簽名SSL證書

    SSL證書是實(shí)現(xiàn)HTTPS的關(guān)鍵組成部分,本文主要介紹了Ubuntu16.04上為Nginx創(chuàng)建自簽名SSL證書,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • nginx安全防護(hù)與https部署全過程

    nginx安全防護(hù)與https部署全過程

    這篇文章主要介紹了nginx安全防護(hù)與https部署全過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05

最新評論

丘北县| 曲沃县| 彭水| 和田市| 汕头市| 玉林市| 五峰| 太谷县| 安泽县| 巴南区| 城口县| 耿马| 都昌县| 祁阳县| 龙游县| 新泰市| 桃源县| 桃源县| 剑河县| 石城县| 高雄县| 安顺市| 合水县| 清新县| 呼伦贝尔市| 延津县| 朝阳市| 迁安市| 车险| 平远县| 辽源市| 玛纳斯县| 册亨县| 乡宁县| 兴仁县| 贡觉县| 阿鲁科尔沁旗| 那坡县| 盐源县| 德令哈市| 黎城县|