为什么 NGINX 使用自定义变量代理 ws 会异常? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
luxu
V2EX    NGINX

为什么 NGINX 使用自定义变量代理 ws 会异常?

  •  
  •   luxu 2024-06-20 11:59:19 +08:00 2107 次点击
    这是一个创建于 476 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前一直用同样的方式连接后端服务, 是正常使用的。 如

    location ^~/prod-api/ { proxy_pass http://$api_host:$api_port; ...... } 

    异常情况:

    连接 http://$api_host:8877/ws/ 就会异常

    server { listen 443 ssl; set $api_host api; .......... location /ws/ { proxy_pass http://$api_host:8877/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_connect_timeout 90s; proxy_send_timeout 120s; proxy_read_timeout 120s; send_timeout 120s; } } 

    正常情况:

    设置 http://api:8877/ws/ 正常

    server { listen 443 ssl; set $api_host api; .......... location /ws/ { proxy_pass http://api:8877/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_connect_timeout 90s; proxy_send_timeout 120s; proxy_read_timeout 120s; send_timeout 120s; } } 

    在 nginx 容器内两种设置的抓包截图: https://imgur.com/a/XzyNFQ6

    搞不清楚是什么原因导致这种情况,为什么不能这样配。想请教下大家

    第 1 条附言    2024-06-20 14:53:39 +08:00

    贴上完整配置

     server { listen 443 ssl; client_max_body_size 20M; index index.html; ssl_certificate /etc/nginx/templates/1.pem; ssl_certificate_key /etc/nginx/templates/1-key.pem; ssl_session_timeout 5m; ssl_protocols TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; server_name ${NGINX_HOST}; index index.html; set $api_port 8877; set $api_host api; #add_header Access-Control-Allow-Origin *; #add_header Access-Control-Allow-Credentials true; #add_header Access-Control-Allow-Methods GET,POST; location / { expires off; add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; #try_files $uri $uri/ /index.html; index index.html; root /www/dist/; server_tokens off; } location /ws/ { proxy_pass http://$api_host:8877/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_connect_timeout 90s; proxy_send_timeout 120s; proxy_read_timeout 120s; send_timeout 120s; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded $proxy_add_x_forwarded_for; } location ^~/prod-api/ { rewrite ^/prod-api/(.*)$ /$1 break; proxy_set_header X-Forwarded-Proto $scheme; # proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded $proxy_add_x_forwarded_for; proxy_pass http://$api_host:$api_port; 字数超了。。。。。。。。 } } } 
    5 条回复    2024-06-28 11:00:35 +08:00
    msg7086
        1
    msg7086  
       2024-06-20 13:53:50 +08:00
    set 指令可能是在 proxy_pass 之后执行的。
    纯粹猜测,你可以做做实验或者查一下资料。

    Nginx 的配置文件,归根结底是配置而不是程序,不要总是期望写在上面的会比写在下面的早执行。
    msg7086
        2
    msg7086  
       2024-06-20 13:54:56 +08:00
    另外你可以看看能不能用 upstream 代替 set 来设置变量。upstream 应该是在很靠前的阶段执行的。
    rrfeng
      &nbp; 3
    rrfeng  
       2024-06-20 14:09:21 +08:00
    完整配置贴出来看看
    Hanada
        4
    Hanada  
       2024-06-27 01:31:41 +08:00   1
    proxy_pass 的值有变量的话 nginx 的处理逻辑是不一样的。如果有接变量的话,nginx 不会再帮你附加原始请求 uri 进去,所以你异常那个就变成固定使用/ws/回上层了。如果你一定要用变量,可以考虑这样写
    proxy_pass http://$api_host:8877$request_uri;
    另外不建议无脑给 Connection 头写死设置 Upgrade ,可以参考 nginx 官方第二种写法,用 map 来指定
    https://nginx.org/en/docs/http/websocket.html
    luxu
        5
    luxu  
    OP
       2024-06-28 11:00:35 +08:00
    @Hanada 非常感谢, 解决了我的问题。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1147 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 23:27 PVG 07:27 LAX 16:27 JFK 19:27
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86