awanabe
V2EX  ›  问与答

遇到一个 Nginx 的诡异问题,求解答

  •  
  •   awanabe · Mar 20, 2017 · 2868 views
    This topic created in 3375 days ago, the information mentioned may be changed or developed.

    还原场景:

    • 我有一台服务器, nginx 下面挂了两个微信公众号的网站。 A 站, B 站
    • 域名前缀不同, 一个是 A 站, A.xxx.com 一个是 B 站, B.xxx.com
    • 今天给 A.xxx.com 升级成了 https
    • A 公众号里面的菜单中的链接也升级成了 https
    • 菜单推送有延迟
    • 有用户反映,点击菜单会进入 B 公账号的授权。
    • 重现: 把 B 站网站暂时停止,点击 A 站的 http 链接,则网页无法打开,证实跑到了 B 站的链接中

    Q : Nginx 是什么样的规则,把只有HTTPS访问的网站的非http请求导入到同 ip 下面的不同域名前缀的网站呢?

    • 百思不得其解
    Supplement 1  ·  Mar 21, 2017
    加上了 A 站的 80 , rewrite 到 443 了
    25 replies    2017-03-21 10:17:26 +08:00
    binghe
        1
    binghe  
       Mar 20, 2017
    程序问题?
    wevsty
        2
    wevsty  
       Mar 20, 2017
    搜索关键词 nginx tls sni
    应该能帮到你
    awanabe
        3
    awanabe  
    OP
       Mar 20, 2017 via iPhone
    @binghe 不是,简单判定下来就是 nginx 切换了目标网站
    mingyi0
        4
    mingyi0  
       Mar 20, 2017
    Q : Nginx 是什么样的规则,把只有 HTTPS 访问的网站的非 http 请求导入到同 ip 下面的不同域名前缀的网站呢?
    如果你的 A 站改为 HTTPS 了,那么正常情况他的端口就变成了 443 ssl ,这时候你访问 HTTP 的 A 站,相当于访问 80 端口,但是 80 端口中已经没有 A 的 server name 了, nginx 会根据首字母排序默认访问第一个站,你服务器上就 A 、 B 两站,所以就会访问 B 站了。如果我建议你把 A 站的 80 做一个 rewrite 跳转,类似 rewrite ^(.*)$ https://$host$1 permanent;
    awanabe
        5
    awanabe  
    OP
       Mar 20, 2017
    @mingyi0 不应该有 域名限制么?
    awanabe
        6
    awanabe  
    OP
       Mar 20, 2017
    @wevsty 好像不是你说的这个问题。。
    mingyi0
        7
    mingyi0  
       Mar 20, 2017
    @awanabe 没有限制吧,比如你通过 IP 访问,现在默认也会跳到 B 站吧,可以看看文档: http://nginx.org/en/docs/http/server_names.html
    msg7086
        8
    msg7086  
       Mar 20, 2017
    Nginx 下需要让一个网站同时监听 80 和 443 。你看看你是不是把 A 站里 80 端口监听去掉了。
    msg7086
        9
    msg7086  
       Mar 20, 2017
    如果你需要 80 跳转 443 的:
    server: listen 80; server_name A; rewrite 到 https;
    server: listen 443 ssl; server_name A; A 站;
    server: listen 80; server_name B; B 站;

    你看看你是不是这么设定的,如果不是的话那应该就有问题了。
    awanabe
        10
    awanabe  
    OP
       Mar 20, 2017
    @msg7086 是去掉了 A 站的 listen80 , 现在已经加上了 A 站的 80 , rewrite 到 443 了。
    msg7086
        11
    msg7086  
       Mar 20, 2017
    @awanabe 如果将来一直用 HTTPS 访问的话,也可以顺手加上 HSTS ,这样就可以避免额外的跳转了。
    awanabe
        12
    awanabe  
    OP
       Mar 20, 2017
    @mingyi0
    @msg7086
    问题是, 我以前配置多 servername 的时候,一般去掉 IP 的 listen80 , 防止 IP 被访问。
    一般设置有 ip 会配置, default 选项, 是的流量在找不到 servername 的时候默认走 ip
    只是我两个配置都没有 default , 也没有 ip default 配置, 那逻辑上应该每一个进来的 servername 都去找对应的配置,否则就 504 才对吧?
    msg7086
        13
    msg7086  
       Mar 20, 2017
    @awanabe 504 是什么鬼。
    要防止 IP 被访问的话,是要单独给 server_name 配一个 default 然后 return 403 之类的。
    去掉 listen 80 的话,当然会漏给其他虚拟主机了。
    ETiV
        14
    ETiV  
       Mar 20, 2017 via iPhone
    通常这么多人在回复但还没有解决问题,一般是 LZ 问题描述的不好

    要不直接上配置吧
    awanabe
        15
    awanabe  
    OP
       Mar 20, 2017
    @ETiV 又不是解决问题, 解决问题我早就搞定了, 一句话加上 rewrite 就行。
    只是不懂 nginx 的 default server 规则。 所以你懂么?
    awanabe
        16
    awanabe  
    OP
       Mar 20, 2017
    @msg7086 手滑,应该是 502 bad gateway 的错误才对吧?
    403 是没有权限才对
    5xx 是 server 内部错误
    awanabe
        17
    awanabe  
    OP
       Mar 20, 2017
    @msg7086 那我的理解, 就是当 listen80 只有一个的时候其实就是 default server 了。。这个有点坑, 很容易就踩进去了。 本来以为 server name 就是用来去强制隔离的
    msg7086
        18
    msg7086  
       Mar 20, 2017
    @awanabe 502 只有在 proxy_pass 的对象无法访问的时候才会出现。
    你这种情况要炸也只会炸 500 。
    这里 Nginx 找不到匹配的 server_name ,也没有 default 的情况下,默认是漏给第一个 server 块(也即意味着第一个块是 catch-all 块)。你网站上只有 A 和 B ,没了 A ,这个端口上只剩 B ,当然就漏去 B 了。
    awanabe
        19
    awanabe  
    OP
       Mar 20, 2017
    @msg7086 嗯,应该就是这样的规则,踩了坑,所以做切换还是提醒自己,把 http rewrite 到 https 上去
    garyalen
        20
    garyalen  
       Mar 20, 2017 via Android
    https 要设成监听 80 443
    Joway
        21
    Joway  
       Mar 20, 2017
    ... 我还把网址给点进去了
    awanabe
        22
    awanabe  
    OP
       Mar 20, 2017 via iPhone
    @Joway xxx 是色情网站 哈哈哈我就是老司机
    Enivel
        23
    Enivel  
    PRO
       Mar 21, 2017 via iPhone
    看看是不是 index 后面没有加;号
    uzumaki
        24
    uzumaki  
       Mar 21, 2017 via Android
    lz 你需要个 linux 面板 在慢慢测试 修改问题
    awanabe
        25
    awanabe  
    OP
       Mar 21, 2017
    @LevineChen 挂 uwsgi 没有 index 选项,已经解决了 。
    `加上了 A 站的 80 , rewrite 到 443 了`
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5790 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 112ms · UTC 02:14 · PVG 10:14 · LAX 19:14 · JFK 22:14
    ♥ Do have faith in what you're doing.