V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
alpinefly
V2EX  ›  NGINX

nginx 反代 https 源站,为啥 upstream 源站变成 https://ip/XXX

  •  
  •   alpinefly · Sep 1, 2022 · 3751 views
    This topic created in 1342 days ago, the information mentioned may be changed or developed.

    菜鸟求助,nginx 反代 https://AAA.com 页面打开为空,如果直接反代 http://AAA.com 则完全正常; 看错误代码

    [error] 5790#5790: *15933 upstream prematurely closed connection while reading upstream, client: 127.0.0.1, server: m.shss.pw, request: "GET /bbs/index.php HTTP/2.0", upstream: "https://数字 IP:443/bbs/index.php", host: "BBB.com", referrer: "https:/BBB.com/"

    https://AAA.com 是 ke 可以打开的,但是 https://数字 IP:443/ 显然是无法打开的,所以报错

    请问这种情形下 nginx 如何修改配置?

    24 replies    2022-09-07 16:50:25 +08:00
    mxT52CRuqR6o5
        1
    mxT52CRuqR6o5  
       Sep 1, 2022 via Android
    host 对的就没问题,host 是 http 协议的 header ,upstream 不是,问题原因应该不是你目前认为的那样
    turan12
        2
    turan12  
       Sep 1, 2022 via iPhone
    把 conf 文件贴上来看看
    alpinefly
        3
    alpinefly  
    OP
       Sep 1, 2022
    反代源站 http 是没问题的,ip 也是源站的 ip ,https://数字 IP:443 这个是没法访问
    alpinefly
        4
    alpinefly  
    OP
       Sep 1, 2022
    server {
    listen 443 ssl http2;
    server_name BBB.com;
    ssl_certificate cert/XXX.crt;
    ssl_certificate_key cert/XXX.key;
    resolver 8.8.8.8 1.1.1.1 valid=3600s;
    resolver_timeout 3s;
    set $backend https://AAA.com;
    add_header Strict-Transport-Security "max-age=31536000;includeSubDomains" always;
    add_header X-Frame-Options SAMEORIGIN;
    add_header Referrer-Policy same-origin;
    add_header X-Content-Type-Options nosniff;
    proxy_set_header Early-Data $ssl_early_data;
    location / {
    proxy_redirect off;
    proxy_pass $backend;
    proxy_ssl_server_name on;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_set_header Host AAA.com;
    proxy_set_header Accept-Encoding "";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Referer https://AAA.com;
    }
    }
    nulIptr
        5
    nulIptr  
       Sep 1, 2022
    代理 https 需要配证书啊。。。不然不就是中间人了吗
    alpinefly
        6
    alpinefly  
    OP
       Sep 1, 2022
    @nulIptr 证书没有问题,
    ssl_certificate cert/XXX.crt;
    ssl_certificate_key cert/XXX.key;
    alpinefly
        7
    alpinefly  
    OP
       Sep 1, 2022
    为啥 upstream 哪儿用 ip 替换了域名
    hefish
        8
    hefish  
       Sep 1, 2022
    日志里面是 HTTP/2.0 , 配置里面是 1.1 ,不知道有没有关系。
    nulIptr
        9
    nulIptr  
       Sep 1, 2022
    @liuyinltemp #6
    我这样解释一下,
    证书是颁发给域名的,你的 a 域名有 a 证书,而 a 证书用不到 b 域名上。如果 a 服务只有 a 域名的 https 的话是不能被 b 域名代理的,如果是同一个域名不同服务器的话理论上可以代理,具体怎么配就不知道了
    你这问题把我给问懵逼了,实际我一般只在最外面的 ingress 网关配 https ,内部的微服务都是 http 。
    PMR
        10
    PMR  
       Sep 1, 2022
    在什么地方看过 proxy_pass 是固死 IP 的 开启 SNI
    程序启动时 会自动解析 IP 并固定 域名的解析变动 要 reload nginx 才能 proxy_pass 到变动 IP

    找下 nginx plus 的 example 照葫芦画瓢就行
    ab
        11
    ab  
       Sep 2, 2022 via iPhone
    用 stream 转发会更方便
    ZE3kr
        12
    ZE3kr  
       Sep 2, 2022 via iPhone
    你得传 SNI
    aaa.com;
    proxy_ssl_server_name on;
    proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ZE3kr
        13
    ZE3kr  
       Sep 2, 2022 via iPhone
    proxy_ssl_name

    V2EX 回复不能编辑,没办法,需要你自己拼凑下
    alpinefly
        14
    alpinefly  
    OP
       Sep 2, 2022
    up 一下,这个配置反代其他 https 域名没有问题
    alpinefly
        15
    alpinefly  
    OP
       Sep 2, 2022
    对了,还有一个特征,就是访问 https://AAA.com 是正常的,但是跳转 https://AAA.com/bbs/index.php 出现问题,只显示网页底色
    konsh
        16
    konsh  
       Sep 2, 2022
    @liuyinltemp https 协议是需要 ca 证书,证书是颁发给域名的,与 IP 无关,所以访问 https://XXX.com 是没有问题的,而 https://ip:443 则是无法访问的。看了下你的 conf 文件,proxy_pass 代理的是 https 请求,加上证书配置试试看,参考文档 https://docs.nginx.com/nginx/admin-guide/security-controls/securing-http-traffic-upstream/
    jiabing520a
        17
    jiabing520a  
       Sep 2, 2022
    我是在 /etc/hosts 里指定源站 IP ,使用起来没有问题
    alpinefly
        18
    alpinefly  
    OP
       Sep 2, 2022
    chrome F12 查看显示 Failed to load resource: net::ERR_HTTP2_PROTOCOL_ERROR
    alpinefly
        19
    alpinefly  
    OP
       Sep 2, 2022
    @konsh 没有源站的证书
    alpinefly
        20
    alpinefly  
    OP
       Sep 2, 2022
    单独看反代后 js 是可以正常打开,现在就是进入 https://AAA.com/bbs/index.php 没有响应
    alpinefly
        21
    alpinefly  
    OP
       Sep 4, 2022
    curl: (60) SSL certificate problem: unable to get local issuer certificate
    More details here: https://curl.se/docs/sslcerts.html

    curl failed to verify the legitimacy of the server and therefore could not
    establish a secure connection to it. To learn more about this situation and
    how to fix it, please visit the web page mentioned above.
    alpinefly
        22
    alpinefly  
    OP
       Sep 4, 2022
    又查了一下,应该是 vps 下访问源站有问题,但是证书又是对的。
    alpinefly
        23
    alpinefly  
    OP
       Sep 5, 2022
    应该是源站的证书缺失了中间证书,这种情况有啥办法
    alpinefly
        24
    alpinefly  
    OP
       Sep 7, 2022
    源站补齐中间证书就好了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3247 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 14:07 · PVG 22:07 · LAX 07:07 · JFK 10:07
    ♥ Do have faith in what you're doing.