V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
awanabe
V2EX  ›  问与答

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

  •  
  •   awanabe · 2017-03-20 12:39:59 +08:00 · 2347 次点击
    这是一个创建于 2594 天前的主题,其中的信息可能已经有所发展或是发生改变。

    还原场景:

    • 我有一台服务器, 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 下面的不同域名前缀的网站呢?

    • 百思不得其解
    第 1 条附言  ·  2017-03-21 10:17:34 +08:00
    加上了 A 站的 80 , rewrite 到 443 了
    25 条回复    2017-03-21 10:17:26 +08:00
    binghe
        1
    binghe  
       2017-03-20 12:45:21 +08:00
    程序问题?
    wevsty
        2
    wevsty  
       2017-03-20 12:52:57 +08:00
    搜索关键词 nginx tls sni
    应该能帮到你
    awanabe
        3
    awanabe  
    OP
       2017-03-20 12:53:08 +08:00 via iPhone
    @binghe 不是,简单判定下来就是 nginx 切换了目标网站
    mingyi0
        4
    mingyi0  
       2017-03-20 12:58:59 +08:00
    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
       2017-03-20 13:41:43 +08:00
    @mingyi0 不应该有 域名限制么?
    awanabe
        6
    awanabe  
    OP
       2017-03-20 13:49:23 +08:00
    @wevsty 好像不是你说的这个问题。。
    mingyi0
        7
    mingyi0  
       2017-03-20 14:34:25 +08:00
    @awanabe 没有限制吧,比如你通过 IP 访问,现在默认也会跳到 B 站吧,可以看看文档: http://nginx.org/en/docs/http/server_names.html
    msg7086
        8
    msg7086  
       2017-03-20 15:15:20 +08:00
    Nginx 下需要让一个网站同时监听 80 和 443 。你看看你是不是把 A 站里 80 端口监听去掉了。
    msg7086
        9
    msg7086  
       2017-03-20 15:17:07 +08:00
    如果你需要 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
       2017-03-20 15:21:14 +08:00
    @msg7086 是去掉了 A 站的 listen80 , 现在已经加上了 A 站的 80 , rewrite 到 443 了。
    msg7086
        11
    msg7086  
       2017-03-20 15:22:53 +08:00
    @awanabe 如果将来一直用 HTTPS 访问的话,也可以顺手加上 HSTS ,这样就可以避免额外的跳转了。
    awanabe
        12
    awanabe  
    OP
       2017-03-20 15:24:38 +08:00
    @mingyi0
    @msg7086
    问题是, 我以前配置多 servername 的时候,一般去掉 IP 的 listen80 , 防止 IP 被访问。
    一般设置有 ip 会配置, default 选项, 是的流量在找不到 servername 的时候默认走 ip
    只是我两个配置都没有 default , 也没有 ip default 配置, 那逻辑上应该每一个进来的 servername 都去找对应的配置,否则就 504 才对吧?
    msg7086
        13
    msg7086  
       2017-03-20 15:30:46 +08:00
    @awanabe 504 是什么鬼。
    要防止 IP 被访问的话,是要单独给 server_name 配一个 default 然后 return 403 之类的。
    去掉 listen 80 的话,当然会漏给其他虚拟主机了。
    ETiV
        14
    ETiV  
       2017-03-20 15:32:13 +08:00 via iPhone
    通常这么多人在回复但还没有解决问题,一般是 LZ 问题描述的不好

    要不直接上配置吧
    awanabe
        15
    awanabe  
    OP
       2017-03-20 15:41:34 +08:00
    @ETiV 又不是解决问题, 解决问题我早就搞定了, 一句话加上 rewrite 就行。
    只是不懂 nginx 的 default server 规则。 所以你懂么?
    awanabe
        16
    awanabe  
    OP
       2017-03-20 15:43:36 +08:00
    @msg7086 手滑,应该是 502 bad gateway 的错误才对吧?
    403 是没有权限才对
    5xx 是 server 内部错误
    awanabe
        17
    awanabe  
    OP
       2017-03-20 15:44:49 +08:00
    @msg7086 那我的理解, 就是当 listen80 只有一个的时候其实就是 default server 了。。这个有点坑, 很容易就踩进去了。 本来以为 server name 就是用来去强制隔离的
    msg7086
        18
    msg7086  
       2017-03-20 15:46:51 +08:00
    @awanabe 502 只有在 proxy_pass 的对象无法访问的时候才会出现。
    你这种情况要炸也只会炸 500 。
    这里 Nginx 找不到匹配的 server_name ,也没有 default 的情况下,默认是漏给第一个 server 块(也即意味着第一个块是 catch-all 块)。你网站上只有 A 和 B ,没了 A ,这个端口上只剩 B ,当然就漏去 B 了。
    awanabe
        19
    awanabe  
    OP
       2017-03-20 16:07:04 +08:00
    @msg7086 嗯,应该就是这样的规则,踩了坑,所以做切换还是提醒自己,把 http rewrite 到 https 上去
    lan894734188
        20
    lan894734188  
       2017-03-20 16:14:03 +08:00 via Android
    https 要设成监听 80 443
    Joway
        21
    Joway  
       2017-03-20 18:48:05 +08:00
    ... 我还把网址给点进去了
    awanabe
        22
    awanabe  
    OP
       2017-03-20 22:07:01 +08:00 via iPhone
    @Joway xxx 是色情网站 哈哈哈我就是老司机
    LevineChen
        23
    LevineChen  
       2017-03-21 00:31:39 +08:00 via iPhone
    看看是不是 index 后面没有加;号
    uzumaki
        24
    uzumaki  
       2017-03-21 03:37:16 +08:00 via Android
    lz 你需要个 linux 面板 在慢慢测试 修改问题
    awanabe
        25
    awanabe  
    OP
       2017-03-21 10:17:26 +08:00
    @LevineChen 挂 uwsgi 没有 index 选项,已经解决了 。
    `加上了 A 站的 80 , rewrite 到 443 了`
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2837 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:12 · PVG 23:12 · LAX 08:12 · JFK 11:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.