gpt4 book ai didi

nginx - proxy_pass 到 HTTP 协议(protocol)后如何保存 HTTPS 协议(protocol)?

转载 作者:行者123 更新时间:2023-12-04 10:50:57 27 4
gpt4 key购买 nike

我在同一个网络中有 3 个 docker 容器:

  • 存储 (golang) - 它提供了用于上传视频文件的 API。
  • 主播 (nginx) - 它流式传输上传的文件
  • 反向代理 (姑且称之为代理)

  • 我有 HTTPS用户和代理之间的协议(protocol)。

    假设有一个文件 id=c14de868-3130-426a-a0cc-7ff6590e9a1f 并且用户想要看到它。所以用户向 https://stream.example.com/hls/master.m3u8?id=c14de868-3130-426a-a0cc-7ff6590e9a1f 发出请求. 主播 知道视频 id(来自查询参数),但它不知道视频的路径,因此它向存储发出请求并交换视频路径的视频 id。实际上它确实 proxy_pass 到 http://docker-storage/getpath?id=c14de868-3130-426a-a0cc-7ff6590e9a1f .

    docker-storage in an upstream server. And protocol is http, because I have no SSL-connection between docker containers in local network.



    之后 主播 获取它开始流式传输的文件的路径。但是用户的浏览器开始抛出 Mixed Content Type错误,因为第一个请求被抛出 HTTPS在 proxy_pass 之后它变成了 HTTP .

    这是 nginx.conf 文件(它是一个 Streamer 容器):
    worker_processes auto;

    events {
    use epoll;
    }

    http {
    error_log stderr debug;

    default_type application/octet-stream;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    vod_mode local;
    vod_metadata_cache metadata_cache 16m;
    vod_response_cache response_cache 512m;
    vod_last_modified_types *;
    vod_segment_duration 9000;
    vod_align_segments_to_key_frames on;
    vod_dash_fragment_file_name_prefix "segment";
    vod_hls_segment_file_name_prefix "segment";

    vod_manifest_segment_durations_mode accurate;

    open_file_cache max=1000 inactive=5m;
    open_file_cache_valid 2m;
    open_file_cache_min_uses 1;
    open_file_cache_errors on;

    aio on;

    upstream docker-storage {
    # There is a docker container called storage on the same network
    server storage:9000;
    }

    server {
    listen 9000;
    server_name localhost;
    root /srv/static;

    location = /exchange-id-to-path {
    proxy_pass $auth_request_uri;
    proxy_pass_request_body off;

    proxy_set_header Content-Length "";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Original-URI $request_uri;

    # I tried to experiment with this header
    proxy_set_header X-Forwarded-Proto https;

    set $filepath $upstream_http_the_file_path;
    }

    location /hls {
    # I use auth_request module just to get the path from response header (The-File-Path)
    set $auth_request_uri "http://docker-storage/getpath?id=$arg_id";
    auth_request /exchange-id-to-path;
    auth_request_set $filepath $upstream_http_the_file_path;

    # Here I provide path to the file I want to stream
    vod hls;
    alias $filepath/$arg_id;
    }
    }
    }

    这是浏览器控制台的屏幕截图:
    photo

    这是来自成功(200)请求的响应:
    #EXTM3U
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1470038,RESOLUTION=1280x720,FRAME-RATE=25.000,CODECS="avc1.4d401f,mp4a.40.2"
    http://stream.example.com/hls/index-v1-a1.m3u8

    #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=171583,RESOLUTION=1280x720,CODECS="avc1.4d401f",URI="http://stream.example.com/hls/iframes-v1-a1.m3u8"

    问题是proxy_pass到http后如何保存https协议(protocol)?

    p.s. 我用 Kaltura nginx-vod-module用于流式传输视频文件。

    最佳答案

    我认为 proxy_pass问题不在这里。当 vod 模块返回索引路径时,它使用带有 HTTP 的绝对 URL协议(protocol)。相对 URL 应该足够了,因为索引文件和 block 在同一个域下(如果我理解正确的话)。

    尝试设置vod_hls_absolute_index_urls off; (以及 vod_hls_absolute_master_urls off;),因此您的浏览器应该发送与 stream.example.com 相关的请求使用 HTTPS 的域.

    关于nginx - proxy_pass 到 HTTP 协议(protocol)后如何保存 HTTPS 协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59479371/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com