当前位置: 首页 > article >正文

nginx 根路径同时代理 http ws sse 三种请求

HTTP(HyperText Transfer Protocol):超文本传输协议,是用于在客户端(通常是web浏览器)和服务器之间传输数据的协议。HTTP是Web的基础,用于请求和传输网页、图像、视频等资源。它采用请求-响应模型,支持多种方法(如GET、POST等),并可通过HTTP/1.1和HTTP/2等版本进行优化,以提高性能和用户体验。

WebSocket:WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许客户端和服务器之间实现实时双向数据传输。WebSocket通过握手过程建立连接,并在一次握手后保持该连接,从而减少了HTTP请求的开销,适合实时应用如在线聊天、股票实时更新等。

SSE(Server-Sent Events):服务器推送事件是一种通过HTTP协议向浏览器推送实时事件的技术。与WebSocket不同,SSE是单向的,数据从服务器流向客户端。它使用 text/event-stream MIME类型,适用于需要实时更新但不需要客户端响应的场合,如实时新闻推送、股票价格更新等。SSE易于使用并支持自动重连。

利用 map 实现

map 定义的就是一个字典(k,v),通过不同key,映射不同value值。

http {
    map $http_content_type $connection_header {
        default "upgrade";
        "text/event-stream" "keep-alive";
    }

    upstream http_backend {
        server 127.0.0.1:80;
    }

    server {
        listen 9123;
        # server_name your_domain_name;

        location / {
            proxy_pass http://http_backend;
            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_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_header;
            proxy_cache off;
        }
    }
}

使用 if 和变量实现

if 表达式里面不能直接包含指令 proxy_set_header Connection keep-alive,会报错,但是可以包含变量间接实现。

upstream http_backend {
    server 127.0.0.1:80;
}

server {
    listen 9123;
    # server_name your_domain_name;

    location / {
        set $connection_header "upgrade";

        if ($http_content_type ~* "text/event-stream") {
            set $connection_header "keep-alive";
        }

        proxy_pass http://http_backend;
        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_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_header;
        proxy_cache off;
    }
}

http://www.kler.cn/a/374522.html

相关文章:

  • JavaEE-多线程初阶(2)
  • SSID,即Service Set Identifier(服务设置的表示符号)
  • C++20 时间转本地时间,时间转字符串以及字符串转时间的方法
  • JavaScript语法基础——变量,数据类型,运算符和程序控制语句(小白友好篇,手把手教你学会!)
  • 在pycharm中使用sqllite
  • 文心一言 VS 讯飞星火 VS chatgpt (381)-- 算法导论24.5 1题
  • WebGL 快速入门构建你的第一个 3D 应用
  • 在浏览器中运行 Puppeteer:解锁新能力
  • USB接口类型及引脚信号详解
  • java 实现对 word 文档中占位符进行替换
  • Spring学习笔记_13——@Autowired
  • 内网穿透技术选型PPTP(点对点隧道协议)和 FRP(Fast Reverse Proxy)
  • 手机功耗异常大数据看板建设
  • IMU技术引领骑行新体验
  • linux中网口测试
  • JVM—类加载器、双亲委派机制
  • git入门教程6:git基本版本控制
  • 中英文如何快速切换?小达人盘点10款翻译工具给你
  • 芯片技术创新,GPU 服务器厂家聚焦服务器性能新巅峰
  • Nuxt.js 应用中的 components:extend 事件钩子详解
  • CSS常用标签笔记
  • 详解汉明纠错码原理以及FPGA实现
  • Jetson Xavier nx在Ubuntu18.04下安装ros2 使用奥比中光330
  • Python+Appium+Pytest+Allure自动化测试框架-代码篇
  • springboot获取七牛云文件上传凭证token
  • 从二维图像到三维重建:由运动到结构(SfM)的完整流程推导【含数学原理及推导】