V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
Llesue
V2EX  ›  NGINX

Nginx 如何反代 wss 连接?

  •  
  •   Llesue · 314 天前 · 2056 次点击
    这是一个创建于 314 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我当前的设置时这样的,抄了很多教程,但是不懂原理感觉抄也是白抄,不管用。

    server {
            listen 86;
            server_name box.example.com file.example.com files.example.com pan.example.com;
            if ($scheme = http){
                    return 301 https://$server_name:88$request_uri;
            }
    }
    
    map $http_upgrade $connection_upgrade {
            default upgrade;
            '' close;
    }
    
    server {
        listen 88 ssl http2;
        server_name box.example.com;
        error_page 497 301 =307 https://$host:$server_port$request_uri;
    
        ssl_certificate /etc/letsencrypt/live/box.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/box.example.com/privkey.pem;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
    
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8 8.8.4.4 valid=300s;
        resolver_timeout 5s;
    
        location / {
            proxy_pass http://localhost:8687;
            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_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "";
            proxy_max_temp_file_size 0;
            proxy_read_timeout 500s;
            proxy_connect_timeout 600;
            proxy_send_timeout 240;
        }
    
        location /api/command/ {
            proxy_pass http://localhost:8687;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $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;
        }
    }
    
    16 条回复    2023-06-08 16:13:19 +08:00
    om2mo
        1
    om2mo  
       314 天前
    你连域名都没改怎么反代?看上去并没有看教程
    keegan
        2
    keegan  
       314 天前
    要么自己看看懂,要么直接 问 GPT 吧
    Llesue
        4
    Llesue  
    OP
       314 天前
    @om2mo 域名是我替换的。
    Llesue
        5
    Llesue  
    OP
       314 天前
    @keegan 我就是高强度 ChatGPT 用户。ChatGPT 回答不了这种问题……
    Llesue
        6
    Llesue  
    OP
       314 天前
    @as9567585 你要是仔细看我贴出的配置,你会发现,我就是这么配置的。
    eudemonwind
        7
    eudemonwind  
       314 天前 via Android
    同求,想反代谷狗,但是好像会被谷狗识别出来被 nginx 反代了,不给用
    NSAgold
        8
    NSAgold  
       314 天前
    你这配置应该是没问题的。
    我以前的配法和#3 给的 bing 的是一样的(不过我的没有 set_header Host $host 那行,因为用不到,后端是个 tcp 转 ws 的程序),完全没问题。nginx 出去甚至还能再套层 cloudflare 。
    Llesue
        9
    Llesue  
    OP
       314 天前
    其实我应该多补充一下:
    1 、不是常规端口,是 http 86 ,https 88 。
    2 、我用的是 filebrowser , 网页访问各项功能都正常,就是 filebrowser 有个命令行工具可以在网页上使用 shell 命令,这些 shell 命令是通过 websocket 传输的。这个功能无法使用,从浏览器调试看是请求不成功:
    ```
    commands.js:12 WebSocket connection to 'wss://box.hideurl.com:88/api/command/?auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoyLCJsb2NhbGUiOiJ6aC1jbiIsInZpZXdNb2RlIjoibGlzdCIsInNpbmdsZUNsaWNrIjpmYWxzZSwicGVybSI6eyJhZG1pbiI6dHJ1ZSwiZXhlY3V0ZSI6dHJ1ZSwiY3JlYXRlIjp0cnVlLCJyZW5hbWUiOnRydWUsIm1vZGlmeSI6dHJ1ZSwiZGVsZXRlIjp0cnVlLCJzaGFyZSI6dHJ1ZSwiZG93bmxvYWQiOnRydWV9LCJjb21tYW5kcyI6WyJ3YyIsImRmIiwicHdkIiwibG4iLCJndnNoYXJlIiwiYm94LXVzZyIsImxzIiwidHJlZSIsIm12IiwiY3AiLCJybSIsImNhdCIsInRhaWwiLCJncmVwIiwiY2QiLCJ0bGRyIiwibWtkaXIiLCJkdSIsImZpbmQiLCJjaG93biIsInZuc3RhdCIsIm1hbiIsIndnZXQiLCJyY2xvbmUiLCJpZmNvbmZpZyIsImRhdGUiLCJ3aG9hbWkiLCJuZXRzdGF0Il0sImxvY2tQYXNzd29yZCI6ZmFsc2UsImhpZGVEb3RmaWxlcyI6dHJ1ZSwiZGF0ZUZvcm1hdCI6ZmFsc2V9LCJpc3MiOiJGaWxlIEJyb3dzZXIiLCJleHAiOjE2ODQ1NTYwMjMsImlhdCI6MTY4NDU0ODgyM30.gRQ53CHiiESvt7YZN387h5u6pXrvI6jDwoVBTSW_qxg' failed:
    ```
    3 、我的配置里第一个 location 是 filebrowser 的。第二个 location 是 websocket 的。但是 wss 连接还是不通……
    4 、ChatGPT 对此类问题束手无策,会重复无用信息车轱辘话。

    ### 题外话:
    大家可以测试一下问 ChatGPT
    ```
    http://damn.com:86 怎么用 nginx 跳转到 https://damn.com:88
    ```
    ChatGPT 会给你一个错误答案。然后你继续问:
    ```
    你仔细看看你的答案正确吗?
    ```
    ChatGPT 会说:你说的对,我犯了一个错误。正确的配置应该是这样……(把上面错误的代码再发一遍),如果你继续说它的答案不正确,它还会道歉,然后原封不动在给你发一遍刚才的配置……哈哈
    githmb
        10
    githmb  
       313 天前
    proxy_set_header Connection "Upgrade";
    cquan
        11
    cquan  
       313 天前
    我设置过,怎么设都不行,然后发现好像不是 nginx 的问题,是 python 的 uwsgi 问题。
    julyclyde
        12
    julyclyde  
       313 天前
    关键在于那两个 header
    zanelee
        13
    zanelee  
       298 天前
    command 的那个 location 加一下 proxy_set_header Connection "Upgrade";试试
    zanelee
        14
    zanelee  
       298 天前
    @zanelee 不好意思,看下了前面配了 map
    zanelee
        15
    zanelee  
       297 天前
    去试了一下,出现了这种情况,我的是因为是跨域。filebrowser 的日志也会报错 websocket: request origin not allowed by Upgrader.CheckOrigin 。看了 OP 后面给出的控制台报错的 url 和 nginx 配置的 url ,感觉就是因为这个 wss 请求的时候请求头的 Orgin 和代理过去的请求头的 Host 不一致造成的。
    tyit
        16
    tyit  
       294 天前
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";



    试试这两个
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5400 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 64ms · UTC 07:01 · PVG 15:01 · LAX 00:01 · JFK 03:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.